Typescript: НСвозмоТно ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΡΡ‚Π°Ρ‚ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π΄Π»ΠΈΠ½Ρ‹ Π² классС

Π‘ΠΎΠ·Π΄Π°Π½Π½Ρ‹ΠΉ Π½Π° 12 Π°Π²Π³. 2014  Β·  22ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ  Β·  Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: microsoft/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 ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π½Π°Π±Π»ΡŽΠ΄Π°Ρ‚ΡŒ для собствСнных Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΉ, Ρ‡Ρ‚ΠΎ свойства доступны для записи Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ конструктора ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π· ΠΌΡ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠ»ΠΈ любой ΠΈΠ· Π½ΠΈΡ… ΠΊΠ°ΠΊ статичСский Ρ‡Π»Π΅Π½ класса (ΠΈΠ·-Π·Π° этого Π½Π΅ ΡΡ‚Π΅ΡΠ½ΡΠΉΡ‚Π΅ΡΡŒ ΠΏΡ€ΠΎΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ ΠΈΠ»ΠΈ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΌΠΎΠΈ Π½Π΅Π΄Π°Π²Π½ΠΈΠ΅ прСдупрСТдСния Π² MDN ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ опасных ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ ΠΎ Function.name для получСния ΠΈΠΌΠ΅Π½ΠΈ класса).

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, использованиС Object.defineProperty ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠ΅ @ nicolo-ribaudo, Ρ‚ΠΎΡ‡Π½ΠΎ ΠΈΠΌΠΈΡ‚ΠΈΡ€ΡƒΠ΅Ρ‚ собствСнноС ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅. Π‘Π»Π΅Π΄ΡƒΠ΅Ρ‚ ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π±ΠΎΠ»Π΅Π΅ старых, Π½ΠΎ совмСстимых с ES5 вСрсиях Π±Ρ€Π°ΡƒΠ·Π΅Ρ€ΠΎΠ² для свойств Π·Π°Π΄Π°Π½ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ configurable: false . ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ° ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΈΡ… writable: true для Π½ΠΈΡ… Π½Π΅ удастся (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, см. Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ настройки Function.name )

Подводя ΠΈΡ‚ΠΎΠ³, ΠΌΠΎΠΉ взгляд Π½Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ Π±Ρ‹Π» ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ:

  • ΠœΡ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Object.defineProperty() для Ρ†Π΅Π»ΠΈ компиляции es3 . Однако Π±Π΅Π· Object.defineProperty запуск ΠΊΠΎΠ΄Π° ES3 Π² срСдС ES5 столкнулся Π±Ρ‹ с ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΎΠΉ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для чтСния. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π½Π°ΠΌ Π½ΡƒΠΆΠ½Π° ошибка компиляции для Ρ†Π΅Π»ΠΈ es3
  • скомпилируйтС Π΅Π³ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Object.defineProperty() ΠΈ writable: true для Ρ†Π΅Π»ΠΈ компиляции es5 ΠΈ Π²Ρ‹Π΄Π°ΠΉΡ‚Π΅ ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ / ΠΎΡˆΠΈΠ±ΠΊΡƒ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ использованиС этих ΠΈΠΌΠ΅Π½ свойств ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ ошибки Π² Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π°Ρ… x of version <= y прСдлагая Ρ‡Ρ‚ΠΎ, Ссли эти Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒΡΡ, самым бСзопасным Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠΌ Π±Ρ‹Π»ΠΎ Π±Ρ‹ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΎΠ΅ имя.
  • Ссли Π²Ρ‹ Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎ Π½Π΅ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ люди использовали свойства, сгСнСрируйтС ΠΎΡˆΠΈΠ±ΠΊΡƒ компиляции для любой Ρ†Π΅Π»ΠΈ.

НСзависимо ΠΎΡ‚ Π²Ρ‹Π²ΠΎΠ΄Π° компиляции, я Π΄ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ любоС Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ сообщСниС Π±Ρ‹Π»ΠΎ Π±Ρ‹ Π»ΡƒΡ‡ΡˆΠ΅, Ρ‡Π΅ΠΌ Π½Ρ‹Π½Π΅ΡˆΠ½ΡΡ ситуация (TS 1.8.10), ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ Π½Π΅ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… подсказок ΠΎ ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°Ρ… с Π²Ρ‹Π²ΠΎΠ΄ΠΎΠΌ компилятора.

