Typescript: ํด๋ž˜์Šค์—์„œ ์ •์  '๊ธธ์ด'ํ•จ์ˆ˜๋ฅผ ์ •์˜ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์— ๋งŒ๋“  2014๋…„ 08์›” 12์ผ  ยท  22์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: microsoft/TypeScript

๋‹ค์Œ 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 ์—์„œ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

Bug Fixed good first issue help wanted

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

ํ•œํŽธ 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์˜ ๊ตฌ์„ฑ ๊ฐ€๋Šฅ์„ฑ ์ฐธ์กฐ).

์š”์•ฝํ•˜์ž๋ฉด์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ๋‚˜์˜ ๊ฒฌํ•ด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • compile-target es3 Object.defineProperty() ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. Object.defineProperty ์—†์œผ๋ฉด ES5 ํ™˜๊ฒฝ์—์„œ ES3 ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์ฝ๊ธฐ ์ „์šฉ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋Œ€์ƒ es3 ๋Œ€ํ•œ ์ปดํŒŒ์ผ ์˜ค๋ฅ˜๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
  • compile-target es5 writable: true ๋Œ€ํ•ด Object.defineProperty() ๋ฐ writable: true ๋กœ ์ปดํŒŒ์ผํ•˜๊ณ  ์ด๋Ÿฌํ•œ ์†์„ฑ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ธŒ๋ผ์šฐ์ €์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒฝ๊ณ  / ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. x of version <= y ์ด๋Ÿฌํ•œ ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์ง€์›ํ•ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ ๊ฐ€์žฅ ์•ˆ์ „ํ•œ ์˜ต์…˜์€ ๋‹ค๋ฅธ ์ด๋ฆ„์„ ์„ ํƒํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  • ์‚ฌ๋žŒ๋“ค์ด ์†์„ฑ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์ ˆ๋Œ€ ์›ํ•˜์ง€ ์•Š์œผ๋ฉด ๋‘ ๋Œ€์ƒ ์ค‘ ํ•˜๋‚˜์— ๋Œ€ํ•ด ์ปดํŒŒ์ผ ์˜ค๋ฅ˜๋ฅผ ์ƒ์„ฑํ•˜์‹ญ์‹œ์˜ค.

์ปดํŒŒ์ผ ์ถœ๋ ฅ์— ๊ด€๊ณ„์—†์ด ์–ด๋–ค ์ข…๋ฅ˜์˜ ์ถ”๊ฐ€ ๋ฉ”์‹œ์ง€๋ผ๋„ ์ปดํŒŒ์ผ๋Ÿฌ ์ถœ๋ ฅ์˜ ์ž ์žฌ์  ์ธ ๋ฌธ์ œ์— ๋Œ€ํ•œ ํžŒํŠธ๊ฐ€ ์ „ํ˜€์—†๋Š” ์˜ค๋Š˜๋‚  (TS 1.8.10) ์ƒํ™ฉ๋ณด๋‹ค ๋‚ซ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

ํŽธ์ง‘ : Snipped ์ถ”๊ฐ€

๋ชจ๋“  22 ๋Œ“๊ธ€

๋‚˜๋Š” ์ตœ๊ทผ์— ์ด๊ฒƒ์„ ๋งŒ๋‚ฌ๋‹ค. :(

๋˜ํ•œ ๋ช‡ ๊ฐ€์ง€ ๋‹ค๋ฅธ ์ฝ”๋“œ๋Š” ํ—ˆ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ ์ฝ”๋“œ๋Š” ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค (์ด ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ).

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์˜ ๊ตฌ์„ฑ ๊ฐ€๋Šฅ์„ฑ ์ฐธ์กฐ).

์š”์•ฝํ•˜์ž๋ฉด์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ๋‚˜์˜ ๊ฒฌํ•ด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • compile-target es3 Object.defineProperty() ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. Object.defineProperty ์—†์œผ๋ฉด ES5 ํ™˜๊ฒฝ์—์„œ ES3 ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์ฝ๊ธฐ ์ „์šฉ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋Œ€์ƒ es3 ๋Œ€ํ•œ ์ปดํŒŒ์ผ ์˜ค๋ฅ˜๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
  • compile-target 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์ด ์ด์ „์— ์ถœ์‹œ ๋  ๊ฒƒ์ด ๋‘๋ ต๋‹ค๋Š” ์ ์„ ์ธ์ •ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