๋ค์ typescript ํ๋ก๊ทธ๋จ์ด ํ์ฉ๋ฉ๋๋ค.
class C {
static length () { return "twelve"; }
}
๊ทธ๋ฌ๋ ์์ฑ ๋ ์ฝ๋์์ :
var C = (function () {
function C() {
}
C.length = function () {
return "twelve";
};
return C;
})();
์ฌ๊ธฐ์๋ ํจ์์ length
์์ฑ์ ํ ๋นํ๋ ค๊ณ ํฉ๋๋ค. ์ด๊ฒ์ ์๋ํ์ง ์์ต๋๋ค (์ ์ด๋ Firefox ๋ฐ Chrome์์๋), C.length()
์ ํ์ ํธ์ถ์ด ์ค๋จ๋ฉ๋๋ค. ์๋ง๋ ์ ์ ํด๋์ค ํจ์ length
ํธ์ถ์ ํ์ฉ๋์ง ์์์ผํฉ๋๊น?
codeplex ๋ฌธ์ # 1260 ์์ ๋ง์ด๊ทธ๋ ์ด์ ๋์์ต๋๋ค.
๋๋ ์ต๊ทผ์ ์ด๊ฒ์ ๋ง๋ฌ๋ค. :(
๋ํ ๋ช ๊ฐ์ง ๋ค๋ฅธ ์ฝ๋๋ ํ์ฉ๋์ง ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ๋ค์ ์ฝ๋๋ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค (์ด ๊ธฐ๋ฅ์ ์ํํ๋ ๊ฒฝ์ฐ).
class C {
static name = 'something';
static arguments = 'args';
static caller = 'caller';
}
console.log(C.name); // 'C'
console.log(C.arguments); // null
console.log(C.caller); // null
๊ทธ๋ฌ๋ ์ด๋ค ๋ชจ๋๊ฐ ํ์ค์ ์ธ ๊ฒ์ ์๋๋๋ค.
name
, caller
๋ฐ length
์์ฑ์ ์ฌ์ฉํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ฝ๊ธฐ ์ ์ฉ ์์ฑ์ด๋ฉฐ ์ฌ์ ์ ํ ์ ์์ต๋๋ค. ๊ทธ๋ค์ ๋ํ ๋ชจ๋ ํ ๋น์ ๋ฌด์๋ฉ๋๋ค.
@tinganho ๋์
์ข์,ํ์ง๋ง ์ฌ๋๋ค์ ๋๋๋ก ์ด๋ฐ ์ข
๋ฅ์ ์ค๋ฅ๋ฅผ ํฌ์ฐฉํ๊ธฐ ๋๋ฌธ์ TS๊ฐ ๋ญ๊ฐ ์๋ชปํ ๊ฒ์ ๋ํด ์๋ ค ์ฃผ์ด์ผํ๋ค๊ณ ์๊ฐํฉ๋๋ค. name
๋๋ length
์ ๊ฐ์ ์์ฑ์ ๊ธฐ์ตํ๊ธฐ์ ๋๋ฌด ์์ฐ ์ค๋ฝ๊ธฐ ๋๋ฌธ์ ์ฌ๋๋ค์ด ๊ณ์ํด์ ๋ค์ ์ ์ํ๋ ค๊ณ ํ ๊ฒ์
๋๋ค.
๊ธธ์ด, ์ด๋ฆ์ด ์ด๋ฏธ ์ ์ ๋์๊ธฐ ๋๋ฌธ์ผ ์ ์์ต๋๋ค.
๋๋ ์ด๊ฒ์ ์๋ํ๊ณ ์์ ํ ๊ฒ์ ๋๋ค. ์ด๋ฏธ ์ธ๊ธ ํ ๊ฒ ์ธ์ ํ์ฉ๋์ง ์์์ผํ๋ ์์ฑ ์ด๋ฆ์ด ๋ ์์ต๋๊น?
์ง๊ธ๊น์ง ๋ด๊ฐ ๋ณธ๋ค.
๊ธธ์ด, ์ด๋ฆ, ์ธ์, ํธ์ถ์
๋๊ตฐ๊ฐ๊ฐ ๊ธ์ง ๋ ์ด๋ฆ ์ค ํ๋๋ก ์ ์ ์์ฑ์ ์ค์ ํ๋ ค๊ณ ํ ๋ ์ ํํ ์ด๋ป๊ฒ๋ฉ๋๊น? ์ปดํ์ผ๋ฌ ์ค๋ฅ? ์ฌ์ฉ์์๊ฒ ๋ณด์ด๋ ๊ฒฝ๊ณ ?
๋๋ ์ด๊ฒ์ ์ต์ํ์ง ์์ผ๋ฏ๋ก ๋ฌด์ธ๊ฐ๋ฅผ ๋์น๊ณ ์๋ค๋ฉด ์ฝ๊ฐ์ ์ง์นจ์ ์ฃผ์๋ฉด ๊ฐ์ฌํ๊ฒ ์ต๋๋ค. : +1 :
์ปดํ์ผํ์ง ์๋ ์ด์
class C {
static name = 'something';
static arguments = 'args';
static caller = 'caller';
}
console.log(C.name); // 'C'
console.log(C.arguments); // null
console.log(C.caller); // null
๊ฐ์ ๊ฒ์
var C = (function () {
function C() {
}
C.__statics = {
name: 'something',
arguments: 'args',
caller: 'caller'
};
return C;
})();
console.log(C.__statics.name); // 'something'
console.log(C.__statics.arguments); // 'args'
console.log(C.__statics.caller); // 'caller'
stackoverflow์์๋ ์ง๋ฌธ์ด ๋ํ๋ฌ์ต๋๋ค. http://stackoverflow.com/a/34644236/390330 : rose :
@zerkms ๋ ๊ณณ์ ๊ฐ์ ๋๊ธ์
๊ตฌ์กฐ์ ์ ํ ์์คํ ์์ ์์๋ก ์ด๋ฆ์ ์ฌ ์์ฑํ ์๋ ์์ต๋๋ค.
๋ค์๊ณผ ๊ฐ์ ์ฝ๋๋ฅผ ๊ณ ๋ คํ์ญ์์ค.
interface HasName {
name: string;
}
class Foo {
static name = 'fooClass';
}
let bar: HasName = { name: string };
let q = Math.random() > 0.5 ? Foo : bar;
console.log(q.name);
@RyanCavanaugh ๋ ์ฐธ์ผ๋ก ๊ณต์ ํ ์์ ๋๋ค (๋๋ TS์์ ๊ฐ๋ฐํ์ง๋ ์์ง๋ง ์ด๋ฐ ์ฝ๋๋ฅผ ์ ํจํ ๊ฒ์ผ๋ก ์ทจ๊ธํ์๋ง์ ์ ํ ์์คํ ์ด ์ด์ํฉ๋๋ค).
์ํ์์ด ํธ๋์ค ํ์ผ ํ ์ ์๋ค๋ฉด ๊ทธ๋ฅ ํ์ฉํ์ง ์๋ ๊ฒ์ด ์ข์๊น์?
์ํ์์ด ํธ๋์ค ํ์ผ ํ ์ ์๋ค๋ฉด ๊ทธ๋ฅ ํ์ฉํ์ง ์๋ ๊ฒ์ด ์ข์๊น์?
ํ์คํ transpile์ ๋ณ๊ฒฝํ์ง ์๊ณ ์ปดํ์ผ ์ค๋ฅ๋ก ๋ง๋ญ๋๋ค. : rose :
[...] ์๋ง๋ ์ฐ๋ฆฌ๋ ๊ทธ๋ค์ ๊ธ์งํด์ผํ ๊น์?
์ผ๋ถ ์ง์ทจ์ ์ธ ๊ฐ๋ฐ์๋ PR์ ๋ณด๋ด์ผํฉ๋๋ค! :๋์ง:
Object.defineProperty
์ฌ์ฉํ์ง ์๋ ์ด์ ๋ ๋ฌด์์
๋๊น?
์
class C {
static length() { return "twelve"; }
}
๋ค์๊ณผ ๊ฐ์ ๊ฒ์ผ๋ก ๋ณํ๋ฉ๋๋ค.
var C = (function () {
function C() {
}
Object.defineProperty(C, "length", {
value: function () { return "twelve"; },
writable: true
});
return C;
}());
@ nicolo-ribaudo ์ค์ ๋ก ์๋ํฉ๋๋ค. ๋ด ์๊ฒฌ :ํ์ง๋ง ๋ ์คํ๋ ค ์ค๋ฅ ๋์ ์ด๋ฌํ์ transpile๋ฅผ ๋ณผ ๊ฒ์ ๋๋ค. TypeScript๋ ์ผ๋ฐ์ ์ผ๋ก _fixing JavaScript_ : rose ๋์ ์ฐ์ํ ์ค๋ฅ์ชฝ์ ์์ต๋๋ค.
TypeScript๋ ์ผ๋ฐ์ ์ผ๋ก JavaScript๋ฅผ ์์ ํ๋ ๋์ ์ฐ์ํ ์ค๋ฅ์ ์์กดํฉ๋๋ค.
TS์ ์ ์ฒด์ ์ธ ์์ด๋์ด๋ ํ ์์๊ณ ํ ์์๋ ๊ฐ๊ฒฉ์ ์ฑ์์ JS๋ฅผ ์์ ํ๋ ๊ฒ์ ๋๋ค.
TS์ ์ ์ฒด์ ์ธ ์์ด๋์ด๋ ํ ์์๊ณ ํ ์์๋ ๊ฐ๊ฒฉ์ ์ฑ์์ JS๋ฅผ ์์ ํ๋ ๊ฒ์ ๋๋ค.
์. ๊ทธ๋ฌ๋ JavaScript์ ์๋ ๋ฐฉ์์ ์ดํดํจ์ผ๋ก์จ. null
๋ฐ undefined
์ ์๋ฅผ ๋ค์ด๋ณด์ญ์์ค. TypeScript๋ (Dart๊ฐ https://www.dartlang.org/docs/synonyms/์ ๊ฐ์ด ํ๋์ ๊ฒ์ผ๋ก ํตํฉํ๋ ๋์ ) ๋ ๊ฐ์ง๋ฅผ ๋ชจ๋ ์ดํดํ๊ธฐ๋ก ์ ํํ์ต๋๋ค. TypeScript๋ ์๋ชป๋ JavaScript ํจํด์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ (transpile์์ ์์ ํ๋ ๋์ ) ์ค๋ฅ๋ฅผ ์ ๊ณตํฉ๋๋ค.
๋ด ์๊ฒฌ์ ๋ด ์๊ฒฌ์ด๋ฉฐ ๋ ์ธ์๋ ๋๊ตฌ๋์ง์งํ์ง ์์ต๋๋ค.
ํํธ ES6 / 2015 ๊ธฐ๋ณธ ์ง์์ Chrome ๋ฐ Firefox์ ํฌํจ๋์์ต๋๋ค. ์ด๊ฒ์ด ๊ธฐ๋ณธ์ ์ผ๋ก ๋ฌธ์ ๋ฅผ ์ด๋ป๊ฒ ์ฒ๋ฆฌํ๋์ง ๊ด์ฐฐํ๋ฉด @ nicolo-ribaudo์ ์ ๊ฐ ์ ์ํ ๊ฒ๊ณผ ๋น์ทํฉ๋๋ค (# 9778 ์ฐธ์กฐ).
๊ธฐ๋ณธ ๋์์ ์ค๋ช ํ๋ ์ค ๋ํซ :
class Foo {
constructor() {}
}
class Bar {
static length() {}
static name() {}
static caller() {}
}
Foo.name = "FooChanged";
Bar.name = "Baz";
console.log(Foo.name) // Logs "Foo". Foo.name remains unwritable
console.log(Bar.name) // Logs "Baz". Bar.name became writable
@tinganho ๊ฐ name
, length
๋ฐ caller
์ ์ฝ๊ธฐ ์ ์ฉ์ ๋ํด ์ด์ ์ ์์ฑํ ๋ด์ฉ๊ณผ ๊ด๋ จํ์ฌ ๊ธฐ๋ณธ ๊ตฌํ์์ ์์ฑ์ด ์์ฑ์ ํจ์์ ํ ๋ฒ ์ธ ์ ์์์ ๊ด์ฐฐ ํ ์ ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ๋ ์ค ํ๋๋ฅผ ์ ์ ํด๋์ค ๋ฉค๋ฒ๋ก ์ ์ํ์ต๋๋ค (์ด ๋๋ฌธ์ ํด๋์ค ์ด๋ฆ์ ์ป๊ธฐ ์ํด Function.name
์ ๋ํ ์ํํ ๊ฐ์ ์ ๊ดํ MDN ์ ๋ํ
๋ฐ๋ผ์ @ nicolo-ribaudo๊ฐ ์ ์ํ๋๋ก Object.defineProperty
๋ฅผ ์ฌ์ฉํ๋ฉด ๋ค์ดํฐ๋ธ ๋์์ ์ ํํ๊ฒ ์๋ฎฌ๋ ์ด์
ํ ์ ์์ต๋๋ค. ๊ณ ๋ คํด์ผ ํ ์ฌํญ์ ์ด์ ์ ์ผ๋ถ ES5 ํธํ ๋ธ๋ผ์ฐ์ ๋ฒ์ ์ด ์์ฑ์ configurable: false
์ค์ ํ๋ค๋ ๊ฒ์
๋๋ค. ๋ฐ๋ผ์ writable: true
๋ก ๋ง๋ค๋ ค๊ณ ํ๋ฉด ์คํจํฉ๋๋ค (์ : Function.name์ ๊ตฌ์ฑ ๊ฐ๋ฅ์ฑ ์ฐธ์กฐ).
์์ฝํ์๋ฉด์ด ๋ฌธ์ ์ ๋ํ ๋์ ๊ฒฌํด๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
es3
Object.defineProperty()
๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. Object.defineProperty
์์ผ๋ฉด ES5 ํ๊ฒฝ์์ ES3 ์ฝ๋๋ฅผ ์คํํ๋ฉด ์ฝ๊ธฐ ์ ์ฉ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค. ๋ฐ๋ผ์ ๋์ es3
๋ํ ์ปดํ์ผ ์ค๋ฅ๊ฐ ํ์ํฉ๋๋ค.es5
writable: true
๋ํด Object.defineProperty()
๋ฐ writable: true
๋ก ์ปดํ์ผํ๊ณ ์ด๋ฌํ ์์ฑ ์ด๋ฆ์ ์ฌ์ฉํ๋ฉด ๋ธ๋ผ์ฐ์ ์์ ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ ์๋ค๋ ๊ฒฝ๊ณ / ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. x of version <= y
์ด๋ฌํ ๋ธ๋ผ์ฐ์ ๋ฅผ ์ง์ํด์ผํ๋ ๊ฒฝ์ฐ ๊ฐ์ฅ ์์ ํ ์ต์
์ ๋ค๋ฅธ ์ด๋ฆ์ ์ ํํ๋ ๊ฒ์
๋๋ค.์ปดํ์ผ ์ถ๋ ฅ์ ๊ด๊ณ์์ด ์ด๋ค ์ข ๋ฅ์ ์ถ๊ฐ ๋ฉ์์ง๋ผ๋ ์ปดํ์ผ๋ฌ ์ถ๋ ฅ์ ์ ์ฌ์ ์ธ ๋ฌธ์ ์ ๋ํ ํํธ๊ฐ ์ ํ์๋ ์ค๋๋ (TS 1.8.10) ์ํฉ๋ณด๋ค ๋ซ๋ค๊ณ ์๊ฐํฉ๋๋ค.
ํธ์ง : Snipped ์ถ๊ฐ
@RyanCavanaugh : ๋ง์ผ์คํค TS 2.0.1์ ๋ํด์ด ๋ฌธ์ ๋ฅผ ๋ค์ ๋ฐฉ๋ฌธํด ์ฃผ
PR์ ํ๊ทธ๋ ์ ํ๋ ๋ฆฌ์์ค๋ฅผ ๊ฐ์ง TypeScript ํ์ด์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ปค๋ฎค๋ํฐ์ ๊ณต๊ฐํ๊ณ ์์์ ๋ํ๋ ๋๋ค. ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ค๋ฉด ๋ ๋์ ์ปค๋ฎค๋ํฐ์ ๋๊ตฐ๊ฐ๊ฐ TypeScript ์ฝ์ด ํ์ด ๋ฐฑ ๋ก๊ทธ์ ์ถฉ๋ถํ ๊ณต๊ฐ์ด ์๋ค๊ณ ์๊ฐํ ๋๊น์ง ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด์ผํฉ๋๋ค (์ค๋ ์๊ฐ์ด ๊ฑธ๋ฆด ์ ์์).
@kitsonk ํ๋ณด ๋ผ๋ฒจ์ ์ค๋ช ํด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ๋๋ ๊ทธ๊ฒ์ ์ดํดํ๋ค๊ณ ์๊ฐํ๋ค. ๋ด๊ฐ ์ ์ํ ๊ฒ์ ์ฌ์ ํ โโ๋ฌธ์ ๋ฅผ ์ฒ๋ฆฌํ๋ ์ฌ๋ฐ๋ฅธ ๋ฐฉ๋ฒ์ธ์ง ์ฌํ๊ฐํ๋ ๊ฒ์ด ์์ต๋๋ค. _name_ ๋๋ _length_๋ผ๋ ์ ์ ํด๋์ค ์์ฑ์ ๋ฐ์ํ ๊ฐ๋ฅ์ฑ์ด ๊ฑฐ์ ์์ผ๋ฉฐ TS๋ ์ด์ ๋ํ ์ค๋ฅ ์ถ๋ ฅ์ ์์ฑํฉ๋๋ค. ๋ฐ๋ผ์ ๋๋ ๋ฌธ์ ์ "์์ง ์ผ์ด์ค"๋ผ๊ณ ๋ถ๋ฅด์ง๋ ์์ ๊ฒ์ ๋๋ค.
์ ์ ์์ฑ์ด ์ธ์ด์ ํต์ฌ์ด๋ผ๊ณ ์๊ฐํ๋ฉฐ ์์ง ํ ์์ฒญ์ด ์๋๋ผ๋ ๋ฌธ์ ์ ๋ํ ์๋ฃจ์ ์ด์ด ์ค๋ ๋์ ์ ์๋์์ต๋๋ค.
๊ทธ๋ผ์๋ ๋ถ๊ตฌํ๊ณ PR์ ์ ๊ณต ํ ์ ์๋์ง ํ๊ฐํ ๊ฒ์ด์ง๋ง TS ์์ค์ ๋ํด ์์ง ์ ์์ง ๋ชปํ๋ฉฐ TS 2.0์ด ์ด์ ์ ์ถ์ ๋ ๊ฒ์ด ๋๋ ต๋ค๋ ์ ์ ์ธ์ ํด์ผํฉ๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
ํํธ ES6 / 2015 ๊ธฐ๋ณธ ์ง์์ Chrome ๋ฐ Firefox์ ํฌํจ๋์์ต๋๋ค. ์ด๊ฒ์ด ๊ธฐ๋ณธ์ ์ผ๋ก ๋ฌธ์ ๋ฅผ ์ด๋ป๊ฒ ์ฒ๋ฆฌํ๋์ง ๊ด์ฐฐํ๋ฉด @ nicolo-ribaudo์ ์ ๊ฐ ์ ์ํ ๊ฒ๊ณผ ๋น์ทํฉ๋๋ค (# 9778 ์ฐธ์กฐ).
๊ธฐ๋ณธ ๋์์ ์ค๋ช ํ๋ ์ค ๋ํซ :
@tinganho ๊ฐ
name
,length
๋ฐcaller
์ ์ฝ๊ธฐ ์ ์ฉ์ ๋ํด ์ด์ ์ ์์ฑํ ๋ด์ฉ๊ณผ ๊ด๋ จํ์ฌ ๊ธฐ๋ณธ ๊ตฌํ์์ ์์ฑ์ด ์์ฑ์ ํจ์์ ํ ๋ฒ ์ธ ์ ์์์ ๊ด์ฐฐ ํ ์ ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ๋ ์ค ํ๋๋ฅผ ์ ์ ํด๋์ค ๋ฉค๋ฒ๋ก ์ ์ํ์ต๋๋ค (์ด ๋๋ฌธ์ ํด๋์ค ์ด๋ฆ์ ์ป๊ธฐ ์ํดFunction.name
์ ๋ํ ์ํํ ๊ฐ์ ์ ๊ดํ MDN ์ ๋ํ๋ฐ๋ผ์ @ nicolo-ribaudo๊ฐ ์ ์ํ๋๋ก
Object.defineProperty
๋ฅผ ์ฌ์ฉํ๋ฉด ๋ค์ดํฐ๋ธ ๋์์ ์ ํํ๊ฒ ์๋ฎฌ๋ ์ด์ ํ ์ ์์ต๋๋ค. ๊ณ ๋ คํด์ผ ํ ์ฌํญ์ ์ด์ ์ ์ผ๋ถ ES5 ํธํ ๋ธ๋ผ์ฐ์ ๋ฒ์ ์ด ์์ฑ์configurable: false
์ค์ ํ๋ค๋ ๊ฒ์ ๋๋ค. ๋ฐ๋ผ์writable: true
๋ก ๋ง๋ค๋ ค๊ณ ํ๋ฉด ์คํจํฉ๋๋ค (์ : Function.name์ ๊ตฌ์ฑ ๊ฐ๋ฅ์ฑ ์ฐธ์กฐ).์์ฝํ์๋ฉด์ด ๋ฌธ์ ์ ๋ํ ๋์ ๊ฒฌํด๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
es3
Object.defineProperty()
๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.Object.defineProperty
์์ผ๋ฉด ES5 ํ๊ฒฝ์์ ES3 ์ฝ๋๋ฅผ ์คํํ๋ฉด ์ฝ๊ธฐ ์ ์ฉ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค. ๋ฐ๋ผ์ ๋์es3
๋ํ ์ปดํ์ผ ์ค๋ฅ๊ฐ ํ์ํฉ๋๋ค.es5
writable: true
๋ํดObject.defineProperty()
๋ฐwritable: true
๋ก ์ปดํ์ผํ๊ณ ์ด๋ฌํ ์์ฑ ์ด๋ฆ์ ์ฌ์ฉํ๋ฉด ๋ธ๋ผ์ฐ์ ์์ ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ ์๋ค๋ ๊ฒฝ๊ณ / ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.x of version <= y
์ด๋ฌํ ๋ธ๋ผ์ฐ์ ๋ฅผ ์ง์ํด์ผํ๋ ๊ฒฝ์ฐ ๊ฐ์ฅ ์์ ํ ์ต์ ์ ๋ค๋ฅธ ์ด๋ฆ์ ์ ํํ๋ ๊ฒ์ ๋๋ค.์ปดํ์ผ ์ถ๋ ฅ์ ๊ด๊ณ์์ด ์ด๋ค ์ข ๋ฅ์ ์ถ๊ฐ ๋ฉ์์ง๋ผ๋ ์ปดํ์ผ๋ฌ ์ถ๋ ฅ์ ์ ์ฌ์ ์ธ ๋ฌธ์ ์ ๋ํ ํํธ๊ฐ ์ ํ์๋ ์ค๋๋ (TS 1.8.10) ์ํฉ๋ณด๋ค ๋ซ๋ค๊ณ ์๊ฐํฉ๋๋ค.
ํธ์ง : Snipped ์ถ๊ฐ