Π˜Π·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ : Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚

ВсС 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 , это Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ

Если ΠΈΡ… Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ пСрСнСсти Π±Π΅Π· риска, ΠΌΠΎΠΆΠ΅Ρ‚, стоит ΠΈΡ… просто Π·Π°ΠΏΡ€Π΅Ρ‚ΠΈΡ‚ΡŒ?

Если ΠΈΡ… Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ пСрСнСсти Π±Π΅Π· риска, ΠΌΠΎΠΆΠ΅Ρ‚, стоит ΠΈΡ… просто Π·Π°ΠΏΡ€Π΅Ρ‚ΠΈΡ‚ΡŒ?

Π’ΠΎΡ‡Π½ΠΎ Π½Π΅ мСняю транспайл, просто дСлаю ΠΎΡˆΠΈΠ±ΠΊΡƒ компиляции: rose:

[...] ΠΌΠΎΠΆΠ΅Ρ‚, стоит ΠΈΡ… просто Π·Π°ΠΏΡ€Π΅Ρ‚ΠΈΡ‚ΡŒ?

Какой-Π½ΠΈΠ±ΡƒΠ΄ΡŒ ΠΏΡ€Π΅Π΄ΠΏΡ€ΠΈΠΈΠΌΡ‡ΠΈΠ²Ρ‹ΠΉ Π΄Π΅Π²Π΅Π»ΠΎΠΏΠ΅Ρ€ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΡ€ΠΈΡΠ»Π°Ρ‚ΡŒ Π½Π°ΠΌ ΠΏΠΈΠ°Ρ€! :ΠΏΠΎΠ΄ΠΌΠΈΠ³ΠΈΠ²Π°Π½ΠΈΠ΅:

ΠŸΠΎΡ‡Π΅ΠΌΡƒ Π±Ρ‹ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ 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 Π­Ρ‚ΠΎ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚. МоС ΠΌΠ½Π΅Π½ΠΈΠ΅: Π½ΠΎ я Π±Ρ‹ ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡Π΅Π» ΠΎΡˆΠΈΠ±ΠΊΡƒ Ρ‚Π°ΠΊΠΎΠΉ транспилС. TypeScript ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ склоняСтся ΠΊ изящной ошибкС вмСсто исправлСния JavaScript_: rose:

TypeScript ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ склоняСтся ΠΊ изящной ошибкС вмСсто исправлСния JavaScript.

Π Π°Π·Π²Π΅ Π½Π΅ вся идСя TS состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ JS, Π·Π°ΠΏΠΎΠ»Π½ΠΈΠ² ΠΏΡ€ΠΎΠ±Π΅Π»Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ½ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ смоТСт.

Π Π°Π·Π²Π΅ Π½Π΅ вся идСя TS состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ JS, Π·Π°ΠΏΠΎΠ»Π½ΠΈΠ² ΠΏΡ€ΠΎΠ±Π΅Π»Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ½ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ смоТСт.

Π”Π°. Но понимая, ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ JavaScript. Π’ΠΎΠ·ΡŒΠΌΠ΅ΠΌ, ΠΊ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ, null ΠΈ undefined . TypeScript ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡ΠΈΡ‚Π°Π΅Ρ‚ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ ΠΎΠ±Π° (вмСсто Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΡΡ‚ΡŒ Π΅Π³ΠΎ Π² ΠΎΠ΄Π½Ρƒ Π²Π΅Ρ‰ΡŒ, ΠΊΠ°ΠΊ это Π΄Π΅Π»Π°Π΅Ρ‚ Dart https://www.dartlang.org/docs/synonyms/). TypeScript Π²Ρ‹Π΄Π°Π΅Ρ‚ ошибки (вмСсто исправлСния Π² транспилС), Ссли Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ шаблон JavaScript: rose:

МоС ΠΌΠ½Π΅Π½ΠΈΠ΅ - ΠΌΠΎΠ΅ собствСнноС ΠΈ Π½Π΅ ΠΏΠΎΠ΄Ρ‚Π²Π΅Ρ€ΠΆΠ΄Π΅Π½ΠΎ Π½ΠΈΠΊΠ΅ΠΌ, ΠΊΡ€ΠΎΠΌΠ΅ мСня: rose:

ΠœΠ΅ΠΆΠ΄Ρƒ Ρ‚Π΅ΠΌ, встроСнная ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° 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 ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π½Π°Π±Π»ΡŽΠ΄Π°Ρ‚ΡŒ для собствСнных Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΉ, Ρ‡Ρ‚ΠΎ свойства доступны для записи Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ конструктора ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π· ΠΌΡ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠ»ΠΈ любой ΠΈΠ· Π½ΠΈΡ… ΠΊΠ°ΠΊ статичСский Ρ‡Π»Π΅Π½ класса (ΠΈΠ·-Π·Π° этого Π½Π΅ ΡΡ‚Π΅ΡΠ½ΡΠΉΡ‚Π΅ΡΡŒ ΠΏΡ€ΠΎΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ ΠΈΠ»ΠΈ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΌΠΎΠΈ Π½Π΅Π΄Π°Π²Π½ΠΈΠ΅ прСдупрСТдСния Π² MDN ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ опасных ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ ΠΎ Function.name для получСния ΠΈΠΌΠ΅Π½ΠΈ класса).

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, использованиС Object.defineProperty ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠ΅ @ nicolo-ribaudo, Ρ‚ΠΎΡ‡Π½ΠΎ ΠΈΠΌΠΈΡ‚ΠΈΡ€ΡƒΠ΅Ρ‚ собствСнноС ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅. Π‘Π»Π΅Π΄ΡƒΠ΅Ρ‚ ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π±ΠΎΠ»Π΅Π΅ старых, Π½ΠΎ совмСстимых с ES5 вСрсиях Π±Ρ€Π°ΡƒΠ·Π΅Ρ€ΠΎΠ² для свойств Π·Π°Π΄Π°Π½ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ configurable: false . ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ° ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΈΡ… writable: true для Π½ΠΈΡ… Π½Π΅ удастся (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, см. Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ настройки Function.name )

Подводя ΠΈΡ‚ΠΎΠ³, ΠΌΠΎΠΉ взгляд Π½Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ Π±Ρ‹Π» ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ:

  • ΠœΡ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Object.defineProperty() для Ρ†Π΅Π»ΠΈ компиляции es3 . Однако Π±Π΅Π· Object.defineProperty запуск ΠΊΠΎΠ΄Π° ES3 Π² срСдС ES5 столкнулся Π±Ρ‹ с ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΎΠΉ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для чтСния. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π½Π°ΠΌ Π½ΡƒΠΆΠ½Π° ошибка компиляции для Ρ†Π΅Π»ΠΈ es3
  • скомпилируйтС Π΅Π³ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Object.defineProperty() ΠΈ writable: true для Ρ†Π΅Π»ΠΈ компиляции es5 ΠΈ Π²Ρ‹Π΄Π°ΠΉΡ‚Π΅ ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ / ΠΎΡˆΠΈΠ±ΠΊΡƒ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ использованиС этих ΠΈΠΌΠ΅Π½ свойств ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ ошибки Π² Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π°Ρ… x of version <= y прСдлагая Ρ‡Ρ‚ΠΎ, Ссли эти Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒΡΡ, самым бСзопасным Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠΌ Π±Ρ‹Π»ΠΎ Π±Ρ‹ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΎΠ΅ имя.
  • Ссли Π²Ρ‹ Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎ Π½Π΅ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ люди использовали свойства, сгСнСрируйтС ΠΎΡˆΠΈΠ±ΠΊΡƒ компиляции для любой Ρ†Π΅Π»ΠΈ.

НСзависимо ΠΎΡ‚ Π²Ρ‹Π²ΠΎΠ΄Π° компиляции, я Π΄ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ любоС Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ сообщСниС Π±Ρ‹Π»ΠΎ Π±Ρ‹ Π»ΡƒΡ‡ΡˆΠ΅, Ρ‡Π΅ΠΌ Π½Ρ‹Π½Π΅ΡˆΠ½ΡΡ ситуация (TS 1.8.10), ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ Π½Π΅ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… подсказок ΠΎ ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°Ρ… с Π²Ρ‹Π²ΠΎΠ΄ΠΎΠΌ компилятора.

Π˜Π·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ : Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚

@RyanCavanaugh : Π½Π΅ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ Π²Ρ‹ Π΅Ρ‰Π΅ Ρ€Π°Π· Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒΡΡ ΠΊ этому вопросу для Π²Π΅Ρ…ΠΈ TS 2.0.1. РСшСниС каТСтся простым, Π½ΠΎ Π² зависимости ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊΠΎΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ Π²Ρ‹ Π²Ρ‹Π±Π΅Ρ€Π΅Ρ‚Π΅, Π²Ρ‹Ρ…ΠΎΠ΄ эмиттСра ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ (см. Мой ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠΉ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ). Π’ Ρ‚Π°ΠΊΠΎΠΌ случаС, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π»ΡƒΡ‡ΡˆΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ исправлСниС Π² выпуск TS 2.0.

Π’Π΅Π³ΠΈ Π² PR ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Π° TypeScript, ΠΈΠΌΠ΅ΡŽΡ‰Π°Ρ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½Ρ‹Π΅ рСсурсы, оставляСт это ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΌ для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ сообщСства. Если Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ эту ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ, ΠΊΡ‚ΠΎ-Ρ‚ΠΎ ΠΈΠ· Π±ΠΎΠ»Π΅Π΅ ΡˆΠΈΡ€ΠΎΠΊΠΎΠ³ΠΎ сообщСства Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°Π½ΡΡ‚ΡŒΡΡ Сю Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° основная ΠΊΠΎΠΌΠ°Π½Π΄Π° TypeScript Π½Π΅ почувствуСт, Ρ‡Ρ‚ΠΎ Ρƒ Π½ΠΈΡ… достаточно мСста Π² бэклогС, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π΅Π΅ Π² выпуск (Ρ‡Ρ‚ΠΎ, вСроятно, Π·Π°ΠΉΠΌΠ΅Ρ‚ ΠΌΠ½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ).

@kitsonk Бпасибо, Ρ‡Ρ‚ΠΎ объяснили этикСтку PR. Π”ΡƒΠΌΠ°ΡŽ, я это понял. Π― ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠΈΠ» Π΅Ρ‰Π΅ Ρ€Π°Π· ΠΎΡ†Π΅Π½ΠΈΡ‚ΡŒ, являСтся Π»ΠΈ это ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΌ способом Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹. Бвойства статичСского класса, Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹Π΅ _name_ ΠΈΠ»ΠΈ _length_, Π½Π΅ Ρ‚Π°ΠΊ маловСроятны, ΠΈ TS Π²Ρ‹Π΄Π°Π΅Ρ‚ для этого ΠΎΡˆΠΈΠ±ΠΎΡ‡Π½Ρ‹ΠΉ Π²Ρ‹Π²ΠΎΠ΄. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, я Π±Ρ‹ Π΄Π°ΠΆΠ΅ Π½Π΅ Π½Π°Π·Ρ‹Π²Π°Π» ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ Β«ΠΊΡ€Π°ΠΉΠ½ΠΈΠΌ случаСм».

Π― ΡΡ‡ΠΈΡ‚Π°ΡŽ, Ρ‡Ρ‚ΠΎ статичСскиС свойства Π»Π΅ΠΆΠ°Ρ‚ Π² основС языка, ΠΈ Π΄Π°ΠΆΠ΅ Ссли Π΅Ρ‰Π΅ Π½Π΅Ρ‚ запросов Π½Π° вытягиваниС, Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ Π±Ρ‹Π»ΠΈ прСдставлСны Π² этом ΠΏΠΎΡ‚ΠΎΠΊΠ΅.

Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, я ΠΎΡ†Π΅Π½ΡŽ, смогу Π»ΠΈ я ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ PR, Π½ΠΎ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΡ€ΠΈΠ·Π½Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ я Π΅Ρ‰Π΅ Π½Π΅ Π½Π°ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ…ΠΎΡ€ΠΎΡˆΠΎ освСдомлСн ΠΎΠ± источниках TS ΠΈ боюсь, Ρ‡Ρ‚ΠΎ TS 2.0 Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΡƒΡ‰Π΅Π½ Ρ€Π°Π½ΡŒΡˆΠ΅.

Π‘Ρ‹Π»Π° Π»ΠΈ эта страница ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ?
0 / 5 - 0 Ρ€Π΅ΠΉΡ‚ΠΈΠ½Π³ΠΈ