Typescript: рд╕реБрдЭрд╛рд╡: рдПрдХреНрд╕реЗрд╕рд░реНрд╕ рдХреЛ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреНрд░рд╛рдкреНрдд/рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 26 рдорд╛рд░реНрдЪ 2015  ┬╖  125рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: microsoft/TypeScript

рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдПрдХреНрд╕реЗрд╕рд░реНрд╕ рдХреЛ рдПрдХ рд╣реА рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рдкреНрдд/рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреА рд╡рд░реНрддрдорд╛рди рдмрд╛рдзрд╛ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдерд╛ред рдпрд╣ рдЗрд╕ рддрд░рд╣ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдорджрджрдЧрд╛рд░ рд╣реЛрдЧрд╛:

class MyClass {

    private _myDate: moment.Moment;

    get myDate(): moment.Moment {
        return this._myDate;
    }

    set myDate(value: Date | moment.Moment) {
        this._myDate = moment(value);
    }
}

рд╡рд░реНрддрдорд╛рди рдореЗрдВ, рдпрд╣ рд╕рдВрднрд╡ рдирд╣реАрдВ рд▓рдЧрддрд╛ рд╣реИ, рдФрд░ рдореБрдЭреЗ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рдХрд╛ рд╕рд╣рд╛рд░рд╛ рд▓реЗрдирд╛ рд╣реЛрдЧрд╛:

class MyClass {

    private _myDate: moment.Moment;

    get myDate(): moment.Moment {
        return this._myDate;
    }

    set myDate(value: moment.Moment) {
        assert.fail('Setter for myDate is not available. Please use: setMyDate() instead');
    }

    setMyDate(value: Date | moment.Moment) {
        this._myDate = moment(value);
    }
}

рдпрд╣ рдЖрджрд░реНрд╢ рд╕реЗ рдмрд╣реБрдд рджреВрд░ рд╣реИ, рдФрд░ рдпрджрд┐ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рдЕрдиреБрдорддрд┐ рджреА рдЬрд╛рдПрдЧреА рддреЛ рдХреЛрдб рдЕрдзрд┐рдХ рд╕рд╛рдл рд╣реЛрдЧрд╛ред

рдзрдиреНрдпрд╡рд╛рдж!

Design Limitation Suggestion Too Complex

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдПрдХ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЧреЗрдЯрд░ рдФрд░ рд╕реЗрдЯрд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдорд╛рдиреНрдп рд╣реИ рдФрд░ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рдпрд╣ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рдореБрдЦреНрдп рд▓рд╛рдн/рдЙрджреНрджреЗрд╢реНрдп рд╣реИред рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдЦреБрд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ setMyDate() рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рдЗрд╕реЗ рдмрд░реНрдмрд╛рдж рдХрд░ рджреЗрддрд╛ рд╣реИред

рд╢реБрджреНрдз рдЬреЗрдПрд╕ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреА рд╕реЛрдЪреЗрдВ рдЬреЛ рдЗрд╕ рдкреИрдЯрд░реНрди рдХрд╛ рдкрд╛рд▓рди рдХрд░реЗрдВрдЧреЗ: .d.ts рдХреЛ рдПрдХ рд╕рдВрдШ рдпрд╛ any рдХрд╛ рдЦреБрд▓рд╛рд╕рд╛ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдПрдХреНрд╕реЗрд╕рд░реНрд╕ .d.ts рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп рдЧреБрдгреЛрдВ рд╕реЗ рднрд┐рдиреНрди рд░реВрдк рд╕реЗ рд╕рд╛рдордиреЗ рдирд╣реАрдВ рдЖрддреЗ рд╣реИрдВ

рддрдм рдпрд╣ рд╕реАрдорд╛ рддрдп рдХреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдП рдФрд░ рдпрд╣ рдореБрджреНрджрд╛ рдЦреБрд▓рд╛ рд░рд╣рдирд╛ рдЪрд╛рд╣рд┐рдП:

// MyClass.d.ts

// Instead of generating:
declare class MyClass {
  myDate: moment.Moment;
}

// Should generate:
declare class MyClass {
  get myDate(): moment.Moment;
  set myDate(value: Date | moment.Moment);
}

// Or shorter syntax:
declare class MyClass {
  myDate: (get: moment.Moment, set: Date | moment.Moment);
  // and 'fooBar: string' being a shorthand for 'fooBar: (get: string, set: string)'
}

рд╕рднреА 125 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдореИрдВ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдпрд╣рд╛рдВ рдХреИрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ (рдФрд░ рдпрд╣ рдкрд╣рд▓реЗ рдЕрдиреБрд░реЛрдз рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореБрдЭреЗ рдЕрдм рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рдорд┐рд▓ рд░рд╣реА рд╣реИ) рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдЗрд╕реЗ рд╡рд╛рд░рдВрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ рдпрд╛ рдирд╣реАрдВред рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдПрдХреНрд╕реЗрд╕рд░реНрд╕ .d.ts рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп рдЧреБрдгреЛрдВ рд╕реЗ рднрд┐рдиреНрди рд░реВрдк рд╕реЗ рд╕рд╛рдордиреЗ рдирд╣реАрдВ рдЖрддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдЙрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рд╕рдорд╛рди рджрд┐рдЦрд╛рдИ рджреЗрддреЗ рд╣реИрдВред рдорддрд▓рдм рдЧреЗрдЯрдЯрд░ рдФрд░ рд╕реЗрдЯрд░ рдХреЗ рдмреАрдЪ рдХреЛрдИ рдЕрдВрддрд░ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ) рдПрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдПрдХ рдПрдХрд▓ рдЗрдВрд╕реНрдЯреЗрдВрд╕ рд╕рджрд╕реНрдп рдХреЗ рдмрдЬрд╛рдп рдПрдХ рдПрдХреНрд╕реЗрд╕рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдФрд░ рдмреА) рдЧреЗрдЯрд░ рдФрд░ рд╕реЗрдЯрд░ рдХреЗ рдмреАрдЪ рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рдЕрдВрддрд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВред

рддреНрд╡рд░рд┐рдд рдЙрддреНрддрд░ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рджрд╛рдиред рдореИрдВ рдХрдо рд╕реБрд░реБрдЪрд┐рдкреВрд░реНрдг рддрд░реАрдХреЗ рдХрд╛ рдкрд╛рд▓рди рдХрд░реВрдВрдЧрд╛ред рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдХрд╛рд░реНрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!

рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдПрдХ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЧреЗрдЯрд░ рдФрд░ рд╕реЗрдЯрд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдорд╛рдиреНрдп рд╣реИ рдФрд░ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рдпрд╣ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рдореБрдЦреНрдп рд▓рд╛рдн/рдЙрджреНрджреЗрд╢реНрдп рд╣реИред рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдЦреБрд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ setMyDate() рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рдЗрд╕реЗ рдмрд░реНрдмрд╛рдж рдХрд░ рджреЗрддрд╛ рд╣реИред

рд╢реБрджреНрдз рдЬреЗрдПрд╕ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреА рд╕реЛрдЪреЗрдВ рдЬреЛ рдЗрд╕ рдкреИрдЯрд░реНрди рдХрд╛ рдкрд╛рд▓рди рдХрд░реЗрдВрдЧреЗ: .d.ts рдХреЛ рдПрдХ рд╕рдВрдШ рдпрд╛ any рдХрд╛ рдЦреБрд▓рд╛рд╕рд╛ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдПрдХреНрд╕реЗрд╕рд░реНрд╕ .d.ts рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп рдЧреБрдгреЛрдВ рд╕реЗ рднрд┐рдиреНрди рд░реВрдк рд╕реЗ рд╕рд╛рдордиреЗ рдирд╣реАрдВ рдЖрддреЗ рд╣реИрдВ

рддрдм рдпрд╣ рд╕реАрдорд╛ рддрдп рдХреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдП рдФрд░ рдпрд╣ рдореБрджреНрджрд╛ рдЦреБрд▓рд╛ рд░рд╣рдирд╛ рдЪрд╛рд╣рд┐рдП:

// MyClass.d.ts

// Instead of generating:
declare class MyClass {
  myDate: moment.Moment;
}

// Should generate:
declare class MyClass {
  get myDate(): moment.Moment;
  set myDate(value: Date | moment.Moment);
}

// Or shorter syntax:
declare class MyClass {
  myDate: (get: moment.Moment, set: Date | moment.Moment);
  // and 'fooBar: string' being a shorthand for 'fooBar: (get: string, set: string)'
}

рдореБрдЭреЗ рдПрд╣рд╕рд╛рд╕ рд╣реИ рдХрд┐ рдпрд╣ рд╕рд┐рд░реНрдл рдПрдХ рд░рд╛рдп рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рд╕реЗрдЯрд░ рд▓рд┐рдЦрдирд╛ рдЬреИрд╕реЗ рдХрд┐ a.x === y true рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж a.x = y; рдПрдХ рд╡рд┐рд╢рд╛рд▓ рд▓рд╛рд▓ рдЭрдВрдбрд╛ рдирд╣реАрдВ рд╣реИред рдЙрд╕ рддрд░рд╣ рдХреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рдЙрдкрднреЛрдХреНрддрд╛ рдХреИрд╕реЗ рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдХрд┐рди рдЧреБрдгреЛрдВ рдХреЗ рдЬрд╛рджреБрдИ рджреБрд╖реНрдкреНрд░рднрд╛рд╡ рд╣реИрдВ рдФрд░ рдХреМрди рд╕реЗ рдирд╣реАрдВ?

рдХреИрд╕реЗ [рдЖрдк] рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдХрд┐рди рдЧреБрдгреЛрдВ рдХреЗ рдЬрд╛рджреБрдИ рджреБрд╖реНрдкреНрд░рднрд╛рд╡ рд╣реИрдВ рдФрд░ рдХреМрди рд╕реЗ рдирд╣реАрдВ?

рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдпрд╣ рд╕рд╣рдЬ рдЬреНрдЮрд╛рди рдпреБрдХреНрдд рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдЙрдкрдХрд░рдг (рдЖрдИрдбреАрдИ + рдХрдВрдкрд╛рдЗрд▓рд░) рд╢рд┐рдХрд╛рдпрдд рдХрд░реЗрдВрдЧреЗред рд╣рдо рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдлрд┐рд░ рд╕реЗ рдХреНрдпреЛрдВ рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВ? :)

рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдПрдХ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЧреЗрдЯрд░ рдФрд░ рд╕реЗрдЯрд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдорд╛рдиреНрдп рд╣реИ рдФрд░ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рдпрд╣ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рдореБрдЦреНрдп рд▓рд╛рдн/рдЙрджреНрджреЗрд╢реНрдп рд╣реИред

рдпрд╣ рддрд░реНрдХ рджреЗ рд░рд╣рд╛ рд╣реИ рдХрд┐ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрдордЬреЛрд░ рдЯрд╛рдЗрдк рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдХрдордЬреЛрд░ рдЯрд╛рдЗрдк рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред :-рдПрд╕

рдпрд╣ рддрд░реНрдХ рджреЗ рд░рд╣рд╛ рд╣реИ рдХрд┐ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрдордЬреЛрд░ рдЯрд╛рдЗрдк рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдХрдордЬреЛрд░ рдЯрд╛рдЗрдк рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП

рд╕реА # рдЗрд╕рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдФрд░ рдпрд╣ рдЗрд╕ рднрд╛рд╖рд╛ рдХреЛ рдХрдордЬреЛрд░ рдЯрд╛рдЗрдк рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рд╕реА # рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреНрд░рд╛рдкреНрдд/рд╕реЗрдЯ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИред

рд╕реА # рдЗрд╕рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдФрд░ рдпрд╣ рдЗрд╕ рднрд╛рд╖рд╛ рдХреЛ рдХрдордЬреЛрд░ рдЯрд╛рдЗрдк рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рд╕реА # рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреНрд░рд╛рдкреНрдд/рд╕реЗрдЯ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИред

:рдЖрдБрдЦ рдорд╛рд░рдирд╛:

рдХреЛрдИ рднреА рддрд░реНрдХ рдирд╣реАрдВ рджреЗ рд░рд╣рд╛ рд╣реИ (рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдореИрдВ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдВ) рдХрд┐ рдПрдХреНрд╕реЗрд╕рд░реНрд╕ рдХреЛ рдХрдордЬреЛрд░ рдЯрд╛рдЗрдк рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рд╡реЗ рддрд░реНрдХ рджреЗ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкреНрд░рдХрд╛рд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рд▓рдЪреАрд▓рд╛рдкрди рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред

рдЕрдХреНрд╕рд░ рдПрдХ рд╕рд╛рджреЗ рдкреБрд░рд╛рдиреЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдХреЗ рд▓рд┐рдП рдХреЙрдкреА рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

    get fields(): Field[] {
      return this._fields;
    }

    set fields(value: any[]) {
      this._fields = value.map(Field.fromJson);
    }

рдпрд╣ рд╡рд┐рдХрд▓реНрдк рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реИ рдФрд░ рдореЗрд░реЗ рд╕реЗрдЯрд░ рдХреЛ рд╕рдЯреАрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓реЙрдЬрд┐рдХ рд╕реЗрдЯрд░реНрд╕ рдХреЗ рд▓рд┐рдП рдЗрдирдХреИрдкреНрд╕реБрд▓реЗрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

@paulwalker рдЬрд┐рд╕ рдкреИрдЯрд░реНрди рдХрд╛ рдЖрдк рд╡рд╣рд╛рдВ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ ( any рд▓реЗрдиреЗ рд╡рд╛рд▓рд╛ рдПрдХ рд╕реЗрдЯрд░ рдФрд░ рдПрдХ рдЕрдзрд┐рдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░рдХрд╛рд░ рд▓реМрдЯрдиреЗ рд╡рд╛рд▓рд╛ рдЧреЗрдЯрд░) рдЖрдЬ рдорд╛рдиреНрдп рд╣реИред

@danquirk рдЬрд╛рдирдХрд░ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд▓рдЧрд╛, рдзрдиреНрдпрд╡рд╛рдж! рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореБрдЭреЗ рдПрд╕рдЯреА рдХреЗ рд▓рд┐рдП рдЕрдкрдирд╛ рдЖрдИрдбреАрдИ рдкреНрд▓рдЧрдЗрди рдХрдВрдкрд╛рдЗрд▓рд░ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред

@danquirk рдпрд╣ рдЦреЗрд▓ рдХреЗ рдореИрджрд╛рди (рдпрд╛ рд╕рдВрд╕реНрдХрд░рдг 1.6.2) рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ:
http://www.typescriptlang.org/Playground#src =%0A%0Aclass%20Foo%20%7B%0A%0A%20%20get%20items()%3A%20string%5B%5D%20%7B%0A % 09% 20% 20 рд░рд┐рдЯрд░реНрди% 20% 5 рдмреА% 5 рдбреА% 3 рдмреА% 0 рдП% 20% 20% 7 рдбреА% 0 рдП% 20% 20% 0 рдП% 20% 20 рд╕реЗрдЯ% 20 рдЖрдЗрдЯрдо (рдореВрд▓реНрдп% 3 рдП% 20 рдХреЛрдИ рднреА)% 20% 7 рдмреА% 0 рдП% 09% 20% 20% 0A% 20% 20% 7D% 0A% 7D

рдореИрдВрдиреЗ рдЕрднреА рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ @ рдЕрдЧрд▓рд╛ (рд╕рдВрд╕реНрдХрд░рдг 1.8.0-рджреЗрд╡.20151102) рдХреЗ рд╕рд╛рде рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рд╣реИ, рдФрд░ рдЗрд╕рдореЗрдВ рдПрдХ рддреНрд░реБрдЯрд┐ рднреА рд╣реИред

~$ tsc --version
message TS6029: Version 1.8.0-dev.20151102
~$ cat a.ts
class A {
    get something(): number {return 5;}
    set something(x: any) {}
}

~$ tsc -t es5 a.ts
a.ts(2,2): error TS2380: 'get' and 'set' accessor must have the same type.
a.ts(3,2): error TS2380: 'get' and 'set' accessor must have the same type.

рд╡рд┐рдбрдВрдмрдирд╛ рдпрд╣ рд╣реИ рдХрд┐ рдореЗрд░реЗ рдЙрджрд╛рддреНрдд рд▓рд┐рдВрдЯрд░ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЗрд╕рдиреЗ рдЕрдм рдХреЛрдИ рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рджреА, рдЬреЛ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ 1.7.x рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИред рдореИрдВ рдорд╛рди рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ 1.7+ рдореЗрдВ рдЖрдЧрд╛рдореА рд╡реГрджреНрдзрд┐ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╢рд╛рдпрдж 1.8.0 рд╡рд╛рдкрд╕ рдЖ рдЧрдпрд╛ред

рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рд╡рд┐рдЬреБрдЕрд▓ рд╕реНрдЯреВрдбрд┐рдпреЛ рдХреЛрдб (0.10.5 (рджрд┐рд╕рдВрдмрд░ 2015)) рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рд╛рде рдЬреЛ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ 1.7.5 рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ 1.7.5 рдореЗрд░реА рдорд╢реАрди рдкрд░ рд╡рд┐рд╢реНрд╡ рд╕реНрддрд░ рдкрд░ рд╕реНрдерд╛рдкрд┐рдд рд╣реИ, рдпрд╣ рдЕрднреА рднреА рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реИ:

image

рддреЛ рдпрд╣ рдХрд┐рд╕ рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рд╕рдорд░реНрдерди рдХрд░реЗрдЧрд╛?
рдзрдиреНрдпрд╡рд╛рдж

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдбреИрди рдЧрд▓рдд рдерд╛ред рдЧреЗрдЯреНрдЯрд░ рдФрд░ рд╕реЗрдЯрд░ рд╕рдорд╛рди рдкреНрд░рдХрд╛рд░ рдХреЗ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдПред

рд╢рд░реНрдо рдХреА рдмрд╛рдд рд╣реИред рдкреНрд░реЛрдЯреИрдХреНрдЯрд░ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдкреЗрдЬ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рд▓рд┐рдЦрддреЗ рд╕рдордп рдПрдХ рдЕрдЪреНрдЫреА рд╕реБрд╡рд┐рдзрд╛ рд╣реЛрддреАред

рдореИрдВ рдПрдХ рдЪрд╛рдВрджрд╛ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрддрд╛:

po.email = "[email protected]";
expect(po.email).toBe("[email protected]");

... рдПрдХ рдкреГрд╖реНрда рд╡рд╕реНрддреБ рд╕рдВрд▓реЗрдЦрди рджреНрд╡рд╛рд░рд╛:

class PageObject {
    get email(): webdriver.promise.Promise<string> {
        return element(by.model("ctrl.user.email")).getAttribute("value")
    }
    set email(value: any) {
        element(by.model("ctrl.user.email")).clear().sendKeys(value);
    }
}

рдЙрд╕ рдХреЛрдб рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рд╕реЗрдЯрд░ рдХреЛ any рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣реЛрдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ?

рдЧреЗрдЯрдЯрд░ рдПрдХ webdriver.promise.Promise<string> рд▓реМрдЯрд╛рдПрдЧрд╛, рдлрд┐рд░ рднреА рд╡рд╣ рд╕реЗрдЯрд░ рдЬрд┐рд╕реЗ рдореИрдВ string рдорд╛рди рдЕрд╕рд╛рдЗрди рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред

рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЪрд╛рдВрджрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд╛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд▓рдВрдмрд╛ рд░реВрдк рдЗрд╕реЗ рд╕реНрдкрд╖реНрдЯ рдХрд░рддрд╛ рд╣реИ:

po.email = "[email protected]";
var currentEmail : webdriver.promise.Promise<string> = po.email;
expect(currentEmail).toBe("[email protected]")

@RyanCavanaugh рдЕрд╢рдХреНрдд рдПрдиреЛрдЯреЗрд╢рди рдХреА рд╢реБрд░реБрдЖрдд рдХреЗ рд╕рд╛рде, рдпрд╣ рдХреЛрдб рдХреЛ рд░реЛрдХрддрд╛ рд╣реИ рдЬреЛ рдПрдХ рд╕реЗрдЯрд░ рдХреЛ рдХреБрдЫ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рдкрд░ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд▓ рдХреЗ рд╕рд╛рде рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

class Style {
    private _width: number = 5;

    // `: number | null` encumbers callers with unnecessary `!`
    get width(): number {
        return this._width;
    }

    // `: number` prevents callers from passing in null
    set width(newWidth: number | null) {
        if (newWidth === null) {
            this._width = 5;
        }
        else {
            this._width = newWidth;
        }
    }
}

рдХреНрдпрд╛ рдЖрдк рдХрдо рд╕реЗ рдХрдо | null рдФрд░ | undefined рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдореЗрдВ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рднрд┐рдиреНрди рд╣реЛрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?

рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдЕрдЪреНрдЫреА рд╕реБрд╡рд┐рдзрд╛ рд╣реЛрдЧреАред

рддреЛ рдХреНрдпрд╛ рдпрд╣ рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реЛрдЧреА?

@artyil рдЗрд╕реЗ рдмрдВрдж рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ _By Design_ рдЯреИрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЗрд╕реЗ рдЬреЛрдбрд╝рдиреЗ рдХреА рдХреЛрдИ рдпреЛрдЬрдирд╛ рдирд╣реАрдВ рд╣реИред рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рд╕рдореНрдореЛрд╣рдХ рдЙрдкрдпреЛрдЧ рдХрд╛ рдорд╛рдорд▓рд╛ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдКрдкрд░ рд╡реНрдпрдХреНрдд рдХреА рдЧрдИ рдЪрд┐рдВрддрд╛рдУрдВ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЖрдк рдмреЗрдЭрд┐рдЭрдХ рдЕрдкрдирд╛ рдорд╛рдорд▓рд╛ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЕрддрд┐рд░рд┐рдХреНрдд рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕реЗ рдХреЛрд░ рдЯреАрдо рдЕрдкрдиреА рд╕реНрдерд┐рддрд┐ рдкрд░ рдкреБрдирд░реНрд╡рд┐рдЪрд╛рд░ рдХрд░ рд╕рдХрддреА рд╣реИред

@kitsonk рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЙрдкрд░реЛрдХреНрдд рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рдкрд░реНрдпрд╛рдкреНрдд рд╕реЗ рдЕрдзрд┐рдХ рд╕рдореНрдореЛрд╣рдХ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП рд╣реИрдВред рдЬрдмрдХрд┐ рд╡рд░реНрддрдорд╛рди рдбрд┐рдЬрд╝рд╛рдЗрди рдЗрд╕ рдкреНрд░рддрд┐рдмрдВрдз рдХреЗ рд╕рд╛рде рдЕрдзрд┐рдХрд╛рдВрд╢ рдЕрдиреНрдп рдЯрд╛рдЗрдк рдХреА рдЧрдИ рднрд╛рд╖рд╛рдУрдВ рдХреЗ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдкреИрдЯрд░реНрди рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд░рддрд╛ рд╣реИ, рдпрд╣ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдФрд░ рдЕрддреНрдпрдзрд┐рдХ рдкреНрд░рддрд┐рдмрдВрдзрд╛рддреНрдордХ рд╣реИред рдЬрдмрдХрд┐ рдпрд╣ рдбрд┐рдЬрд╝рд╛рдЗрди рджреНрд╡рд╛рд░рд╛ рд╣реИ, рдбрд┐рдЬрд╝рд╛рдЗрди рдЧрд▓рдд рд╣реИред

рдореИрдВ рд╕рд╣рдордд рд╣реВрдВред

рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдФрд░ рд╕реЛрдЪрдиреЗ рдХреЗ рдмрд╛рджред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣рд╛рдВ рдореБрджреНрджрд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдЬрдЯрд┐рд▓рддрд╛ рд╣реИред рдореБрдЭреЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ @Arnavion рдХрд╛ рдЙрджрд╛рд╣рд░рдг рдЖрдХрд░реНрд╖рдХ рд▓рдЧрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЯрд╛рдЗрдк рд╕рд┐рд╕реНрдЯрдо рдЖрдЬ рдЧреЗрдЯрд░реНрд╕/рд╕реЗрдЯрд░реНрд╕ рдХреЛ рдирд┐рдпрдорд┐рдд рдЧреБрдгреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирддрд╛ рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рджреЛрдиреЛрдВ рдХрд╛ рдПрдХ рд╣реА рдореВрд▓реНрдп рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдкрдврд╝рдиреЗ/рд▓рд┐рдЦрдиреЗ рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрдбрд╝рд╛ рдмрджрд▓рд╛рд╡ рд╣реЛрдЧрд╛, рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣рд╛рдВ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд▓рд╛рдЧрдд рдХреЗ рд▓рд╛рдпрдХ рд╣реЛрдЧреАред

рдЬрдмрдХрд┐ рдореИрдВ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реЗ рдкреНрдпрд╛рд░ рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рдЯреАрдо рджреНрд╡рд╛рд░рд╛ рдЗрд╕рдореЗрдВ рдХрд┐рдП рдЧрдП рд╕рднреА рдкреНрд░рдпрд╛рд╕реЛрдВ рдХреА рд╕рд░рд╛рд╣рдирд╛ рдХрд░рддрд╛ рд╣реВрдВ (рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЖрдк рд▓реЛрдЧ рд░реЙрдХ!), рдореБрдЭреЗ рдпрд╣ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдореИрдВ рдЗрд╕ рдирд┐рд░реНрдгрдп рд╕реЗ рдирд┐рд░рд╛рд╢ рд╣реВрдВред рдпрд╣ getFoo()/setFoo() рдпрд╛ get foo()/set foo()/setFooEx() рдХреЗ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рдмреЗрд╣рддрд░ рд╕рдорд╛рдзрд╛рди рд╣реЛрдЧрд╛ред

рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреА рдПрдХ рдЫреЛрдЯреА рд╕реВрдЪреА:

  • рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╣рдо рдорд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЧреБрдг рдмрд┐рд▓реНрдХреБрд▓ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╣реЛрддреЗ рд╣реИрдВред рдЕрдм рд╣рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рд╕реНрдерд╛рди рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рд╕рдВрдкрддреНрддрд┐ рдХреЗ "рдкрдврд╝рдиреЗ" рдкреНрд░рдХрд╛рд░ рдФрд░ "рд▓рд┐рдЦрдиреЗ" рдкреНрд░рдХрд╛рд░ рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛
  • рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рдВрдмрдВрдз рдХрд╛рдлреА рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рд╣рдореЗрдВ рдПрдХ рдХреЗ рдмрдЬрд╛рдп рдкреНрд░рддрд┐ рд╕рдВрдкрддреНрддрд┐ рджреЛ рдкреНрд░рдХрд╛рд░ рдХрд╛ рддрд░реНрдХ рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИ (рдХреНрдпрд╛ { get foo(): string | number; set foo(): boolean } { foo: boolean | string | number } рдХреЛ рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реИ, рдпрд╛ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд?)
  • рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╣рдо рдорд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдПрдХ рд╕рдВрдкрддреНрддрд┐, рд╕реЗрдЯ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рдЕрднреА рднреА рдирд┐рдореНрди рдкрдВрдХреНрддрд┐ рдкрд░ рд╕реЗрдЯ рдорд╛рди рдХрд╛ рдкреНрд░рдХрд╛рд░ рд╣реИ (рдЬреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдХреБрдЫ рд▓реЛрдЧреЛрдВ рдХреЗ рдХреЛрдбрдмреЗрд╕ рдореЗрдВ рдЧрд▓рдд рдзрд╛рд░рдгрд╛ рд╣реИ, рд╡рд╛рдЯ?) рд╣рдореЗрдВ рд╢рд╛рдпрдж рдЗрд╕ рддрд░рд╣ рдХреЗ рдЧреБрдгреЛрдВ рдкрд░ рдХрд┐рд╕реА рднреА рдкреНрд░рд╡рд╛рд╣ рдирд┐рдпрдВрддреНрд░рдг рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЛ "рдмрдВрдж" рдХрд░рдирд╛ рд╣реЛрдЧрд╛

рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ, рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдпрд╣рд╛рдВ рдирд┐рд░реНрджреЗрд╢рд╛рддреНрдордХ рд╣реЛрдиреЗ рд╕реЗ рдмрдЪрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕ рд╡рд┐рдЪрд╛рд░ рдкрд░ рдЖрдкрддреНрддрд┐ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдХреЛрдб

foo.bar = "hello";
console.log(foo.bar);

рдРрд╕реА рднрд╛рд╖рд╛ рдореЗрдВ "hello" рд╕реЗ рдЕрдзрд┐рдХ рдХреБрдЫ рднреА рдореБрджреНрд░рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рд╕рдордЭрджрд╛рд░ рдЕрд░реНрдерд╢рд╛рд╕реНрддреНрд░ рд░рдЦрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реИред рдЧреБрдгреЛрдВ рдореЗрдВ рдРрд╕рд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рдмрд╛рд╣рд░реА рдкрд░реНрдпрд╡реЗрдХреНрд╖рдХреЛрдВ рдХреЗ рд▓рд┐рдП рдлрд╝реАрд▓реНрдб рд╕реЗ рдЕрдкреНрд░рднреЗрджреНрдп рд╣реЛред

@RyanCavanaugh рдЬрдмрдХрд┐ рдореИрдВ рдЗрдВрдЬреЗрдХреНрд╢рди рд░рд╛рдп рдкрд░ рдЖрдкрдХреЗ рд╕рд╛рде рд╕рд╣рдордд рд╣реВрдВ, рдореИрдВ рдПрдХ рдХрд╛рдЙрдВрдЯрд░ рддрд░реНрдХ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ _might_ рдмрд╕ рдмрд╣реБрдд рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯреА рд╣реЛ ... рдПрдХ рд╕реЗрдЯрд░ рдкрд░ рдХрдордЬреЛрд░ рдЯрд╛рдЗрдк рдХреА рдЧрдИ рдХреБрдЫ рдлреЗрдВрдХрдирд╛, рд▓реЗрдХрд┐рди рдХреБрдЫ рд╣рдореЗрд╢рд╛ рджреГрдврд╝рддрд╛ рд╕реЗ рдЯрд╛рдЗрдк рдХрд┐рдпрд╛ рдЧрдпрд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

foo.bar = [ '1', 2 ];  // any[]
console.log(foo.bar);  // number[]: [ 1, 2 ]

рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрджрд┐ рдЖрдк рдЙрд╕ рдЬрд╛рджреБрдИ рд╣реЛрдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдПрдХ рд╡рд┐рдзрд┐ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣реИ рддрд╛рдХрд┐ рдЕрдВрддрд┐рдо рдбреЗрд╡рд▓рдкрд░ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕рдордЭ рд╕рдХреЗ рдХрд┐ рдХреНрдпрд╛ рдореБрдбрд╝рд╛ рд╣реБрдЖ, рдореБрдбрд╝рд╛ рдФрд░ рд╡рд┐рдХреГрдд рд╣реЛрдЧрд╛ред

рдпрд╣рд╛рдБ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓рд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдПрдкреАрдЖрдИ рдиреЗ рдПрдХ рдХреНрд╖рдорддрд╛ рдкреЗрд╢ рдХреА рдЬрд┐рд╕реЗ рд╣рдордиреЗ _Autocasting_ рдирд╛рдо рджрд┐рдпрд╛ред рдореБрдЦреНрдп рд▓рд╛рдн рдПрдХ рд╕реБрд╡реНрдпрд╡рд╕реНрдерд┐рдд рдбреЗрд╡рд▓рдкрд░ рдЕрдиреБрднрд╡ рд╣реИ рдЬреЛ рдЙрди рдЧреБрдгреЛрдВ рдХреЛ рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдпрд╛рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдХреНрд╖рд╛рдУрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рдирдХреЗ рд▓рд┐рдП рдкреНрд░рдХрд╛рд░ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реИред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рд░рдВрдЧ рд╕рдВрдкрддреНрддрд┐ рдХреЛ Color рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдпрд╛ CSS рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд░реВрдк рдореЗрдВ rgba(r, g, b, a) рдпрд╛ 3 рдпрд╛ 4 рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреА рдПрдХ рд╕рд░рдгреА рдХреЗ рд░реВрдк рдореЗрдВ рд╡реНрдпрдХреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╕рдВрдкрддреНрддрд┐ рдХреЛ рдЕрднреА рднреА Color рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдЯрд╛рдЗрдк рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╡рд╣ рдкреНрд░рдХрд╛рд░ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдореВрд▓реНрдп рдкрдврд╝рддреЗ рд╕рдордп рдорд┐рд▓рддрд╛ рд╣реИред

рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдЬрд╛рдирдХрд╛рд░реА: https://developers.arcgis.com/javascript/latest/guide/autocasting/index.html

рд╣рдорд╛рд░реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЙрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЛ рдкрд╛рдХрд░ рдмрд╣реБрдд рдЦреБрд╢ рд╣реБрдП рд╣реИрдВ, рдЖрд╡рд╢реНрдпрдХ рдЖрдпрд╛рддреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдХрдо рдХрд░рддреЗ рд╣реБрдП, рдФрд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдордЭ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ рдкреНрд░рдХрд╛рд░ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХреЗ рдмрд╛рдж рд▓рд╛рдЗрди рдХреЛ рдмрджрд▓ рджреЗрддрд╛ рд╣реИред

рдЗрд╕ рдореБрджреНрджреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рдЙрджрд╛рд╣рд░рдг: https://github.com/gulpjs/vinyl#filebase

file.base = 'd:\\dev';
console.log(file.base); //  'd:\\dev'
file.base = null;
console.log(file.base); //  'd:\\dev\\vinyl' (returns file.cwd)

рддреЛ рд╕реЗрдЯрд░ string | null | undefined рд╣реИ рдФрд░ рдЧреЗрдЯрдЯрд░ рд╕рд┐рд░реНрдл string рд╣реИред рдЗрд╕ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд▓рд┐рдП рдкреНрд░рдХрд╛рд░ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рд╣рдореЗрдВ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП? рдпрджрд┐ рд╣рдо рдкреВрд░реНрд╡ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╕рдВрдХрд▓рдХ рдХреЛ рд╣рд░ рдЬрдЧрд╣ рдмреЗрдХрд╛рд░ рдирд▓ рдЬрд╛рдВрдЪ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдпрджрд┐ рд╣рдо рдмрд╛рдж рд╡рд╛рд▓реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдЗрд╕ рд╕рдВрдкрддреНрддрд┐ рдХреЛ null рдЕрд╕рд╛рдЗрди рдирд╣реАрдВ рдХрд░ рдкрд╛рдПрдВрдЧреЗред

рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рдФрд░ рдЙрджрд╛рд╣рд░рдг рд╣реИ рдЬрд╣рд╛рдВ рдореИрдВ рдЧреЗрдЯрдЯрд░ рдХреЛ рд╢реВрдиреНрдп рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдЬрд╣рд╛рдВ рд╕реЗрдЯрд░ рдХреЛ рдЗрдирдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдХрднреА рднреА рд╢реВрдиреНрдп рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрдиреА рдЪрд╛рд╣рд┐рдП, рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╢реИрд▓реАрдмрджреНрдз:

class Memory {
    public location: string;
    public time: Date;
    public company: Person[];
}

class Person
{
    private _bestMemoryEver: Memory | null;

    public get bestMemoryEver(): Memory | null { // Might not have one yet
        return this._bestMemoryEver;
    }

    public set bestMemoryEver(memory: Memory) { // But when he/she gets one, it can only be replaced, not removed
        this._bestMemoryEver = memory;
    }
}

var someDude = new Person();
// ...
var bestMemory: Memory | null = someDude.bestMemoryEver;
//...
someDude.bestMemoryEver = null; // Oh no you don't!

рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ рдХрд┐ рдЧреЗрдЯрд░реНрд╕/рд╕реЗрдЯрд░реНрд╕ рдХреЛ рд╢реВрдиреНрдп рдкрд░ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреА рдЗрдЬрд╛рдЬрдд рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╡рд┐рд╢реЗрд╖ рддрд░реНрдХ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдХрд╛рдо рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдЗрддрдирд╛ рдмрдбрд╝рд╛ рд╕реМрджрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред

@ рд╣рд╛рдереА-рдкреЛрдд рджрд╛рд░реНрд╢рдирд┐рдХ рд░реВрдк рд╕реЗ рдореБрдЭреЗ рдЙрджрд╛рд╣рд░рдг рд╕реЗ рдмрд┐рд▓реНрдХреБрд▓ рдкреНрдпрд╛рд░ рд╣реИ, рдпрд╣ рдордиреБрд╖реНрдпреЛрдВ рдХреА рдЪрдВрдЪрд▓ рдкреНрд░рдХреГрддрд┐ рдХрд╛ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ null (рдпрд╛ undefined рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдХрд░ рдЗрд╕рдХрд╛ рдмреЗрд╣рддрд░ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред ) рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдиреЗрд╡рд╛рд▓рд╛ред рдореИрдВ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рд╕рд┐рдиреИрдкреНрд╕ рд╡рд┐рдлрд▓рддрд╛ рдХреЛ рдХреИрд╕реЗ рдореЙрдбрд▓ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ?

@aluanhaddad рдЖрдк synapse рд╡рд┐рдлрд▓рддрд╛ рдХреНрдпреЛрдВ рдЪрд╛рд╣рддреЗ рд╣реИрдВ? рдореИрдВ рдЕрдкрдиреЗ рдмреНрд░рд╣реНрдорд╛рдВрдб рдореЗрдВ рдЙрд╕ рддрд░рд╣ рдХреА рдмреБрд░реА рдЪреАрдЬреЗрдВ рдирд╣реАрдВ рдЪрд╛рд╣рддрд╛;)

рдЗрд╕ рдкрд░ рдХреЛрдИ рдЕрдкрдбреЗрдЯ? рд╢реВрдиреНрдп рдпрд╛ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рдкрд░ рд╕реЗрдЯ рд╣реЛрдиреЗ рдкрд░ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рд░рдЦрдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛?

рдореИрдВ рдирд╣реАрдВ рдЪрд╛рд╣рддрд╛ рдХрд┐ рдЙрдкрднреЛрдХреНрддрд╛ рдХреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╢реВрдиреНрдп рдЬрд╛рдВрдЪ рдХрд░рдиреА рдкрдбрд╝реЗред рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдореБрдЭреЗ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рд╕реЗрдЯрд░ рдХреЛ рдПрдХ рдЕрд▓рдЧ рд╡рд┐рдзрд┐ рдмрдирд╛рдирд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рд╡реЗ рд╡рд╣реА рд╣реЛрдВред

рдиреАрдЪреЗ рд╡рд╣ рд╣реИ рдЬреЛ рдореИрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ:

export class TestClass {
  private _prop?: number;

  get prop(): number {
    // return default value if not defined
    this._prop === undefined ? 0 : this._prop;
  }
  set prop(val: number | undefined) {
    this._prop = val;
  }
}

рдореБрдЭреЗ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдиреЙрди-рдирд▓ рдЪреЗрдХрд┐рдВрдЧ рдХрд╛ рд▓рд╛рдн рдЧреЛрдЪрд░ рдХреЗ рд╕рд╛рде рдЖрддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред рд╕рдЦреНрдд рдирд▓ рдЬрд╛рдВрдЪ рдмрдВрдж рд╣реЛрдиреЗ рдХреЗ рд╕рд╛рде, рдпрд╣ рд╕рдВрднрд╡ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рд╢реВрдиреНрдп рд╕рдВрджрд░реНрдн рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдХрд▓рдХ рд╕рд╣рд╛рдпрддрд╛ рдирд╣реАрдВ рдорд┐рд▓рддреА рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЕрдЧрд░ рдЖрдк рдХрдВрдкрд╛рдЗрд▓рд░ рд╕рд╣рд╛рдпрддрд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХрдо рд╕реЗ рдХрдо рд╢реВрдиреНрдпрддрд╛ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдЧреЗрдЯрд░реНрд╕ рдФрд░ рд╕реЗрдЯрд░реНрд╕ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкрд░рд┐рднрд╛рд╖рд╛рдПрдВ рд░рдЦрдиреЗ рдЬреИрд╕реЗ рдЕрдзрд┐рдХ рд╕рдорд░реНрдерди рдХреЗ рд╕рд╛рде рдЖрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдореБрджреНрджреЗ рдкрд░ рд▓реЗрдмрд▓ рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдПрдХ рдбрд┐рдЬрд╝рд╛рдЗрди рд╕реАрдорд╛ рд╣реИ рдФрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдмрд╣реБрдд рдЬрдЯрд┐рд▓ рдорд╛рдирд╛ рдЬрд╛рдПрдЧрд╛, рдЬрд┐рд╕рдХрд╛ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЕрдЧрд░ рдХрд┐рд╕реА рдХреЗ рдкрд╛рд╕ рдПрдХ рд╕реБрдкрд░ рд╕рдореНрдореЛрд╣рдХ рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдРрд╕рд╛ рдХреНрдпреЛрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рддреЛ рдпрд╣ рдХрд╣реАрдВ рдирд╣реАрдВ рдЬрд╛ рд░рд╣рд╛ рд╣реИред

@mhegazy @kitsonk рдореИрдВ рдкрдХреНрд╖рдкрд╛рддреА рд╣реЛ рд╕рдХрддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдмрдЧ рд╣реИ рдЬреЛ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдкреИрдЯрд░реНрди рдкрд░ рд╕рдЦреНрдд рдирд▓ рдЬрд╛рдВрдЪ рдХреЗ рд▓рд┐рдП рдкреЙрдк рдЕрдк рдХрд░рддрд╛ рд╣реИ, рдЦрд╛рд╕рддреМрд░ рдкрд░ рдЕрдиреНрдп рдШреБрдВрдШрд░рд╛рд▓реЗ рдмреНрд░реЗрд╕ рдЬреИрд╕реЗ рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдЬрд╣рд╛рдВ рдЙрдирдХреЗ рдкрд╛рд╕ рдЕрднреА рддрдХ рд╢реВрдиреНрдп рдЬрд╛рдВрдЪ рдирд╣реАрдВ рд╣реИред рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдХреЗ рд▓рд┐рдП рдЙрдкрднреЛрдХреНрддрд╛ рдХреЛ рдмреИрдВрдЧ рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рдпрд╛ рдпрд╣ рдЬрд╛рдВрдЪрдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрднреА рднреА рд╢реВрдиреНрдп рдирд╣реАрдВ рд╣реИ (рдЬреЛ рдХрд┐ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде рдХрднреА рднреА рд╢реВрдиреНрдп рдирд╣реАрдВ рд╣реЛрдиреЗ рдХрд╛ рдмрд┐рдВрджреБ рд╣реИ)ред

рдПрдХ рдмрд╛рд░ рдЬрдм рдЖрдк рд╕рдЦреНрдд рдирд▓ рдЬрд╛рдВрдЪ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рддреЛ рдпрд╣ рдЯреВрдЯ рдЬрд╛рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЕрдм рдпрд╣ рддрдХрдиреАрдХреА рд░реВрдк рд╕реЗ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рд╣реИред рдореИрдВ рдордЬрдмреВрдд рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рдХрд╣ рд░рд╣рд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреА рддрд░рд╣ рдордЬрдмреВрдд рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рднреА рд╕рдХреНрд╖рдо рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдХрдордЬреЛрд░ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рдирд▓ рдФрд░ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рдкреНрд░рдХрд╛рд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рдФрд░ d.ts рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рдЖрд╡рд░рдг рд╣реЛрдВрдЧреЗ рдпрджрд┐ рд╡реЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред

https://github.com/Microsoft/TypeScript/issues/2521#issuecomment -199650959 рдХреЗ рдЬрд╡рд╛рдм рдореЗрдВ
рдпрд╣рд╛рдВ рдПрдХ рдкреНрд░рд╕реНрддрд╛рд╡ рдбрд┐рдЬрд╛рдЗрди рд╣реИ рдЬрд┐рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдо рдЬрдЯрд┐рд▓ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП:

export interface Test {
  undefset prop1: number; // property [get] type number and [set] type number | undefined
  nullset prop2: number; // property [get] type number and [set] type number | null
  nilset prop3: number; // property [get] type number and [set] type number | null | undefined
  undefget prop4: number; // property [get] type number | undefined and [set] type number
  nullget prop5: number; // property [get] type number | null and [set] type number
  nilget prop6: number; // property [get] type number | null | undefined and [set] type number
}

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреБрдЫ рд▓реЛрдЧ рдЗрд╕ рдереНрд░реЗрдб рдХреЛ рджреЗрдЦ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реЗ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдкрд░рд┐рдЪрд┐рдд рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдХреЛрдИ рд╡реНрдпрдХреНрддрд┐ рдЬреЛ рдЕрднреА рднреА рдзреНрдпрд╛рди рджреЗ рд░рд╣рд╛ рд╣реИ рд╡рд╣ рд╕рдВрдмрдВрдзрд┐рдд рдкреНрд░рд╢реНрди рдХрд╛ рдЙрддреНрддрд░ рджреЗ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рд╕реАрдЬрд╝рд┐рдпрдо рдореБрджреНрджреЗ рдкрд░ рдореИрдВрдиреЗ рдЧреЗрдЯ/рд╕реЗрдЯ рдкреНрд░рдХрд╛рд░ рдХреА рд╕реАрдорд╛ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ рдЬрд┐рд╕рдХреА рд╣рдо рдпрд╣рд╛рдВ рдЪрд░реНрдЪрд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдФрд░ рд╕реАрдЬрд╝рд┐рдпрдо рд▓реЛрдЧреЛрдВ рдиреЗ рдХрд╣рд╛ рдХрд┐ рд╡реЗ рдЬрд┐рд╕ рдкреИрдЯрд░реНрди рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд░ рд░рд╣реЗ рд╣реИрдВ рд╡рд╣ рд╕реА # рд╕реЗ рдЖрддрд╛ рд╣реИ - рдпрд╣ рдирд┐рд╣рд┐рдд рдХрдиреНрд╕реНрдЯреНрд░рдХреНрдЯрд░ рд╣реИ ред

рдХреНрдпрд╛ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдирд┐рд╣рд┐рдд рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛рдУрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░ рд╕рдХрддрд╛ рд╣реИ? рдпрд╣реА рд╣реИ, рдХреНрдпрд╛ рдореИрдВ рдХрд╣ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ myThing.foo рд╣рдореЗрд╢рд╛ рдПрдХ Bar рджреЗрддрд╛ рд╣реИ, рдФрд░ рдЗрд╕реЗ рд╕реАрдзреЗ Bar рд╕реМрдВрдкрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ number рднреА рд╕реМрдВрдкрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдбреЗрд╡рд▓рдкрд░ рдХреА рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд░реВрдк рдореЗрдВ Bar рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЪреБрдкрдЪрд╛рдк рд▓рдкреЗрдЯрд╛ / рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ? рдпрджрд┐ Bar рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░рдХреЗ рдРрд╕рд╛ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ, рдпрд╛ рд╢рд╛рдпрдж рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдпрд╣ рдХрд╣рдХрд░ рдХрд┐ " number Bar<number> $ рдХреЛ рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реИ, рддреЛ рдпрд╣ рд╕реАрдЬрд╝рд┐рдпрдо рдореБрджреНрджреЗ рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХрд┐рдП рдЧрдП рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдХреЛ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░реЗрдЧрд╛, рдФрд░ рдЗрд╕ рд╕реВрддреНрд░ рдореЗрдВ рдЙрдард╛рдП рдЧрдП рдХрдИ рдореБрджреНрджреЛрдВ рдХреЛ рднреАред

рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рдХреНрдпрд╛ рдореБрдЭреЗ рдПрдХ рдЕрд▓рдЧ рдореБрджреНрджреЗ рдореЗрдВ рдирд┐рд╣рд┐рдд рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛ рд╕рдорд░реНрдерди рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ?

рдЬрд┐рддрдирд╛ рдЕрдзрд┐рдХ рдореИрдВ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрддрд╛/рдкрдврд╝рддрд╛ рд╣реВрдВ, рдЙрддрдирд╛ рд╣реА рдореИрдВ рдирд┐рд╢реНрдЪрд┐рдд рд╣реВрдВ рдХрд┐ "рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдирд┐рд░реНрдорд╛рддрд╛ рдкреИрдЯрд░реНрди" рдХреЛ рдЗрд╕ рдореБрджреНрджреЗ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╕реБрд╡рд┐рдзрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рд╡реИрдирд┐рд▓рд╛ рдЬреЗрдПрд╕ рдореЗрдВ рдпрд╣ рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ рдкреНрд░рд╛рдкреНрдд/рд╕реЗрдЯ рдПрдХреНрд╕реЗрд╕рд░реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣реА рдПрдХрдорд╛рддреНрд░ рд╕рдордп рд╣реИ рдЬрдм рдирд╛рдордорд╛рддреНрд░ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ ( = рдСрдкрд░реЗрдЯрд░) рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░ рд░рд╣рд╛ рд╣реИред (рджрд╛рдПрдВ?) рддреЛ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА

class MyThing{
  set foo(b: Bar<boolean> | boolean);
  get foo(): Bar<boolean>;
}

рдЬреЛ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдЬреИрд╕реЗ @RyanCavanaugh рд╕реЛрдЪрддрд╛ рд╣реИ рдХрд┐ "рд╕рдордЭрджрд╛рд░ рд╢рдмреНрджрд╛рд░реНрде" рдирд╣реАрдВ рд╣реИред

рд╕рд╛рдзрд╛рд░рдг рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рд╡рд╣рд╛рдБ рдПрдХ рдмрд╣реБрдд рд▓реЛрдХрдкреНрд░рд┐рдп рдЬреЗрдПрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╣реИ рдЬреЛ рдЗрд╕ рдкреИрдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИ, рдФрд░ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореМрдЬреВрджрд╛ рдЯреАрдПрд╕ рдмрд╛рдзрд╛рдУрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИред рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдореИрдВ рдЧрд▓рдд рд╣реВрдБред

рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рд╡рд░реНрдгрд┐рдд рдкреИрдЯрд░реНрди рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред _рдЪреБрдиреМрддреА_ рдпрд╣ рд╣реИ рдХрд┐ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдкрдврд╝рдиреЗ рдФрд░ рд▓рд┐рдЦрдиреЗ рдХреЗ рдкрдХреНрд╖, рдбрд┐рдЬрд╝рд╛рдЗрди рдХреЗ рдЕрдиреБрд╕рд╛рд░, рд╕рдорд╛рди рдорд╛рдиреЗ рдЬрд╛рддреЗ рд╣реИрдВред рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ ( readonly ) рдХреЛ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднрд╛рд╖рд╛ рдореЗрдВ рдПрдХ рд╕рдВрд╢реЛрдзрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдХреБрдЫ рдореБрджреНрджреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ _write only_ рдЕрд╡рдзрд╛рд░рдгрд╛ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд┐рдпрд╛ рд╣реИ, рдЬрд┐рди рдкрд░ рдмрд╣реБрдд рдХрдо рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╡рд┐рд╢реНрд╡ рдореВрд▓реНрдп рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЬрдЯрд┐рд▓ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ рд╣реИред

IMO, рдЬрдм рд╕реЗ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдиреЗ рдПрдХреНрд╕реЗрд╕рд░реНрд╕ рдХреЛ рдЕрдиреБрдорддрд┐ рджреА рд╣реИ, рд▓реЛрдЧреЛрдВ рдиреЗ рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдЙрдирдХреЗ рд╕рд╛рде рднреНрд░рдорд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ API рдмрдирд╛рдП рд╣реИрдВред рдореБрдЭреЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдпрд╣ рднреНрд░рдорд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ _magically_ рдкрд░ рдХреБрдЫ рдФрд░ рдмрджрд▓ рдЬрд╛рддрд╛ рд╣реИред рдХреБрдЫ рднреА рд▓рд╛рдЧреВ рдХрд░реЗрдВ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд░реВрдкрд╛рдВрддрд░рдг рдЯрд╛рдЗрдк рдХрд░реЗрдВ, рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЖрдИрдПрдордУ рдХрд╛ рдЭреБрдХрд╛рд╡ рд╣реИред рдпрд╣ рдареАрдХ рд▓рдЪреАрд▓рд╛рдкрди рд╣реИ рдЬреЛ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИред рдЙрди рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдкрд╛рдВрддрд░рдгреЛрдВ рдХреЗ рд╕рд╛рде, рдЬрд╣рд╛рдВ _magic_ рд╣реИ, рдореИрдВ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдХреЙрд▓ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рддрд░реАрдХреЛрдВ рдХреЛ рджреЗрдЦрдирд╛ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВ, рдЬрд╣рд╛рдВ рдпрд╣ рдЙрдкрднреЛрдХреНрддрд╛ рдХреЗ рд▓рд┐рдП рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреЗ рдШрдЯрд┐рдд рд╣реЛрдВрдЧреЗ рдФрд░ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдкреБрдирдГ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдкрдврд╝рдиреЗ рд╡рд╛рд▓рд╛ рдЧреЗрдЯрд░ рдмрдирд╛ рджреЗрдЧрд╛ред

рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рджреБрдирд┐рдпрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИ, рдпрд╣ рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рд╕рдордЭрджрд╛рд░ рдФрд░ рддрд░реНрдХрд╕рдВрдЧрдд рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдкреВрд░реЗ рдкреНрд░рдХрд╛рд░ рдХреА рдкреНрд░рдгрд╛рд▓реА рдХреЛ рджреЛ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдиреЗ рдХреА рдЬрдЯрд┐рд▓рддрд╛ рддрдХ рдЖрддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рдЙрдирдХреЗ рдкрдврд╝рдиреЗ рдФрд░ рд▓рд┐рдЦрдиреЗ рдХреА рд╕реНрдерд┐рддрд┐ рдкрд░ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдЯреНрд░реИрдХ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рд╣реИред рдпрд╣ рдПрдХ рдмрд╣реБрдд рд╣реА рдЧреИрд░-рддреБрдЪреНрдЫ рдкрд░рд┐рджреГрд╢реНрдп рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИред

рдореИрдВ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рд╣рдордд рд╣реВрдВ: рд╕реНрдкрд╛рд░реНрдХрд▓реНрд╕: рдпрд╣рд╛рдВ, рд▓реЗрдХрд┐рди рдореИрдВ рдкреИрдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╛ рдЗрд╕рдХреЗ рдЦрд┐рд▓рд╛рдл рдмрд╣рд╕ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдореИрдВ рд╕рд┐рд░реНрдл рдЙрд╕ рдХреЛрдб рдХреЗ рдкреАрдЫреЗ рдЖрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рдЖрдХрд╛рд░ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдФрд░ TS рдореБрдЭреЗ рдЗрд╕рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдХрд░рдг рдирд╣реАрдВ рджреЗ рд░рд╣рд╛ рд╣реИред

рдмреЗрд╣рддрд░ рдпрд╛ рдмрджрддрд░ рдХреЗ рд▓рд┐рдП рдЬреЗрдПрд╕ рдиреЗ рд╣рдореЗрдВ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХреЛ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдореЗрдВ рдмрджрд▓рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рджреА рд╣реИ рдФрд░ рд▓реЛрдЧ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВред set/get рдЬреЛрдбрд╝реЗ рдХреЛ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреЗ рдмрд┐рдирд╛, рдкрд░рд┐рд╡реЗрд╢ рдЯрд╛рдЗрдкрд┐рдВрдЧ рдореЗрдВ set/get рднреА рдХреНрдпреЛрдВ рд╣реИ? рд╕рд╛рд▓реНрд╕рд╛ рдХреЛ рдпрд╣ рдЬрд╛рдирдиреЗ рдХреА рдЬрд░реВрд░рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рдПрдХ рд╕рдВрдкрддреНрддрд┐ рдХреЛ рдЧреЗрдЯрдЯрд░ рдФрд░ рд╕реЗрдЯрд░ рдХреЗ рд╕рд╛рде рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдпрджрд┐ рдпрд╣ рд╣рдореЗрд╢рд╛ myThing.foo рдХреЛ рдПрдХ рд╣реА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рджрд╕реНрдп рдЪрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирдиреЗ рд╡рд╛рд▓рд╛ рд╣реИ, рднрд▓реЗ рд╣реА рдпрд╣ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХреЗ рдХрд┐рд╕ рддрд░рдл рд╣реЛред (рдЬрд╛рд╣рд┐рд░ рд╣реИ, рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕рдВрдХрд▓рди рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдПрдХ рдФрд░ рдмрд╛рдд рд╣реИред)

@thw0rted

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреБрдЫ рд▓реЛрдЧ рдЗрд╕ рдереНрд░реЗрдб рдХреЛ рджреЗрдЦ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реЗ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдкрд░рд┐рдЪрд┐рдд рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдХреЛрдИ рд╡реНрдпрдХреНрддрд┐ рдЬреЛ рдЕрднреА рднреА рдзреНрдпрд╛рди рджреЗ рд░рд╣рд╛ рд╣реИ рд╡рд╣ рд╕рдВрдмрдВрдзрд┐рдд рдкреНрд░рд╢реНрди рдХрд╛ рдЙрддреНрддрд░ рджреЗ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рд╕реАрдЬрд╝рд┐рдпрдо рдореБрджреНрджреЗ рдкрд░ рдореИрдВрдиреЗ рдЙрд╕ рдЧреЗрдЯ/рд╕реЗрдЯ рдкреНрд░рдХрд╛рд░ рдХреА рд╕реАрдорд╛ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЬрд┐рд╕рдХреА рд╣рдо рдпрд╣рд╛рдВ рдЪрд░реНрдЪрд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдФрд░ рд╕реАрдЬрд╝рд┐рдпрдо рдХреЗ рд▓реЛрдЧреЛрдВ рдиреЗ рдХрд╣рд╛ рдХрд┐ рд╡реЗ рдЬрд┐рд╕ рдкреИрдЯрд░реНрди рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд░ рд░рд╣реЗ рд╣реИрдВ рд╡рд╣ рд╕реА # рд╕реЗ рдЖрддрд╛ рд╣реИ - рдпрд╣ рдирд┐рд╣рд┐рдд рдирд┐рд░реНрдорд╛рддрд╛ рд╣реИред

рд╕реА # рдХреЗ рдирд┐рд╣рд┐рдд рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд░реВрдкрд╛рдВрддрд░рдг рдСрдкрд░реЗрдЯрд░ рдореВрд▓реНрдпреЛрдВ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╕реНрдерд┐рд░ рдХреЛрдб рдкреАрдврд╝реА рдХрд░рддреЗ рд╣реИрдВред рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкреНрд░рдХрд╛рд░ рдорд┐рдЯрд╛ рджрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рд░рдирдЯрд╛рдЗрдо рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ ( async / await рдХрд┐рдирд╛рд░реЗ рдХреЗ рдорд╛рдорд▓реЗ Promise рдкреЙрд▓реАрдлрд┐рд▓рд░реНрд╕ рдХреЛ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрддреЗ рд╣реИрдВ)ред

@kitsonk рдореБрдЭреЗ рд╕рдВрдкрддреНрддрд┐рдпреЛрдВ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдЕрд╕рд╣рдордд рд╣реЛрдирд╛ рд╣реИред рдЬрд╛рд╡рд╛, рд╕реА ++, рдФрд░ рд╕реА # рдХреЗ рд╕рд╛рде рдЙрдЪрд┐рдд рд╕рдордп рдмрд┐рддрд╛рдиреЗ рдХреЗ рдмрд╛рдж, рдореБрдЭреЗ рдмрд┐рд▓реНрдХреБрд▓ рдЧреБрдг рдкрд╕рдВрдж рд╣реИрдВ (рдЬреИрд╕рд╛ рдХрд┐ рд╕реА # рдореЗрдВ рджреЗрдЦрд╛ рдЧрдпрд╛ рд╣реИ) рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╡рд╛рдХреНрдп рд░рдЪрдирд╛рддреНрдордХ рдЕрдореВрд░реНрддрддрд╛ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВ (рдпрд╣ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдХреБрдЫ рд╣рдж рддрдХ рд╕рдЪ рд╣реИ)ред рд╡реЗ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЛ рдмрджрд▓реЗ рдмрд┐рдирд╛ рд╕рд╛рд░реНрдердХ рддрд░реАрдХреЛрдВ рд╕реЗ рдкрдврд╝рдиреЗ/рд▓рд┐рдЦрдиреЗ рдХреА рдХреНрд╖рдорддрд╛рдУрдВ рдХреЛ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдВрдЯрд░рдлреЗрд╕ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред рдореБрдЭреЗ getX() рдЬреИрд╕реЗ рддреБрдЪреНрдЫ рдХрд╛рд░реНрдпреЛрдВ рдкрд░ рдмрд░реНрдмрд╛рдж рд╣реЛрдиреЗ рд╡рд╛рд▓реА рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рджреЗрдЦрдиреЗ рд╕реЗ рдирдлрд░рдд рд╣реИ рдЬрдм X рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдирд┐рд╣рд┐рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рдЖрдИрдПрдордУ рднреНрд░рдорд┐рдд рдПрдкреАрдЖрдИ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдХрдИ рдЖрдк рджреБрд░реНрд╡реНрдпрд╡рд╣рд╛рд░ рдПрдХреНрд╕реЗрд╕рд░реНрд╕ рдХрд╣рддреЗ рд╣реИрдВ, рдмрд╣реБрдд рд╕реЗ _setters_ рдЬрд╛рджреБрдИ рдЪреАрдЬреЗрдВ рдХрд░рддреЗ рд╣реИрдВред

рдЕрдЧрд░ рдореЗрд░реЗ рдкрд╛рд╕ рдХреБрдЫ рдбреЗрдЯрд╛ рдкрд░ рдХреЗрд╡рд▓ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП, рд▓реЗрдХрд┐рди рд▓рд╛рдЗрд╡ рджреГрд╢реНрдп рд╣реИ, рддреЛ registry рдХрд╣реЗрдВ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреЗрд╡рд▓ рдкрдврд╝рдиреЗ рдпреЛрдЧреНрдп рдЧреБрдгреЛрдВ рдХреЛ рд╕рдордЭрдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИред

interface Entry {key: string; value: any;}

export function createRegistry() {
  let entries: Entry[] = [];
  return {
    register(key: string, value: any) {
      entries = [...entries, {key, value}];
    },
    get entries() {
      return [...entries];
    }
  }
}

const registry = createRegistry();

registry.register('hello', 'цВихе╜');
console.log(registry.entries); //[{key: 'hello', value: 'цВихе╜'}]
registry.register('goodbye', 'хЖНшзБ');
console.log(registry.entries); //[{key: 'hello', value: 'цВихе╜'}, {key: 'goodbye', value: 'хЖНшзБ'}]

рд╕реНрдкрд░реНрд╢рд░реЗрдЦрд╛ рдХреЗ рд▓рд┐рдП рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХреНрд╕реЗрд╕рд░реНрд╕ рдкрд╕рдВрдж рд╣реИрдВ рдФрд░ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рд╕рдордЭрдирд╛ рдЖрд╕рд╛рди рд╣реИ рд▓реЗрдХрд┐рди рдореИрдВ рдЕрдиреНрдпрдерд╛ рдЖрд╢реНрд╡рд╕реНрдд рд╣реЛрдиреЗ рдХреЛ рддреИрдпрд╛рд░ рд╣реВрдВ рдФрд░ рдкрдардиреАрдпрддрд╛ рдореЗрд░реА рдкрд╣рд▓реА рдЪрд┐рдВрддрд╛ рд╣реИред

рдЬрдм рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рд╕реАрдорд┐рдд рдХрд░рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдПрдХ рд▓рд╛рдн рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдкрд░реЗрд╢рд╛рдиреА рдХрд╛ рд╕рдмрдм рдмрди рдЬрд╛рддрд╛ рд╣реИред рдХреНрдпрд╛ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рдПрдХ рджреВрд╕рд░реЗ рдХреЗ рд╕рд╛рде рд╕рдВрд╡рд╛рдж рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рд╣реИ?

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдмрд╕рдиреЗ рд╡рд╛рд▓реЛрдВ рдХреЛ рдПрдХ рдХрд╛рд░рдг рдХреЗ рд▓рд┐рдП рдореНрдпреВрдЯреЗрдЯрд░ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ рдореБрдЭреЗ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдкрд╛рдВрддрд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА, рддреЛ рдореИрдВ рдПрдХ рд╕реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛, рдореИрдВ рд╕реНрд╡рдпрдВ рдЪрд░ рд╕реЗрдЯ рдХрд░рддрд╛ред

рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдкреЛрд░реНрдЯ рдХрд░рдирд╛ред рдореИрдВ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рд╕реЗ рдорд┐рд▓рд╛ ..

рдпрд╣ рдХреЛрдгреАрдп @Input рдбреЗрдХреЛрд░реЗрдЯрд░реНрд╕ рдкрд░ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред рдЪреВрдВрдХрд┐ рдорд╛рди рдЯреЗрдореНрдкрд▓реЗрдЯ рд╕реЗ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рд╡рд┐рднрд┐рдиреНрди рдЖрдиреЗ рд╡рд╛рд▓реА рд╡рд╕реНрддреБ рдкреНрд░рдХрд╛рд░реЛрдВ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдмрд╣реБрдд рд╕рд╛рдл рдХрд░ рджреЗрдЧрд╛ред

рдЕрджреНрдпрддрди: рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ

import { Component, Input } from '@angular/core';
import { flatMap, isString, isArray, isFalsy } from 'lodash';

@Component({
  selector: 'app-error-notification',
  templateUrl: './error-notification.component.html',
})

export class ErrorNotificationComponent {
  private _errors: Array<string> = [];
  constructor() { }
  /**
   * 'errors' is expected to be an input of either a string or an array of strings
   */
  @Input() set errors(errors: Array<string> | any){
      // Caller just passed in a string instead of an array of strings
      if (isString(errors)) {
        this._errors = [errors];
      }
      // Caller passed in array, assuming it is a string array
      if (isArray(errors)) {
        this._errors = errors;
      }
      // Caller passed in something falsy, which means we should clear error list
      if (isFalsy(errors)) {
        this._errors = [];
      }
      // At this point just set it to whatever might have been passed in and let
      // the user debug when it is broken.
      this._errors = errors;
  }

  get errors() {
    return this._errors;
  }
}

рддреЛ рдХреНрдпрд╛ рд╣рдо рдереЗ? рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕реЗрдЯрд░ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЧреЗрдЯрд░ рдХреЗ рд╕рд╛рде рдПрдХ рдЕрд▓рдЧ рдкреНрд░рдХрд╛рд░ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд░рдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

class Field {
  private _value: string;

  get value(): string {
    return this._value;
  }

  set value(value: any) {
    this._value = String(value);
  }
}

рдпрд╣ рд╡рд╣реА рд╣реИ рдЬреЛ 99% рдореВрд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд░рддрд╛ рд╣реИ (рдпрджрд┐ рдЖрдк рдХрд┐рд╕реА рд╕рдВрдЦреНрдпрд╛ рдХреЛ (input as HTMLInputElement).value рдкрд░ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдпрд╣ рд╣рдореЗрд╢рд╛ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд▓реМрдЯрд╛рдПрдЧрд╛ред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ рдФрд░ рд╕реЗрдЯ рдХреЛ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдХреБрдЫ рдХреЛ рдЕрдиреБрдорддрд┐ рджреЗрдиреА рдЪрд╛рд╣рд┐рдП:

set value(value: string);
set value(value: number);
set value(value: any) {
  this._value = String(value);
}
  // AND/OR
set value(value: string | number) {
  this._value = String(value);
}

@raysuelzer , рдЬрдм рдЖрдк рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ рдЖрдкрдХрд╛ рдХреЛрдб "рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ", рддреЛ ErrorNotificationComponent.errors рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ Array<string> | any рдирд╣реАрдВ рд▓реМрдЯрд╛рддрд╛ рд╣реИ? рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╣рд░ рдмрд╛рд░ рдЬрдм рдЖрдк рдЗрд╕рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдЖрдкрдХреЛ рдЯрд╛рдЗрдк рдЧрд╛рд░реНрдб рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬрдм рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреЗрд╡рд▓ Array<string> рд▓реМрдЯрд╛ рд╕рдХрддрд╛ рд╣реИред

@lifaon74 , рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛрдореБрдЭреЗ рдкрддрд╛ рд╣реИ, рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рдХреЛрдИ рд╣рд▓рдЪрд▓ рдирд╣реАрдВ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рд╕рдореНрдореЛрд╣рдХ рдорд╛рдорд▓рд╛ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ - рдХрдИ рдкрд░рд┐рджреГрд╢реНрдп рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдП рдЧрдП рд╣реИрдВ, рдХрдИ рд╡рд┐рд░рд╛рд╕рдд рдЬреЗрдПрд╕ рдХреЛрдб рдЬрд┐рдиреНрд╣реЗрдВ рдЗрд╕ рд╡рдЬрд╣ рд╕реЗ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдареАрдХ рд╕реЗ рд╡рд░реНрдгрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ - рд▓реЗрдХрд┐рди рдореБрджреНрджрд╛ рдмрдВрдж рд╣реИред рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЕрдЧрд░ рдЖрдкрдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЬрдореАрдиреА рддрдереНрдп рдмрджрд▓ рдЧрдП рд╣реИрдВ, рддреЛ рдПрдХ рдирдпрд╛ рдЦреЛрд▓реЗрдВ? рдореИрдВ рдкреБрд░рд╛рдиреЗ рддрд░реНрдХреЛрдВ рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрдврд╝рдиреЗ рдкрд░ рдЯреАрдо рдХреА рдиреАрддрд┐ рдирд╣реАрдВ рдЬрд╛рдирддрд╛, рд▓реЗрдХрд┐рди рдореИрдВ рдЖрдкрдХреА рдкреАрда рдердкрдердкрд╛рдКрдВрдЧрд╛ред

рдореИрдВ рдкреБрд░рд╛рдиреЗ рддрд░реНрдХреЛрдВ рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрдврд╝рдиреЗ рдкрд░ рдЯреАрдо рдХреА рдиреАрддрд┐ рдирд╣реАрдВ рдЬрд╛рдирддрд╛, рд▓реЗрдХрд┐рди рдореИрдВ рдЖрдкрдХреА рдкреАрда рдердкрдердкрд╛рдКрдВрдЧрд╛ред

рд╡реЗ рдкрд╣рд▓реЗ рд╕реЗ рдмрдВрдж рд╡рд┐рд╖рдпреЛрдВ рдкрд░ рдкреБрдирд░реНрд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗред рдореБрджреНрджреЗ рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рдЗрд╕ рдмрд╛рдд рдХрд╛ рд╡рд┐рд╢реНрд╡рд╛рд╕ рджрд┐рд▓рд╛рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рд╛рд░реНрдердХ рд╣реИред рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рдпрд╣ рдЖрдо рддреМрд░ рдкрд░ "рдмрд╣реБрдд рдЬрдЯрд┐рд▓" рд╢реНрд░реЗрдгреА рдХреЗ рдЕрдВрддрд░реНрдЧрдд рдЖрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реЛрдЧрд╛ рдХрд┐ рдЯрд╛рдЗрдк рд╕рд┐рд╕реНрдЯрдо рдХреЛ рд╣рд░ рдкрдврд╝рдиреЗ рдФрд░ рд▓рд┐рдЦрдиреЗ рдкрд░ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рднрд╛рд╡рдирд╛ рдХреЛ рддреГрдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрд╕рдореЗрдВ рдбрд╛рд▓рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдФрд░ рд▓рд╛рдЧрдд рд╣реИред рдПрдХ рд╡реИрдз рд▓реЗрдХрд┐рди рдХреБрдЫ рд╣рдж рддрдХ рдЕрд╕рд╛рдорд╛рдиреНрдп рдЙрдкрдпреЛрдЧ рдХрд╛ рдорд╛рдорд▓рд╛ рдЗрд╕рдХреЗ рд▓рд╛рдпрдХ рдирд╣реАрдВ рд╣реИред

рдореЗрд░реА рд╡реНрдпрдХреНрддрд┐рдЧрдд рднрд╛рд╡рдирд╛ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ _рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдореМрдЬреВрджрд╛ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛрдб рдХреЛ рдореЙрдбрд▓ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдЬреЛ рдЗрд╕ рдкреИрдЯрд░реНрди рдХрд╛ рдкреНрд░рднрд╛рд╡реА рдврдВрдЧ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред

рдореИрдВ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдЗрд╕ рдорд╛рдорд▓реЗ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реВрдВрдЧрд╛ рдпрджрд┐ рд╣рдо рд╡рд┐рд░рд╛рд╕рдд рдЬреЗрдПрд╕ рдореБрджреНрджреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХрдард┐рди рд╕рдорд╛рдзрд╛рди рдХреЗ рд╕рд╛рде рдЖрдПред рдореИрдВ рдЕрднреА рднреА рдПрдХ рдЯреАрдПрд╕ рдЧреНрд░реАрдирд╣реЙрд░реНрди рдХреА рддрд░рд╣ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рд╢рд╛рдпрдж рдореЗрд░рд╛ рд╡рд░реНрддрдорд╛рди рд╕рдорд╛рдзрд╛рди (рдордЬрдмреВрд░ рдХрд╛рд╕реНрдЯрд┐рдВрдЧ рдпрд╛ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЧрд╛рд░реНрдб) рдореМрдЬреВрджрд╛ рдХреНрд╖рдорддрд╛рдУрдВ рдХрд╛ рдЗрд╖реНрдЯрддрдо рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рд╣реИ?

рдЗрд╕ рдмрд╛рдд рд╕реЗ рд╕рд╣рдорддред setter рдЗрддрдирд╛ рд╕реАрдорд┐рдд рд╣реЛрдЧрд╛ рдЬрдм рдкреНрд░рдХрд╛рд░ рд╕рдорд╛рди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП... рдХреГрдкрдпрд╛ рд╕реБрдзрд╛рд░реЗрдВред

рдЗрд╕реЗ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд┐рдлрд╛рд░рд┐рд╢реЛрдВ рдХреА рддрд▓рд╛рд╢ рд╣реИ:

get price() {
    return (this._price as number);
  }

  set price(price) {
    this._price = typeof price === 'string' ? parseFloat(parseFloat(price).toFixed(8)) : parseFloat(price.toFixed(8));
  }

рдореИрдВ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рд╕рдВрдЧреНрд░рд╣реАрдд рдореВрд▓реНрдп рдПрдХ рд╕рдВрдЦреНрдпрд╛ рд╣реЛ, рд▓реЗрдХрд┐рди рдореИрдВ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╕реЗ рд╕реЗрдЯрд░ рдореЗрдВ рдлреНрд▓реЛрдЯ рдореЗрдВ рдХрдирд╡рд░реНрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рдЬрдм рднреА рдореИрдВ рдХреЛрдИ рд╕рдВрдкрддреНрддрд┐ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реВрдВ рддреЛ рдореБрдЭреЗ рд╣рд░ рдмрд╛рд░ рдкрд╛рд░реНрд╕рдлреНрд▓реЛрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдлреИрд╕рд▓рд╛ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рд╡реИрдз (рдпрд╛ рдХрдо рд╕реЗ рдХрдо рдЙрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╕реНрд╡реАрдХрд╛рд░реНрдп) рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкреИрдЯрд░реНрди рд╣реИ, рдЬреЛ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЖрдВрддрд░рд┐рдХ рдХреЗ рд╕рд╛рде рдЕрдЪреНрдЫреА рддрд░рд╣ рдлрд┐рдЯ рдирд╣реАрдВ рд╣реИред рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЕрдЧрд░ рдЖрдВрддрд░рд┐рдХ рдмрджрд▓рдирд╛ рдмрд╣реБрдд рдмрдбрд╝рд╛ рдмрджрд▓рд╛рд╡ рд╣реИ, рддреЛ рд╣рдореЗрдВ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХрд╛ рдПрдиреЛрдЯреЗрд╢рди рдорд┐рд▓ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдЯреАрдПрд╕ рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ рдХреИрд╕реЗ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИ? рдХреБрдЫ рдЗрд╕ рддрд░рд╣

class Widget {
  get price(): number | /** <strong i="7">@impossible</strong> */ string | undefined { return this._price; }
  set price(val: number|string|undefined){ ... }
}

let w = new Widget();
w.price = 10;
// Annotation processes as "let p:number|undefined = (w.price as number|undefined)"
let p: number|undefined = w.price;

рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╣рдо TS рдХреЛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░ рд╕рдХреЗрдВ рдХрд┐ TS рдХреЛ JS рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдкреНрд░реА-рдкреНрд░реЛрд╕реЗрд╕рд░ (?) w.price рдХреЗ рд╕рднреА рд░реАрдбреНрд╕ рдХреЛ рдПрдХ рд╕реНрдкрд╖реНрдЯ рдХрд╛рд╕реНрдЯ рдореЗрдВ рдмрджрд▓ рджреЗрддрд╛ рд╣реИред рдмреЗрд╢рдХ, рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдЯреАрдПрд╕ рдПрдиреЛрдЯреЗрд╢рди рдХреИрд╕реЗ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдХреБрд▓ рдХрдЪрд░рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рдЪрд╛рд░ рдпрд╣ рд╣реИ рдХрд┐ рдЯреАрдПрд╕ рдЯреНрд░рд╛рдВрд╕рдкрд┐рд▓рд░ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдЯреАрдПрд╕ рдХреЛ рдЕрдиреНрдп рдЯреАрдПрд╕ рдореЗрдВ рдмрджрд▓рдирд╛ рдЖрд╕рд╛рди рд╣реЛрдЧрд╛ред рдЬреЗрдПрд╕ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИред

рдпрд╣ рдирд╣реАрдВ рдХрд╣ рд░рд╣рд╛ рдХрд┐ рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ set рдХреЗ рд▓рд┐рдП рдмрд╛рдпрдкрд╛рд╕ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реИред рдЖрдИрдПрдордУ get рд╣рдореЗрд╢рд╛ рдПрдХ рд╣реА рдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдкреНрд░рдХрд╛рд░ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдлреА рдЕрдЪреНрдЫрд╛ рдерд╛ред

class Widget {
    get price(): number { return this._price; }
    set price(val){ return this.setPrice(val); } // call another function

    // do processing here
    private setPrice(price: number | string): number {
        let num = Number(price);
        return isNaN(num) ? 0 : num;
    }
}

@iamjoyce widget.price = '123' рдЖрдкрдХреЗ рдХреЛрдб рдореЗрдВ рд╕рдВрдХрд▓рди рддреНрд░реБрдЯрд┐ рдХрд╛ рдЙрддреНрд╕рд░реНрдЬрди рдХрд░рддрд╛ рд╣реИ

@iamjoyce => рдЧрд▓рдд рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╕рдВрдХрд▓рдХ val: number рдореЗрдВ set price(val) рдорд╛рдирддрд╛ рд╣реИ

рд╣рд╛рдБ, рдореИрдВ рднреА рдпрд╣рд╛рдБ рд╣реВрдБ рдХреНрдпреЛрдВрдХрд┐ рдХреЛрдгреАрдп рдХреЗ рдШрдЯрдХреЛрдВ рдХреЗ рдЙрдкрдпреЛрдЧ рд╕реЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЧреЗрдЯрд░/рд╕реЗрдЯрд░ рдкреНрд░рдХрд╛рд░ рдЪрд╛рд╣рддреЗ рд╣реИрдВред

рдпрджрд┐ рдЖрдк рдЗрдирдкреБрдЯ рдкреНрд░реЙрдкрд░реНрдЯреА рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреА рдкрд░рд╡рд╛рд╣ рдХрд┐рдП рдмрд┐рдирд╛ рдорд╛рд░реНрдХрдЕрдк рд╕реЗ рдПрдХ рдШрдЯрдХ рд╕рдВрдкрддреНрддрд┐ (рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ) рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ (рдЬрдм рддрдХ рдХрд┐ рдмрд╛рдзреНрдпрдХрд╛рд░реА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ) рддреЛ рдХреЛрдгреАрдп рд╣рдореЗрд╢рд╛ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЗрдВрдЬреЗрдХреНрдЯ рдХрд░реЗрдЧрд╛ред рддреЛ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рд╣реИ рдХрд┐ рдмрд┐рд▓реНрд▓реА рдЗрд╕ рддрд░рд╣ рд╕реЗ рдореЙрдбрд▓ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛:

private _someProperty: SomeEnum;
set someProperty(value: SomeEnum | string) {
   this._someProperty = this.coerceSomeEnum(value);
} 
get someProperty(): SomeEnum {
  return this._someProperty;
}

рдЖрдЬ, рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЕрдЧрд░ рд╣рдо | string рдХреЛ рдЫреЛрдбрд╝ рджреЗрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рд░реВрдк рд╕реЗ рд╡рд░реНрдгрди рдХрд░реЗрдЧрд╛ рдХрд┐ рдШрдЯрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреЛрдгреАрдп рдХреИрд╕реЗ рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИред рдЙрд╕рдореЗрдВ рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рдХреЛрдб рд╕реЗ рдПрдХреНрд╕реЗрд╕ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╕рдВрдкрддреНрддрд┐ рдХрд╛ рдкреНрд░рдХрд╛рд░ рдорд╛рдпрдиреЗ рд░рдЦрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреА рддрд░рд╣ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рдмрд▓рдкреВрд░реНрд╡рдХ рдмрд▓ рджреЗрдЧрд╛ред

рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд╣рдо рдЖрдо рддреМрд░ рдкрд░ рдпрд╣ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдПрдкреАрдЖрдИ рдХреЛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдбрд┐рдЬрд╛рдЗрди рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдореИрдВ рд╕рд╣рдордд рд╣реВрдВ, рдХрд┐ рдЧреБрдг рдмреЗрд╣рддрд░ рд╣реИрдВ рдпрджрд┐ рд╡реЗ рдХрд╡рд░ рдХреЗ рддрд╣рдд рдЬрд╝рдмрд░рджрд╕реНрддреА рджреБрд╖реНрдкреНрд░рднрд╛рд╡ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЖрд╕рдкрд╛рд╕ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдПрдВрдЧреБрд▓рд░ рдХреЛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдбрд┐рдЬрд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реЛ рдХрд┐ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╕реЗрдЯ рдмрдирд╛рдо рдмрд╛рдзреНрдпрдХрд╛рд░реА рд╕рдВрдкрддреНрддрд┐ рд╕реЗрдЯ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБрдУрдВ рдореЗрдВ рдЖ рдЬрд╛рдПред

рд▓реЗрдХрд┐рди рдЕрдЧрд░ рд╣рдо рдЗрд╕реЗ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рджреЗрдЦреЗрдВ, рддреЛ рдпрд╣ рдорджрджрдЧрд╛рд░ рд╣реИ рдпрджрд┐ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╣рдореЗрдВ рдмрд╛рд╣рд░реА рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХреЛ рдореЙрдбрд▓ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬреЛ рд╣рдорд╛рд░реЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдкрдврд╝рдиреЗ/рд▓рд┐рдЦрдиреЗ рдХреЗ рдкреНрд░рдХрд╛рд░ рд╕рдорд╛рдирддрд╛ рд╕реНрд╡рдпрдВрд╕рд┐рджреНрдз рдХреЛ рдзрддрд╛ рдмрддрд╛рддреЗ рд╣реИрдВред

рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдЧреЗрдЯрдЯрд░ рдкрд░ рдпреВрдирд┐рдпрди рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЕрддреНрдпрдзрд┐рдХ рд╕рдорд╕реНрдпрд╛рдЧреНрд░рд╕реНрдд рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХреЗ рд▓рд┐рдП рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдХрд╖реНрдЯрдкреНрд░рдж рдкреНрд░рдХрд╛рд░ рдХреЗ рдЧрд╛рд░реНрдб/рдЕрднрд┐рдХрдерди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рд▓реЗрдХрд┐рди рдпреВрдирд┐рдпрди рдкреНрд░рдХрд╛рд░ рдХреЛ рд╕реЗрдЯрд░ рдХреЛ рдЫреЛрдбрд╝рдирд╛ рдЧрд▓рдд рд▓рдЧрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдХреЛрдИ рднреА рдЯреВрд▓реАрдВрдЧ рдпрд╣ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдбрд╝рдХ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЧреБрдгреЛрдВ рд╕реЗ рд╕реЗрдЯ рдХреА рдЬрд╛ рд░рд╣реА рд╕рдВрдкрддреНрддрд┐рдпреЛрдВ рдХреЛ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╕реЗ рдЕрд╕рд╛рдЗрди рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рддреЛ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЯрд╛рдЗрдк рд╕рд┐рд╕реНрдЯрдо рдЗрд╕ рдмрд╛рдд рдХреЛ рдкрдХрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИ рдХрд┐ рдмрд╛рд╣рд░реА рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдХреИрд╕реЗ рджреА рдЬрд╛ рд░рд╣реА рд╣реИред рдпрд╣ _рддрддреНрдХрд╛рд▓_ рдмрд╛рдд рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдмрд╛рд╣рд░реА рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЯрд╛рдЗрдк рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд╕рд╛рде рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реНрддрд░ рдкрд░ рдЗрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдЙрдкрднреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЕрдВрддрддрдГ рдорд╛рдпрдиреЗ рд░рдЦрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЯреВрд▓реАрдВрдЧ рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рдмрд╣реБрдд рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЙрдкрднреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рдЙрдкрд░реЛрдХреНрдд рдПрдХ рд╡реНрдпрдХреНрддрд┐ рдиреЗ рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╕рдорд╛рдзрд╛рди рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ рдЬреЛ рдереЛрдбрд╝рд╛ рдЕрдкреНрд░рд┐рдп рд▓рдЧрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╢рд╛рдпрдж рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рд╣рдо рд╕реЗрдЯрд░/рдЧреЗрдЯрд░ рджреЛрдиреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдВрдШ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рд╣реИ рдХрд┐ рд╕рдВрдШ рд╕реЗ рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдЧреЗрдЯрдЯрд░ рдХреЗ рд▓рд┐рдП рдЕрд╕рдВрднрд╡ рд╣реИрдВред рддреЛ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЧреЗрдЯрдЯрд░ рдХреЙрд▓ рд╕рд╛рдЗрдЯ рд╕рд╛рдЗрдЯ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдореЗрдВ рд╡рд┐рдЪрд╛рд░ рд╕реЗ рдкреВрд░реНрд╡ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬреИрд╕реЗ рдХрд┐ рдХрд┐рд╕реА рдиреЗ рдЯрд╛рдЗрдк рдЧрд╛рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдпрд╣ рдЬрд╛рдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдерд╛ рдХрд┐ рд╡реЗ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЧреЗрдЯрдЯрд░ рдкрд░ рд╕рдмрд╕реЗрдЯ рдпреВрдирд┐рдпрди рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд╕реЗрдЯрд░ рдкрд░ рд╕реБрдкрд░рд╕реЗрдЯ рдпреВрдирд┐рдпрди рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдпрд╣ рдХрд╖реНрдЯрдкреНрд░рдж рд▓рдЧрддрд╛ рд╣реИред

рд▓реЗрдХрд┐рди рд╢рд╛рдпрдж рдпрд╣ рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ рдЪреАрдЬреЛрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реИред рдЬрдм рддрдХ рд╕реЗрдЯрд░ рдЧреЗрдЯрд░ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╕рд┐рд░реНрдл рдПрдХ рд╕реБрдкрд░рд╕реЗрдЯ рдпреВрдирд┐рдпрди рд╣реИред рдЧреЗрдЯреНрдЯрд░ рдФрд░ рд╕реЗрдЯрд░ рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ рд╕рдорд╛рди рдорд╛рдиреЗрдВ, рд▓реЗрдХрд┐рди рдЧреЗрдЯрд░ рдХреЗ рдпреВрдирд┐рдпрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдХреБрдЫ рд╣рд┐рд╕реНрд╕реЛрдВ рдХреЛ рдЕрд╕рдВрднрд╡ рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░реЗрдВред рддрд╛рдХрд┐ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдЙрдиреНрд╣реЗрдВ рд╡рд┐рдЪрд╛рд░ рд╕реЗ рд╣рдЯрд╛ рджреЗред рдХреНрдпрд╛ рдпрд╣ рдбрд┐рдЬрд╛рдЗрди рдХреА рдмрд╛рдзрд╛рдУрдВ рдХреЗ рдЖрд╕рдкрд╛рд╕ рд╣реЛрдЧрд╛?

рдКрдкрд░ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдмрддрд╛рдиреЗ рдХреЗ рд▓рд┐рдПред рд╢рд╛рдпрдж рдпрд╣ рдПрдХ рдЙрдкрдпреЛрдЧреА рдмрд╛рдд рд╣реЛрдЧреА, рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рдПрдХ рдпреМрдЧрд┐рдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рднрд╛рдЧреЛрдВ рдХреЛ рдЕрд╕рдВрднрд╡ рд╣реЛрдиреЗ рдХреЗ рд░реВрдк рдореЗрдВ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ред рдпрд╣ рд╕рдорд╛рди рд╕рдВрд░рдЪрдирд╛ рд╡рд╛рд▓реЗ рдХрд┐рд╕реА рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рд╕рдорд╛рдирддрд╛ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ рд▓реЗрдХрд┐рди рдЕрд╕рдВрднрд╡ рд╕рдВрд╢реЛрдзрдХ рдХреЗ рдмрд┐рдирд╛ред рдПрдХ рдЕрд╕рдВрднрд╡ рд╕рдВрд╢реЛрдзрдХ рдХреЗрд╡рд▓ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░реЗрдЧрд╛ред

рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╕реБрдЭрд╛рд╡ рдХреЗ рд░реВрдк рдореЗрдВ, рдпрджрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдкреНрд░рдХрд╛рд░ рдЧрд╛рд░реНрдб рдХреЛ рд╡рд╛рдкрд╕реА рдореВрд▓реНрдп рдкрд░ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдереЗ, рддреЛ рдпрд╣ рднреА рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдЧрд╛ред рдореБрдЭреЗ рдПрд╣рд╕рд╛рд╕ рд╣реИ рдХрд┐ рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ, рдереЛрдбрд╝рд╛ рд╣рд╛рд╕реНрдпрд╛рд╕реНрдкрдж рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд╛рдкрд╕реА рдореВрд▓реНрдп рдХреЗ рд╕рд╛рде-рд╕рд╛рде рддрд░реНрдХреЛрдВ рдкрд░ рдЙрд╕ рддрд░рд╣ рдХреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╣реЛрдиреЗ рд╕реЗ рдЗрди рдХрд┐рдирд╛рд░реЗ рдХреЗ рдорд╛рдорд▓реЛрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдорд┐рд▓реЗрдЧреАред

рд╡рд╛рдкрд╕реА рдореВрд▓реНрдп рдкрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдкреНрд░рдХрд╛рд░ рдЧрд╛рд░реНрдб, рдХреБрдЫ рдРрд╕рд╛ рд╣реЛрдиреЗ рдХрд╛ рд▓рд╛рдн рднреА рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рдХрд┐рд╕реА рд╕рдВрдкрддреНрддрд┐ рдХреЗ рд▓рд┐рдП рд╕реНрдХреНрд╡реИрд╢ рд╣реЛрдиреЗ рдкрд░ рдкреНрд░рдХрд╛рд░ рдХреА рдШреЛрд╖рдгрд╛/рдЗрдВрдЯрд░рдлреЗрд╕ рдореЗрдВ рд╡реНрдпрдХреНрдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ?

рдпрд╣рд╛рдВ рдПрдХ рдФрд░ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реБрдП, mobx-state-tree рдХреБрдЫ рдЕрд▓рдЧ-рдЕрд▓рдЧ рддрд░реАрдХреЛрдВ рд╕реЗ рдПрдХ рд╕рдВрдкрддреНрддрд┐ рдХреЛ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдгреЛрдВ рдФрд░ рд╕реНрдиреИрдкрд╢реЙрдЯ рдкреНрд░рдХрд╛рд░реЛрдВ рд╕реЗ), рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдХрднреА рднреА рдЗрд╕реЗ рдПрдХреНрд╕реЗрд╕рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рд╕реЗ рдПрдХ рд╣реА рдорд╛рдирдХ рддрд░реАрдХреЗ (рдЙрджрд╛рд╣рд░рдгреЛрдВ) рдореЗрдВ рд╡рд╛рдкрд╕ рдХрд░ рджреЗрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдЕрддреНрдпрдВрдд рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ рдпрджрд┐ рдпрд╣ рд╕рдорд░реНрдерд┐рдд рдерд╛ред

рдореИрдВ рдЗрд╕ рддрд░рд╣ рдХреЗ рдЖрд╕рдкрд╛рд╕ рд╣реЛ рд░рд╣рд╛ рд╣реВрдБ:

interface SomeNestedString {
  foo: string;
}

...

private _foo: SomeNestedString | string;

get foo(): SomeNestedString | string {
  return this._foo;
}

set foo(value: SomeNestedString | string) {
  this._foo = (value as SomeNestedString).foo;
}

рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рдЗрд╕ рдореБрджреНрджреЗ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЧреЗрдЯрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдЖрдкрдХреЛ рдЕрднреА рднреА рдЯрд╛рдЗрдк рдЧрд╛рд░реНрдб рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рднрд▓реЗ рд╣реА рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЧреЗрдЯрд░ рдХреЗрд╡рд▓ рдпреВрдирд┐рдпрди рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╕рдмрд╕реЗрдЯ рд▓реМрдЯрд╛рддрд╛ рд╣реИред

рдореИрдВ TSLint рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП any рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдФрд░ рд╕рдВрдХрд▓рдХ рдпрд╛ рддреЛ рд╢рд┐рдХрд╛рдпрдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

export class FooBar {
  private bar: string;

  get foo (): string | any {
    return this.bar;
  }

  set foo (value: Date | string | any) {
    // Type guarding enables IntelliSense in VS Code
    if (value instanceof Date) {
      this.bar = value.toISOString();
    } else if (typeof value === 'string') {
      this.bar = value;
    } else {
      this.bar = String(value); // Or throw an error
    }
  }
}

@jpidelatorre рдЗрд╕ рддрд░рд╣ рдЖрдк рдЯрд╛рдЗрдк рд╕реБрд░рдХреНрд╖рд╛ рдЦреЛ рджреЗрддреЗ рд╣реИрдВред

const fooBar = new FooBar()
const a: number = fooBar.foo // works while it should fail
fooBar.foo = 123 // fails only at runtime, not compile time. It doesnt fail in this particular case with strings and numbers, but it will with something more complex

@keenondrums рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рд╣рдо рдПрдХреНрд╕реЗрд╕рд░реНрд╕ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдореИрдВрдиреЗ рдЬреЛ рдкрд╛рдпрд╛ рд╡рд╣ рдПрдХ рд╕рдорд╛рдзрд╛рди рд╣реИ, рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВред

@jpidelatorre рдореЗрд░рд╛ рд╡рд░реНрддрдорд╛рди рд╕рдорд╛рдзрд╛рди рд╕реЗрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рд╕реА рдЕрдиреНрдп рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ

export class FooBar {
  private bar: string;

  get foo (): string {
    return this.bar;
  }

  setFoo (value: Date | string ) {}
}

@keenondrums рдПрдХреНрд╕реЗрд╕рд░реНрд╕ рдХреА рддрд░рд╣ рджрд┐рдЦрдиреЗ рдореЗрдВ рдЙрддрдирд╛ рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрднреА рддрдХ рдХрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдХрд▓реНрдк рд╣реИред

рдЬрдм рддрдХ рдЖрдк рдПрдХ рдЧреЗрдЯрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рддрдм рддрдХ рдПрдХ рдХреЛрдгреАрдп рдШрдЯрдХ рдкрд░ @input рдЧреБрдгреЛрдВ рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рд▓рд┐рдП рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдореЙрдбрд▓ рдирд╣реАрдВ рд╣реИред

рдЬреЛ рдЕрднреА рдмрд╣реБрдд рдмрджрд╕реВрд░рдд рд╣реИред

рдореБрдЭреЗ рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рднреА рдкрд╕рдВрдж рд╣реИ, рд▓реЗрдХрд┐рди .d.ts рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рдХреЛрдИ рдХрд╛рдордХрд╛рдЬ рдирд╣реАрдВ рд╣реИред рдореИрдВ рдореЛрдЪрд╛ (рдЙрджреНрджреЗрд╢реНрдп-рд╕реА/рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкреБрд▓) рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЙрдЬрд╛рдЧрд░ рдХреБрдЫ рд╡рд░реНрдЧреЛрдВ рдХреЛ рджрд╕реНрддрд╛рд╡реЗрдЬ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдФрд░ рд▓рд┐рдкрдЯреЗ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдЧреБрдгреЛрдВ рдХреЛ рдЗрд╕ рддрд░рд╣ рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

class Foo {
    get bar:()=>number;
    set bar:number;
}

const foo = new Foo();
foo.bar = 3;
foo.bar(); // 3

рдореИрдВрдиреЗ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдорд╛рдорд▓реЗ рднреА рджреЗрдЦреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рдПрдХ рдПрдкреАрдЖрдИ рдЖрдкрдХреЛ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕реЗ рдореЗрд▓ рдЦрд╛рдиреЗ рд╡рд╛рд▓реА рд╡рд╕реНрддреБ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдВрдкрддреНрддрд┐ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЧреЗрдЯрд░ рд╣рдореЗрд╢рд╛ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╡рд░реНрдЧ рдХрд╛ рдЙрджрд╛рд╣рд░рдг рджреЗрддрд╛ рд╣реИ:

interface IFoo {
    bar: string;
}

class Foo implements IFoo {
    bar: string;
    toString():string;
}

class Example {
    get foo:Foo;
    set foo:Foo|IFoo;
}

рдореИрдВ рдЗрд╕ рдореБрджреНрджреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХрд╛рдлреА рд╣рдж рддрдХ рднреВрд▓ рдЧрдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдЗрд╕ рдкрд░ рд╡рд╛рдкрд╕ рдкрдврд╝рддреЗ рд╕рдордп рдореЗрд░реЗ рдорди рдореЗрдВ рдПрдХ рд╡рд┐рдЪрд╛рд░ рдЖрдпрд╛ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдордиреЗ рдЗрд╕ рд╡рд┐рдЪрд╛рд░ рдкрд░ рд╕рдордЭреМрддрд╛ рдХрд░ рд▓рд┐рдпрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рд╛рд░ рдореЗрдВ рдХрд░рдиреЗ рд▓рд╛рдпрдХ рд╣реИ, рд▓реЗрдХрд┐рди рддрдХрдиреАрдХреА рд░реВрдк рд╕реЗ рдмрд╣реБрдд рдЬрдЯрд┐рд▓ рд╣реИред рдпрд╣ рдПрдХ рдЯреНрд░реЗрдбрдСрдлрд╝ рдЧрдгрдирд╛ рд╣реИ - рдпрд╣ рддрдХрдиреАрдХреА рд░реВрдк рд╕реЗ рдЕрд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ, рдпрд╣ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордп рдФрд░ рдкреНрд░рдпрд╛рд╕ (рдФрд░ рдЕрддрд┐рд░рд┐рдХреНрдд рдХреЛрдб рдЬрдЯрд┐рд▓рддрд╛) рдХреЗ рд▓рд╛рдпрдХ рдирд╣реАрдВ рд╣реИред рд╕рд╣реА?

рдХреНрдпрд╛ рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдХреЛрд░ рдбреАрдУрдПрдо рдПрдкреАрдЖрдИ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рдмрдирд╛рддрд╛ рд╣реИ рдЬреЛ рдЧрдгрд┐рдд рдХреЛ рдмрд┐рд▓реНрдХреБрд▓ рдмрджрд▓рддрд╛ рд╣реИ? @RyanCavanaugh рдХрд╣рддреЗ рд╣реИрдВ

рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕ рд╡рд┐рдЪрд╛рд░ рдкрд░ рдЖрдкрддреНрддрд┐ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдЗрд╕ рдХреЛрдб foo.bar = "hello"; console.log(foo.bar); рдХреЛ рдХрднреА рднреА "рд╣реИрд▓реЛ" рд╕реЗ рдХреБрдЫ рднреА рдРрд╕реА рднрд╛рд╖рд╛ рдореЗрдВ рдкреНрд░рд┐рдВрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рд╕рдордЭрджрд╛рд░ рдЕрд░реНрдерд╢рд╛рд╕реНрддреНрд░ рд░рдЦрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реИред

рд╣рдо рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП , рд▓реЗрдХрд┐рди рдбреЛрдо рдиреЗ рд╣рдореЗрд╢рд╛ el.hidden=1; console.log(el.hidden) // <-- true, not 1 рдЬреИрд╕реА рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд┐рдпрд╛ рд╣реИред рдпрд╣ рдХреЗрд╡рд▓ рдПрдХ рдкреИрдЯрд░реНрди рдирд╣реАрдВ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдХреБрдЫ рд▓реЛрдЧ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдпрд╣ рд╕рд┐рд░реНрдл рдПрдХ рд▓реЛрдХрдкреНрд░рд┐рдп рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдПрдХ рдореВрд▓ рд╕рд┐рджреНрдзрд╛рдВрдд рд╣реИ рдХрд┐ JS рдиреЗ рд╣рдореЗрд╢рд╛ рдХреИрд╕реЗ рдХрд╛рдо рдХрд┐рдпрд╛ рд╣реИ - DWIM рдХрд╛ рдПрдХ рд╕рд╛ рд╣рд┐рд╕реНрд╕рд╛ рднрд╛рд╖рд╛ рдХреА рдЖрддреНрдорд╛ рдореЗрдВ рдмреЗрдХ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ - рдФрд░ рднрд╛рд╖рд╛ рдХреЗ рд╕реНрддрд░ рдкрд░ рдЗрд╕реЗ рдЕрд╕рдВрднрд╡ рдмрдирд╛рдирд╛ TS рдХреЗ рдореВрд▓рднреВрдд рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЛ рддреЛрдбрд╝рддрд╛ рд╣реИ, рдХрд┐ рдпрд╣ JS рдХрд╛ "рд╕реБрдкрд░рд╕реЗрдЯ" рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред . рдпрд╣ рдПрдХ рдмрджрд╕реВрд░рдд рдмреБрд▓рдмреБрд▓рд╛ рд╣реИ рдЬреЛ рд╡реЗрди рдЖрд░реЗрдЦ рд╕реЗ рдирд┐рдХрд▓рд╛ рд╣реИ, рдФрд░ рд╣рдореЗрдВ рдЗрд╕реЗ рдирд╣реАрдВ рднреВрд▓рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдореБрдЭреЗ рдЕрднреА рднреА рдПрдХ рд╣реА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реЗрдЯрд░/рдЧреЗрдЯрд░ рд░рдЦрдиреЗ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдкрд╕рдВрдж рд╣реИ:

number | boolean

рд▓реЗрдХрд┐рди рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЯрд╛рдЗрдкрдЧрд╛рд░реНрдб рдХрд╛ рдкрд░рд┐рдЪрдп рджреЗрдирд╛ рдЬрд╣рд╛рдВ рдЖрдк рдпрд╣ рд╕рдВрдХреЗрдд рджреЗ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐, рдЬрдмрдХрд┐ рддрдХрдиреАрдХреА рд░реВрдк рд╕реЗ рдЧреЗрдЯрд░ рдХрд╛ рдПрдХ рд╣реА рд╕рдВрдШ рдкреНрд░рдХрд╛рд░ рд╣реИ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рдХреЗрд╡рд▓ рд╕рдВрдШ рдореЗрдВ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдПрдХ рд╕рдмрд╕реЗрдЯ рд▓реМрдЯрд╛рдПрдЧрд╛ред рдХреНрдпрд╛ рдЗрд╕реЗ рдЧреЗрдЯрдЯрд░ (рдПрдХ рдЕрдиреБрдорд╛рди рдкреНрд░рд╡рд╛рд╣ рдЪреАрдЬрд╝?) рдкрд░ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреА рд╕рдВрдХреАрд░реНрдгрддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдирд╣реАрдВ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕реЗ рдЯрд╛рдЗрдк рдореЙрдбрд▓ рдореЗрдВ рд╕рдВрд╢реЛрдзрди рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рд╕рд░рд▓ рдмрдирд╛рддреЗ рд╣реИрдВ? (рд╡рд╣ рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ рдЖрдВрддрд░рд┐рдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рднреА рдирд╣реАрдВ рдЬрд╛рдирддреЗ...)

рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ, рдпрд╣ рдХреЗрд╡рд▓ рдирд┐рд╣рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдпрджрд┐ рдЧреЗрдЯрд░ рдкрд░ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ рдкреНрд░рдХрд╛рд░ рд╕реЗрдЯрд░реНрд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╕рдЦреНрдд рд╕рдмрд╕реЗрдЯ рдерд╛?

рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ, рдпрд╣ рдХреЗрд╡рд▓ рдирд┐рд╣рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдпрджрд┐ рдЧреЗрдЯрд░ рдкрд░ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ рдкреНрд░рдХрд╛рд░ рд╕реЗрдЯрд░реНрд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╕рдЦреНрдд рд╕рдмрд╕реЗрдЯ рдерд╛?

!

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рд╕рднреА рдЗрд╕ рдмрд╛рдд рд╕реЗ рд╕рд╣рдордд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЖрдкрдХреЛ рдРрд╕рд╛ рдкреНрд░рдХрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдирд╣реАрдВ рдерд╛; рдореИрдВ get рдкрд░ рдЯрд╛рдЗрдк рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╕рдВрдХреАрд░реНрдг рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рддрд╛рдХрд┐ рдореИрдВ рдЬрд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рд╣рдореЗрд╢рд╛ рд░рд╣реЗрдЧрд╛ред

рдореБрдЭреЗ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрддрд╛ рдХрд┐ рдХреНрдпреЛрдВ рдХреБрдЫ рдЖрдкрддреНрддрд┐ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдЯрд╛рдЗрдк рд╕реБрд░рдХреНрд╖рд╛ рдФрд░ рд╕рднреА рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рдХрд░реЗрдЧрд╛ред рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреА рд╕реБрд░рдХреНрд╖рд╛ рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рдХрд░рддрд╛ рд╣реИ рдпрджрд┐ рд╣рдо рдХрдо рд╕реЗ рдХрдо рд╕реЗрдЯрд░ рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреНрд░рдХрд╛рд░ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдЪреЗрдХ рд╣реИ рдХрд┐ рдЖрдк рдХрд┐рд╕реА рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреЛ рдХрд┐рд╕реА рд╕рдВрдкрддреНрддрд┐ рдкрд░ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрдВрдЧреЗред
рднреВрддрдкреВрд░реНрд╡:
рдорд╛рди рд▓реЗрдВ рдХрд┐ рдореЗрд░реЗ рдкрд╛рд╕ рдРрд░реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рд╕рдВрдкрддреНрддрд┐ рд╣реИрд▓реЗрдХрд┐рди рдбреАрдмреА рд╕реЗ рдЗрд╕реЗ рдХреЙрдорд╛ рдЕрд▓рдЧрд╛рд╡ рдХреЗ рд╕рд╛рде рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд╛рдкрд╕ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЬреИрд╕реЗ '10,20,40' рдХрд╣реЗрдВред рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕реЗ рдЕрднреА рдореЛрдб рдкреНрд░реЙрдкрд░реНрдЯреА рдореЗрдВ рдореИрдк рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛, рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдЖрдк рдЕрдиреБрдорддрд┐ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ рддреЛ рдпрд╣ рдмрд╣реБрдд рдорджрджрдЧрд╛рд░ рд╣реЛрдЧрд╛

рдирд┐рдЬреА _рдХрд░реНрдордЪрд╛рд░реА рдЖрдИрдбреА рд╕реВрдЪреА: рд╕рдВрдЦреНрдпрд╛ []

рдХрд░реНрдордЪрд╛рд░реА рдЖрдИрдбреА рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ (): рд╕рдВрдЦреНрдпрд╛ [] {
рдЗрд╕реЗ рд╡рд╛рдкрд╕ рдХрд░реЗрдВред_рдХрд░реНрдордЪрд╛рд░реАIdList;
}
рдХрд░реНрдордЪрд╛рд░реА рдЖрдИрдбреА рд╕реВрдЪреА рд╕реЗрдЯ рдХрд░реЗрдВ (_idList: рдХреЛрдИ рднреА ) {
рдЕрдЧрд░ (рдЯрд╛рдЗрдкрдСрдлрд╝ _idList == 'рд╕реНрдЯреНрд░рд┐рдВрдЧ') {
this._employeeIdList = _idList.split(',').map(d => Number(d));
}
рдФрд░ рдЕрдЧрд░ (рдЯрд╛рдЗрдкрдСрдлрд╝ _idList== 'рдСрдмреНрдЬреЗрдХреНрдЯ') {
this._employeeIdList = _idList рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд░реВрдк рдореЗрдВ [];
}
}

рдореИрдВ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рд╣рд▓ рдХрд░ рд▓реЗрддрд╛ рдФрд░ рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИ, рднрд▓реЗ рд╣реА рдЖрдк SET рдореЗрдВ рдПрдХ рдЕрд▓рдЧ рдкреНрд░рдХрд╛рд░ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рдпрд╣ рд╣рдореЗрдВ рд╕рдВрдкрддреНрддрд┐ рдХреЛ рдЧрд▓рдд рдкреНрд░рдХрд╛рд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рд╕реЗ рд░реЛрдХрддрд╛ рд╣реИред рддреЛ рдЬреАрддреЛ рдЬреАрддреЛред рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдЯреАрдо рдХреЗ рд╕рджрд╕реНрдп рдЕрдкрдирд╛ рдЕрд╣рдВрдХрд╛рд░ рдЫреЛрдбрд╝ рджреЗрдВрдЧреЗ рдФрд░ рдЙрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╕реЛрдЪрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВрдЧреЗ рдЬреЛ рдЗрд╕реЗ рдкреИрджрд╛ рдХрд░рддреА рд╣реИ рдФрд░ рдЗрд╕реЗ рдареАрдХ рдХрд░рддреА рд╣реИред

рдореИрдВ рдЗрд╕рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдореБрдЭреЗ рдЕрднреА рднреА рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореМрдЬреВрджрд╛ рдЬреЗрдПрд╕ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдореЙрдбрд▓рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдирд╛рдХ рдХреЛ рдЪрд╛рд▓реВ рдХрд░рдирд╛ рдФрд░ рдПрдХ рд╕реЗрдЯрд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реИ рдЬреЛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЛ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рдмрд╕реЗрдЯ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╣рдореЗрд╢рд╛ рдЙрд╕ рд╕рдмрд╕реЗрдЯ рдХреЛ рдХреЛрдб рдЧрдВрдз рдХреЗ рд░реВрдк рдореЗрдВ рдЧреЗрдЯрдЯрд░ рдореЗрдВ рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рдЬреЗрдПрд╕ рднреВрдорд┐ рдореЗрдВ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╕рд╛рдорд╛рдиреНрдп рдкреИрдЯрд░реНрди рд╣реИ .

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЗрд╕ рдорд╛рдпрдиреЗ рдореЗрдВ рдкреНрдпрд╛рд░рд╛ рд╣реИ рдХрд┐ рдпрд╣ рдореМрдЬреВрджрд╛ рдЬреЗрдПрд╕ рдПрдкреАрдЖрдИ рдХреЗ рдХреИрдЧрд░реАрдЬ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╕рдордп рд╣рдореЗрдВ рдмрд╣реБрдд рдЕрднрд┐рд╡реНрдпрдВрдЬрдХ рд╣реЛрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рднрд▓реЗ рд╣реА рдЙрдирдХреЗ рдкрд╛рд╕ рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ рд╕рдВрд░рдЪрд┐рдд рдПрдкреАрдЖрдИ рди рд╣реЛрдВред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдкрд░рд┐рджреГрд╢реНрдп рд╣реИ рдЬрд╣рд╛рдВ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╣рдореЗрдВ рдпрд╣ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдкреВрд░реНрдг рдереЗ рдХрд┐ рдЧреЗрдЯрд░ рд╣рдореЗрд╢рд╛ рдПрдХ рдкреНрд░рдХрд╛рд░ рд▓реМрдЯрд╛рдПрдЧрд╛ рдЬреЛ рдЧреЗрдЯрд░ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╕рдЦреНрдд рд╕рдмрд╕реЗрдЯ рд╣реИ, рдЗрд╕рд╕реЗ рдореМрдЬреВрджрд╛ рдПрдкреАрдЖрдИ рдореЙрдбрд▓рд┐рдВрдЧ рдореЗрдВ рдЬрдмрд░рджрд╕реНрдд рдореВрд▓реНрдп рдЬреЛрдбрд╝ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдбреЛрдо!

рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рдкреНрд░рдХрд╛рд░ DOM XSS рд╕реЗ рд▓рдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ рдмреНрд░рд╛рдЙрдЬрд╝рд░ API рдкреНрд░рд╕реНрддрд╛рд╡ рд╣реИред рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХреНрд░реЛрдорд┐рдпрдо (рдЭрдВрдбреЗ рдХреЗ рдкреАрдЫреЗ) рдореЗрдВ рд▓рд╛рдЧреВ рд╣реИред рдПрдкреАрдЖрдИ рдХрд╛ рдмрдбрд╝рд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рднрд┐рдиреНрди рдбреАрдУрдПрдо рдЧреБрдгреЛрдВ рдХреЗ рд╕реЗрдЯрд░реНрд╕ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, .innerHTML TrustedHTML | string $ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ рдЬрдмрдХрд┐ рдпрд╣ рд╣рдореЗрд╢рд╛ string рд▓реМрдЯрд╛рддрд╛ рд╣реИред рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдПрдкреАрдЖрдИ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред

рдкрд┐рдЫрд▓реА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рд╕реЗ рдЕрдВрддрд░ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдПрдкреАрдЖрдИ рд╣реИ (рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛-рднреВрдорд┐ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдирд╣реАрдВ) рдЬрд┐рд╕реЗ рдЖрд╕рд╛рдиреА рд╕реЗ рдмрджрд▓рд╛ рдирд╣реАрдВ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╕рд╛рде рд╣реА Element.innerHTML any рдмрджрд▓рдиреЗ рдХрд╛ рдкреНрд░рднрд╛рд╡ (рдЬреЛ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдПрдХрдорд╛рддреНрд░ рд╕рдВрднрд╡ рд╕рдорд╛рдзрд╛рди рд╣реИ) рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛-рднреВрдорд┐ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рд╕рдЯреАрдХ рд╡рд░реНрдгрди рдХрд░рдиреЗ рд╕реЗ рдмрдбрд╝рд╛ рд╣реИред

рдХреНрдпрд╛ рдЗрд╕ рдкреБрд▓-рдЕрдиреБрд░реЛрдз рдХреЛ рдлрд┐рд░ рд╕реЗ рдЦреЛрд▓рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ? рдпрд╛ рдХреНрдпрд╛ рдЕрдиреНрдп рд╕рдорд╛рдзрд╛рди рд╣реИрдВ рдЬреЛ рдореБрдЭреЗ рдпрд╛рдж рдЖ рд░рд╣реЗ рд╣реИрдВ?

рд╕реАрд╕реА: @mprobst , @kotoред

рдЯрд╛рдЗрдк рдпреВрдирд┐рдпрди рдЬреИрд╕реЗ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рд╡рд╛рд▓реА рднрд╛рд╖рд╛ рдореЗрдВ, рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рдФрд░ рдмрд┐рдХреНрд░реА рдмрд┐рдВрджреБ рд╣реИред

@RyanCavanaugh рддрдм рднреА рдЬрдм рдЧреЗрдЯрд░ рдФрд░ рд╕реЗрдЯрд░ рдХрд╛ рдПрдХ рд╣реА рдкреНрд░рдХрд╛рд░ рд╣реЛрддрд╛ рд╣реИ, рдпрд╣ рдЧрд╛рд░рдВрдЯреА рдирд╣реАрдВ рд╣реИ рдХрд┐ o.x === y рдХреЗ рдмрд╛рдж o.x = y рдХреНрдпреЛрдВрдХрд┐ рд╕реЗрдЯрд░ рдореВрд▓реНрдп рдХреЛ рдмрдЪрд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдХреБрдЫ рд╕реНрд╡рдЪреНрдЫрддрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИред

element.scrollTop = -100;
element.scrollTop; // returns 0

рдореИрдВ @vrana рджреНрд╡рд╛рд░рд╛ рджреВрд╕рд░реА рдЪрд┐рдВрддрд╛ рдХрд░рддрд╛ рд╣реВрдВред рд╡рд░реНрддрдорд╛рди рд╡реНрдпрд╡рд╣рд╛рд░ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдХреБрдЫ рдореМрдЬреВрджрд╛ рдПрдкреАрдЖрдИ рдХреЛ рдореЙрдбрд▓ рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рдмрдирд╛рддрд╛ рд╣реИред

рдпрд╣ рд╡реЗрдм рдПрдкреАрдЖрдИ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╕рдЪ рд╣реИ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдмрд╣реБрдд рд╕реЗ рд╕реЗрдЯрд░ рдФрд░ рдЧреЗрдЯрд░ рдкреНрд░рдХрд╛рд░ рднрд┐рдиреНрди рд╣реЛрддреЗ рд╣реИрдВред рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рд╡реЗрдм рдПрдкреАрдЖрдИ рд╕реЗрдЯрд░реНрд╕ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдЬрдмрд░рджрд╕реНрддреА рдХрд░рддреЗ рд╣реИрдВ, рдЙрдирдореЗрдВ рд╕реЗ рдХреБрдЫ рд╕реАрдзреЗ рдХрд┐рд╕реА рджрд┐рдП рдЧрдП рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдлреАрдЪрд░ рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╣реЛрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЙрдирдореЗрдВ рд╕реЗ рдЕрдзрд┐рдХрддрд░ рдЖрдИрдбреАрдПрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдирд┐рд╣рд┐рдд рд╣реЛрддреЗ рд╣реИрдВред рдмрд╣реБрдд рд╕реЗ рд╕реЗрдЯрд░реНрд╕ рдореВрд▓реНрдп рдХреЛ рднреА рдмрджрд▓рддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд╕реНрдерд╛рди рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕реНрдкреЗрдХ рджреЗрдЦреЗрдВред рдпрд╣ рдПрдХ рдПрдХрд▓ рдбреЗрд╡рд▓рдкрд░ рдЧрд▓рддреА рдирд╣реАрдВ рд╣реИ - рдпрд╣ рдПрдкреАрдЖрдИ рдХрд╛ рдПрдХ рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рд╣реИ рдЬрд┐рд╕рдХреЗ рдЦрд┐рд▓рд╛рдл рд╡реЗрдм рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛрдб рдХрд░рддреЗ рд╣реИрдВред

рдЧреЗрдЯреНрдЯрд░ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдХрдо рдХрд░рдиреЗ рд╕реЗ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдЙрди рдПрдкреАрдЖрдИ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдорд┐рд▓рддреА рд╣реИ, рдЬреЛ рдЕрдм рдЕрд╕рдВрднрд╡ рд╣реИред

рдЖрдк рдЙрди рдПрдкреАрдЖрдИ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдХрд╣рдирд╛ рд╕рд╣реА рд╣реИ рдХрд┐ рд╕рдВрдкрддреНрддрд┐ рдХрд╛ рдкреНрд░рдХрд╛рд░ рдЙрди рд╕рдВрднрд╛рд╡рд┐рдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рд╕рдВрдШ рд╣реИ рдЬреЛ рдЖрдк рд╕реЗрдЯрд░ рдХреЛ рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдЧреЗрдЯрдЯрд░ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЗрд╕ рддрд░рд╣ рд╕реЗ рдПрдкреАрдЖрдИ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдирд╛ _рдХреБрд╢рд▓_ рдирд╣реАрдВ рд╣реИред рдЖрдкрдХреЛ рдЙрдкрднреЛрдХреНрддрд╛ рдХреЛ рд╣рд░ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЧрд╛рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдХрд┐ рд╡реЗ рд╕рдВрднрд╛рд╡рд┐рдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЧреЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред

рдпрд╣ рдареАрдХ рд╣реИ рдЕрдЧрд░ рдЖрдкрдиреЗ рдЗрд╕реЗ рд╕реНрд╡рдпрдВрд╕рд┐рджреНрдз рдирд╣реАрдВ рдмрдирд╛рдпрд╛ рд╣реИ рдХрд┐ рдЖрдк рд╣рдореЗрд╢рд╛ рдПрдХ рдЧреЗрдЯрд░ рд╕реЗ рдПрдХ рд╕рдВрдХреБрдЪрд┐рдд рдкреНрд░рдХрд╛рд░ рд▓реМрдЯрд╛рдПрдВрдЧреЗ, рдХреНрдпреЛрдВрдХрд┐ рдХрдИ рд╡реЗрдм рдПрдкреАрдЖрдИ рднреА рдЕрдкрдиреЗ рд╕реНрдкреЗрдХ рдореЗрдВ рд▓реЙрдХ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВред

рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдПрдХ рдкрд▓ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдЕрд▓рдЧ рдХрд░рдирд╛, рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдПрдкреАрдЖрдИ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдирд╛, рдПрдХ рд╕реЗрдЯрд░ рдкрд░ рд╕рдВрдШ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдордЬрдмреВрдд рдЙрдкрдпреЛрдЧ рдХрд╛ рдорд╛рдорд▓рд╛ "рд╕реНрдХреНрд░рд┐рдкреНрдЯреА" рд╣реИред рд╣рдо рдХрдИ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрд╕рддрдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рд╣рдо рд╕реНрд╡реАрдХрд╛рд░реНрдп рд░реВрдк рд╕реЗ рдЙрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рд╣рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЪрд╛рд╣рддреЗ рд╣реИрдВред

рдЗрд╕рдХреА рдЕрдиреБрдорддрд┐ рдХреНрдпреЛрдВ рджреЗрдВ? рдЙрдкрдпреЛрдЧ рдореЗрдВ рдЖрд╕рд╛рдиреАред

рдпрд╣ рдЙрди рдПрдкреАрдЖрдИ рдХреЗ рд▓рд┐рдП рдорд╛рдпрдиреЗ рдирд╣реАрдВ рд░рдЦрддрд╛ рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдк рдЕрдкрдиреА рдЯреАрдо рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ рд╡рд┐рдХрд╕рд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ, рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдЦрдкрдд рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдП рдЧрдП рдПрдкреАрдЖрдИ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдорд╛рдпрдиреЗ рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВред

рдпрд╣ рдкреНрдпрд╛рд░рд╛ рд╣реИ рдХрд┐ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╣рдореЗрдВ рдПрдХ рдПрдкреАрдЖрдИ рдХрд╛ рд╕рдЯреАрдХ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗ рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рд╕рдиреЗ рдЗрд╕рдХреЗ рдХреБрдЫ рдЧреБрдгреЛрдВ рдХреЗ рд▓рд┐рдП рд╕реНрд╡реАрдХрд╛рд░реНрдп рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдЖрд░рд╛рдо рджрд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд▓рд╛рдн рджреВрд╕рд░реЗ рдЫреЛрд░ рдкрд░ рдШрд░реНрд╖рдг рд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рд╣реЛрддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдЧреЗрдЯрд░ рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрддреНрдпрдзрд┐рдХ рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рдВрдЪ/рд░рдХреНрд╖рд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ , рдЬрд┐рд╕реЗ рд╣рдо _рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рдкрд╕рдВрдж рдХрд░реЗрдВрдЧреЗред

рдореЗрд░рд╛ рддрд░реНрдХ рд╣реИ рдХрд┐ @RyanCavanaugh рдХреЗ рдЖрджрд░реНрд╢ рдорд╛рдорд▓реЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдпрд╣ рдПрдХ рдЕрд▓рдЧ рдкрд░рд┐рджреГрд╢реНрдп рд╣реИред рдЙрд╕ рдорд╛рдорд▓реЗ рдХрд╛ рддрд╛рддреНрдкрд░реНрдп рд╣реИ рдХрд┐ рдЖрдк рдЧреЗрдЯреНрдЯрд░ рдФрд░ рд╕реЗрдЯрд░ рдХреЗ рдкрд╛рд╕ рд╣рдореЗрд╢рд╛ рдПрдХ рд╣реА рдпреВрдирд┐рдпрди рдкреНрд░рдХрд╛рд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХреЗ рдмреИрдХрд┐рдВрдЧ рдлрд╝реАрд▓реНрдб рдореЗрдВ рднреА рдПрдХ рд╣реА рдпреВрдирд┐рдпрди рдкреНрд░рдХрд╛рд░ рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдЖрдк рд╣рдореЗрд╢рд╛ рдЙрд╕ рдореВрд▓реНрдп рдХреЛ рдЧреЛрд▓ рдХрд░ рджреЗрдВрдЧреЗ, рдФрд░ рдЗрд╕рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд┐рд░реНрдл рдмрдХрд╡рд╛рд╕ рд╣реИред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдорд╛рдорд▓рд╛ рд╕рдВрдШ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдЕрдзрд┐рдХ рдЖрджрд░реНрд╢реАрдХреГрдд рдЙрдкрдпреЛрдЧ рдХреЗ рдЖрд╕рдкрд╛рд╕ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдЖрдк рдирд┐рд░реНрдорд┐рдд рдкреНрд░рдХрд╛рд░реЛрдВ рд╕реЗ рдирд┐рдкрдЯ рд░рд╣реЗ рд╣реИрдВ рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрд╕ рд╕рдВрдШ рдкреНрд░рдХрд╛рд░ рдХреЛ рдПрдХ рдЕрд░реНрдердкреВрд░реНрдг рдЗрдХрд╛рдИ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рди рд░рд╣реЗ рд╣реИрдВ, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рд╢рд╛рдпрдж рдЙрдкрдирд╛рдо рдмрдирд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдерд╛ред

type urlRep = string | Url;

рдЬреНрдпрд╛рджрд╛рддрд░ рдЪреАрдЬреЗрдВ рдмрд╕ рдЗрд╕рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдШреВрдорддреА рд╣реИрдВ, рдФрд░ рдХреЗрд╡рд▓ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░реЙрдкреНрд╕ рд╕реЗ рдирд┐рдкрдЯрддреА рд╣реИрдВ, рдФрд░ рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЖрдк рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЧрд╛рд░реНрдб рдХреЗ рд╕рд╛рде рдмреНрд▓реИрдХ рдмреЙрдХреНрд╕ рдХреЛ рддреЛрдбрд╝ рджреЗрдВрдЧреЗред

рдореИрдВ рддрд░реНрдХ рджреВрдВрдЧрд╛ рдХрд┐ рд╣рдо рдпрд╣рд╛рдВ рдЬреЛ рд╡рд░реНрдгрди рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЙрд╕рд╕реЗ рдмрд┐рд▓реНрдХреБрд▓ рдЕрд▓рдЧ рдкрд░рд┐рджреГрд╢реНрдп рд╣реИред рд╣рдо рдЬреЛ рд╡рд░реНрдгрди рдХрд░ рд░рд╣реЗ рд╣реИрдВ рд╡рд╣ рд╡рд╛рд╕реНрддрд╡рд┐рдХрддрд╛ рд╣реИ рдХрд┐ рд╕рд╛рдорд╛рдиреНрдп/рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдЙрдкрдпреЛрдЧ рдПрдкреАрдЖрдИ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЬреИрд╕реА рд╕реНрдХреНрд░рд┐рдкреНрдЯрд┐рдВрдЧ рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдЕрдХреНрд╕рд░ рдПрдХ рд╕реЗрдЯрд░ рдХреЗ рд▓рд┐рдП рд╕реНрд╡реАрдХрд╛рд░реНрдп рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдЬрд╛рдирдмреВрдЭрдХрд░ рдЖрд░рд╛рдо рджреЗрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдРрд╕реЗ рдХрдИ рдкреНрд░рдХрд╛рд░ рд╣реИрдВ рдЬреЛ рд╡реЗ рдЖрджрд░реНрд╢ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╣рдордд рд╣реЛрдВрдЧреЗ, рдЗрд╕рд▓рд┐рдП рд╡реЗ рдЗрд╕реЗ рдЙрди рд╕рднреА рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬреАрд╡рди рд╕реБрдзрд╛рд░ рдХреА рдЧреБрдгрд╡рддреНрддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдкреЗрд╢ рдХрд░рддреЗ рд╣реИрдВред

рдпрджрд┐ рдЖрдк рдПрдкреАрдЖрдИ рдХреЗ рдирд┐рд░реНрдорд╛рддрд╛ рдФрд░ рдЙрдкрднреЛрдХреНрддрд╛ рджреЛрдиреЛрдВ рд╣реИрдВ, рддреЛ рдЗрд╕ рддрд░рд╣ рдХреА рдмрд╛рдд рдмреЗрдорд╛рдиреА рд▓рдЧ рд╕рдХрддреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕рд┐рд░реНрдл рдЕрдзрд┐рдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдк рдмрдбрд╝реЗ рдкреИрдорд╛рдиреЗ рдкрд░ рдЦрдкрдд рдХреЗ рд▓рд┐рдП рдПрдкреАрдЖрдИ рдбрд┐рдЬрд╛рдЗрди рдХрд░ рд░рд╣реЗ рд╣реИрдВ рддреЛ рдпрд╣ рдмрд╣реБрдд рдорд╛рдпрдиреЗ рд░рдЦрддрд╛ рд╣реИред

рдФрд░ рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдХреЛрдИ рднреА рдХрднреА рднреА рд╕реЗрдЯрд░/рдЧреЗрдЯрд░ рдХреЗ рд▓рд┐рдП _disjoint_ рдкреНрд░рдХрд╛рд░ рд░рдЦрдирд╛ рдЪрд╛рд╣реЗрдЧрд╛ред рдпрд╣рд╛рдВ рдЬрд┐рд╕ рдмрд╛рдд рдкрд░ рдЪрд░реНрдЪрд╛ рдХреА рдЬрд╛ рд░рд╣реА рд╣реИ, рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рдПрдкреАрдЖрдИ рдирд┐рд░реНрдорд╛рддрд╛ рдПрдкреАрдЖрдИ рдЙрдкрднреЛрдХреНрддрд╛ рд╕реЗ рдХрд╣рддрд╛ рд╣реИ рдХрд┐ рдЧреЗрдЯрд░ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдПрдХ рдореВрд▓реНрдп рд▓реМрдЯрд╛рдПрдЧрд╛ рдЬреЛ рдХрд┐ рд╕реЗрдЯрд░ рдХреЗ рд╕рдВрдШ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдПрдХ рд╕рдЦреНрдд рд╕рдмрд╕реЗрдЯ рд╣реИред

рдФрд░ рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдХреЛрдИ рднреА рдХрднреА рднреА рд╕реЗрдЯрд░/рдЧреЗрдЯрд░ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдЪрд╛рд╣реЗрдЧрд╛ред

рдмрд╕ рдЙрд╕ рдкрд░ рдПрдХ рдкреНрд░рддрд┐ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рдореИрдВ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдРрд╕рд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рд╕реЗрдЯрд░/рдЧреЗрдЯрд░ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреНрд░рдХрд╛рд░ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХрд╛рдиреВрдиреА рд╣реИрдВред рдФрд░ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рд╛рдердорд┐рдХ рд▓рдХреНрд╖реНрдп рдЯрд╛рдЗрдкрд╕рд┐рд╕реНрдЯрдо рдХреЛ рдкрд░реНрдпрд╛рдкреНрдд рд░реВрдк рд╕реЗ рдЕрднрд┐рд╡реНрдпрдВрдЬрдХ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рдХрд┐ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдХрд╛рдиреВрдиреА рд╣реИ (рдХрдо рд╕реЗ рдХрдо .d.ts рд╕реНрддрд░ рдкрд░) рдХреБрдЫ рднреА рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдПрдХ рдЕрдЪреНрдЫрд╛ рдЕрднреНрдпрд╛рд╕ рдирд╣реАрдВ рд╣реИ, рди рд╣реА рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд╡реИрд╢реНрд╡рд┐рдХ рд╡рд╕реНрддреБрдПрдВ рд╣реИрдВ, рдпрд╛ рдлрд╝рдВрдХреНрд╢рди рдЖрджрд┐ рдЬреИрд╕реЗ рдмрд┐рд▓реНрдЯрд┐рди рдХреЗ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХреЛ рдмрджрд▓ рд░рд╣реЗ рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╣рдо рдЕрднреА рднреА .d.ts рдлрд╛рдЗрд▓реЛрдВ рдореЗрдВ рдареАрдХ рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИрдВ рдФрд░ рдореИрдВрдиреЗ рдХрд┐рд╕реА рдХреЛ рдЦреЗрдж рдирд╣реАрдВ рд╕реБрдирд╛ рд╣реИ рд╣рдо рдРрд╕рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рднрд▓реЗ рд╣реА рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЯрд╛рдЗрдк рдХреА рдЧрдИ рдХреБрдЫ рдЦрд░рд╛рдм рдбрд┐рдЬрд╝рд╛рдЗрди рдХреА рдЧрдИ рдкреНрд░рдХрд╛рд░ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИ)ред

рдмрд╕ рдРрд╕реА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рднрд╛рдЧ рдЧрдпрд╛ рдЬрд╣рд╛рдВ рдореБрдЭреЗ рд╕рд╣реА рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реБрд╡рд┐рдзрд╛ рд╣реЛрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВ рдирд┐рдпрдВрддреНрд░рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реВрдВред рд╕реЗрдЯрд░ рдХреЛ рдЕрдзрд┐рдХ рдЙрджрд╛рд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдЕрдзрд┐рдХ рд░реВрдврд╝рд┐рд╡рд╛рджреА рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрд┐рд╕реЗ рд▓рдЧрд╛рддрд╛рд░ рдЧреЗрдЯрд░ рджреНрд╡рд╛рд░рд╛ рд╡рд╛рдкрд╕ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рдореМрдЬреВрдж рд╣реЛред рдореИрдВ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛрдб рдкреЛрд░реНрдЯ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдФрд░ рдпрд╣ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдмрдорд░ рд╣реИ рдХрд┐ рдЕрдЧрд░ рдореБрдЭреЗ рдЯрд╛рдЗрдк рд╕реБрд░рдХреНрд╖рд╛ рдЪрд╛рд╣рд┐рдП рддреЛ рдореБрдЭреЗ рд╕реЗрдЯрд░реНрд╕ рдХреЛ рджреЛрдмрд╛рд░рд╛ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореЗрд░реЗ рдкрд╛рд╕ рдРрд╕рд╛ рдХреБрдЫ рд╣реИ:

class Vector3 { /* ... */ }

type XYZ = Vector3 | [number, number, number] | {x: number, y: number, z: number}
type PropertyAnimator = (x: number, y: number, z: number, timestamp: number) => XYZ
type XYZSettables =  XYZ | PropertyAnimator

export class Transformable {
        // ...

        set position(newValue: XYZSettables) {
            this._setPropertyXYZ('position', newValue)
        }
        get position(): Vector3 {
            return this._props.position
        }

        // ...
}

рдФрд░ рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдХрд▓реНрдкрдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрдкрдпреЛрдЧ рдмрд╣реБрдд рд▓рдЪреАрд▓рд╛ рд╣реИ:

const transform = new Transformable

// use an array
transform.position = [20, 30, 40]

// use an object
transform.position = {y: 30, z: 40} // skip `x` this time

// animate manually, a property directly
requestAnimationFrame((time) => {
  transform.position.x = 100 * Math.sin(time * 0.001)
})

// animate manually, with an array, which could be shared across instances
const pos = [10, 20, 30]
requestAnimationFrame((time) => {
  pos[2] = 100 * Math.sin(time * 0.001)
  transform.position = pos
})

// Animate with a property function
transform.position = (x, y, z, time) => [x, y, 100 * Math.sin(time * 0.001)]

// or a simple increment:
transform.position = (x, y, z) => [x, y, ++z]

// etc

// etc

// etc

рдпрд╣ 4 рд╕рд╛рд▓ рдХрд╛ рд╣реИред рдпрд╣ рдЕрднреА рднреА рдХреИрд╕реЗ рддрдп рдирд╣реАрдВ рд╣реИ? рдЬреИрд╕рд╛ рдХрд┐ рдЙрдкрд░реЛрдХреНрдд рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ! рдХрдо рд╕реЗ рдХрдо рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдлрд┐рд░ рд╕реЗ рдЦреЛрд▓рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ?

рдФрд░ рдореИрдВ @kitsonk рд╕реЗ рдкреВрд░реА рддрд░рд╣ рд╕рд╣рдордд рд╣реВрдВ:

@kitsonk рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЙрдкрд░реЛрдХреНрдд рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рдкрд░реНрдпрд╛рдкреНрдд рд╕реЗ рдЕрдзрд┐рдХ рд╕рдореНрдореЛрд╣рдХ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП рд╣реИрдВред рдЬрдмрдХрд┐ рд╡рд░реНрддрдорд╛рди рдбрд┐рдЬрд╝рд╛рдЗрди рдЗрд╕ рдкреНрд░рддрд┐рдмрдВрдз рдХреЗ рд╕рд╛рде рдЕрдзрд┐рдХрд╛рдВрд╢ рдЕрдиреНрдп рдЯрд╛рдЗрдк рдХреА рдЧрдИ рднрд╛рд╖рд╛рдУрдВ рдХреЗ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдкреИрдЯрд░реНрди рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд░рддрд╛ рд╣реИ, рдпрд╣ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдФрд░ рдЕрддреНрдпрдзрд┐рдХ рдкреНрд░рддрд┐рдмрдВрдзрд╛рддреНрдордХ рд╣реИред рдЬрдмрдХрд┐ рдпрд╣ рдбрд┐рдЬрд╝рд╛рдЗрди рджреНрд╡рд╛рд░рд╛ рд╣реИ, рдбрд┐рдЬрд╝рд╛рдЗрди рдЧрд▓рдд рд╣реИред

рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ 3.6 рдиреЗ рдбрд┐рдХреНрд▓реЗрд░реЗрд╢рди рдлрд╛рдЗрд▓ рдореЗрдВ рдПрдХреНрд╕реЗрд╕рд░реНрд╕ рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд┐рдВрдЯреИрдХреНрд╕ рдкреЗрд╢ рдХрд┐рдпрд╛ , рдЬрдмрдХрд┐ рдЗрд╕ рдкреНрд░рддрд┐рдмрдВрдз рдХреЛ рдмрдирд╛рдП рд░рдЦрд╛ рдХрд┐ рдЧреЗрдЯрд░ рдФрд░ рд╕реЗрдЯрд░ рдХрд╛ рдкреНрд░рдХрд╛рд░ рд╕рдорд╛рди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рд╣рдорд╛рд░рд╛ рдпреВрдЖрдИ рдЯреВрд▓рдХрд┐рдЯ рдСрдЯреЛ-рдХрд╛рд╕реНрдЯрд┐рдВрдЧ рд╕реЗрдЯрд░реНрд╕ рдкрд░ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рд╕реЗрдЯрд░ рдЧреЗрдЯрд░ рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдП рдЧрдП рдПрдХрд╡рдЪрди рдкреНрд░рдХрд╛рд░ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдкреНрд░рдХрд╛рд░ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИред рддреЛ рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рдЯреАрдПрд╕ рдиреЗ рдЗрд╕ рдкреИрдЯрд░реНрди рдХреЛ рд╕реБрд░рдХреНрд╖рд┐рдд рдмрдирд╛рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдкреЗрд╢ рдХрд┐рдпрд╛ред

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ @RyanCavanaugh рдиреЗ 3 рд╕рд╛рд▓ рдкрд╣рд▓реЗ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рд╕рдмрд╕реЗ рдареЛрд╕ рдЦрдВрдбрди рдХрд┐рдпрд╛ рдерд╛ред рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реИ рдХрд┐ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рд░рд┐рдкреЛрд░реНрдЯ рдХрд┐рдП рдЧрдП рдбреАрдУрдПрдо рдЙрдкрдпреЛрдЧ-рдорд╛рдорд▓реЛрдВ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдирдИ рдШреЛрд╖рдгрд╛ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреА рдЙрдкрд▓рдмреНрдзрддрд╛ рдПрдХ рдирдП рдирд┐рд░реНрдгрдп рдХреА рдЕрдиреБрдорддрд┐ рджреЗ рд╕рдХрддреА рд╣реИ?

рд╣рд╛рдВ, рдЬреИрд╕реЗ рд╣реА рдореИрдВрдиреЗ рдЙрд╕ рдирдП рдлреАрдЪрд░ рдХреЛ рджреЗрдЦрд╛, рдореИрдВрдиреЗ рддреБрд░рдВрдд рдЗрд╕ рдлреАрдЪрд░ рд░рд┐рдХреНрд╡реЗрд╕реНрдЯ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреА рд╕реЛрдЪрд╛ред рдореИрдВ рдЗрд╕реЗ рд╣рдорд╛рд░реЗ рдпреВрдЖрдИ рдврд╛рдВрдЪреЗ рдХреЗ рдкреНрд░рдпреЛрдЬрдиреЛрдВ рдХреЗ рд▓рд┐рдП рднреА рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдпрд╣ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЙрдкрдпреЛрдЧ рдХрд╛ рдорд╛рдорд▓рд╛ рд╣реИ, рджреЛрд╕реНрддреЛрдВред

TSConf 2019 11 рдЕрдХреНрдЯреВрдмрд░ рдХреЛ рдЖрдпреЛрдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдпрд╣ рд╕реЛрдЪрдХрд░ рдХрд┐ рдЕрдЧрд░ рдХрд┐рд╕реА рдХреЛ рдореМрдХрд╛ рдорд┐рд▓рд╛ рддреЛ рдпрд╣ рдкреНрд░рд╢реНрдиреЛрддреНрддрд░ рд╕рддреНрд░ рдореЗрдВ рдПрдХ рдорд╣рд╛рди рдкреВрд░реНрд╡рд╡реНрдпрд╛рдкреА рд╕рдореАрдХреНрд╖рд╛ рд╣реЛрдЧреАред

рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдЗрд╕ рд▓рдВрдмреЗ рд╕реВрддреНрд░ рдкрд░ рдкрд╣рд▓реЗ рднреА рдпрд╣ рдХрд╣рд╛ рд╣реЛ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рджреЛрд╣рд░рд╛рдирд╛ рд╣реИред

IMO рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдЕрднрд┐рд╡реНрдпрдВрдЬрдХ рдкреНрд░рдХрд╛рд░ рдХреА рдкреНрд░рдгрд╛рд▓реА рджреЛ рдЕрд╕рддрдд рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рддрд╛ рд╣реИред рдкрд╣рд▓рд╛ рдЖрдкрдХреЛ рд╕реБрд░рдХреНрд╖рд┐рдд рдирдпрд╛ рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗ рд░рд╣рд╛ рд╣реИред рдФрд░ рдЕрдЧрд░ рдпрд╣реА рдПрдХрдорд╛рддреНрд░ рдЙрджреНрджреЗрд╢реНрдп рдерд╛, рддреЛ рд╢рд╛рдпрдж рдЖрдк рдПрдХ рддрд░реНрдХ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЖрдк рдЗрд╕ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рд╕реЗ рдмрдЪ рд╕рдХрддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдпрджрд┐ рдЖрдк рдЗрд╕ рдкрд░рд┐рджреГрд╢реНрдп рдХреЛ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдХреЛрдб рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ (рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдЕрднреА рднреА рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рддрд░реНрдХ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ)ред

рд╣рд╛рд▓рд╛рдВрдХрд┐ рджреВрд╕рд░рд╛ рдЙрджреНрджреЗрд╢реНрдп рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдХреИрдкреНрдЪрд░ рдХрд░рдирд╛ рд╣реИ рдФрд░ рдпрд╣ рдбреАрдУрдПрдо рдФрд░ рдЬреЗрдПрд╕ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдореЗрдВ рд╕реЗрдЯрд░ рдореЗрдВ рдСрдЯреЛ-рдХреЙрд░реНрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╕рд╛рдорд╛рдиреНрдп рдЕрднреНрдпрд╛рд╕ рд╣реИ, рд▓реЗрдХрд┐рди рдЧреЗрдЯрдЯрд░ рдореЗрдВ рдПрдХ рдЕрдкреЗрдХреНрд╖рд┐рдд рдкреНрд░рдХрд╛рд░ рд▓реМрдЯрд╛рддрд╛ рд╣реИред рд╣рдореЗрдВ рдЗрд╕реЗ рдЯрд╛рдЗрдк рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдХреИрдкреНрдЪрд░ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдореМрдЬреВрджрд╛ рдлреНрд░реЗрдорд╡рд░реНрдХ рдХрд╛ рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рд░реВрдк рд╕реЗ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬреИрд╕реЗ рд╡реЗ рд╣реИрдВ ред

рдХрдо рд╕реЗ рдХрдо, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ Design Limitation рдпрд╣рд╛рдВ рд╣рдЯрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рдЕрдм рдФрд░ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИред

рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкреНрд░реЙрдХреНрд╕реА рдХрд░рдирд╛ рднреА рдореБрд╢реНрдХрд┐рд▓ рдмрдирд╛рддрд╛ рд╣реИ:
https://stackoverflow.com/questions/57948140/typescript-proxy-which-returns-a-different-type-from-get-than-it-takes-for-s

рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЗрд╕ рддрдереНрдп рдХрд╛ рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдкреНрд░рддрд┐ #33749 .style.display = ...something nullable... рдЕрдм рдЯрд╛рдЗрдкрдЪреЗрдХ рдирд╣реАрдВ; рдЬрд┐рд╕реЗ рдПрдХ рд╢реВрдиреНрдпрддрд╛ рд╢реБрджреНрдзрддрд╛ рдореБрджреНрджреЗ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣ рдереЛрдбрд╝рд╛ рдмреЗрддреБрдХрд╛ рд╣реЛрдирд╛ рд╣реИ рдирд╛? рдЬрдм рдЙрдиреНрд╣реЗрдВ рдмрдЧрдлрд┐рдХреНрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдЧрд▓рдд рд▓реЗрдмрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдирдП рдмреНрд░реЗрдХрд┐рдВрдЧ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рдХрд╖реНрдЯрдкреНрд░рдж рд╣реЛрддрд╛ рд╣реИ (рдореИрдВ рдЗрд╕рдХреЗ рдХрд╛рд░рдг рд╣реЛрдиреЗ рд╡рд╛рд▓реА рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреА рддрд▓рд╛рд╢ рдореЗрдВ рдЧрдпрд╛ рдерд╛)ред рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ, рдореБрдЭреЗ рдпрд╣ рдмрд╣реБрдд рдХрдо рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ null рдореЗрдВ рд╡рд┐рд╢реЗрд╖ рд╡реНрдпрд╡рд╣рд╛рд░ "рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ" рд╣реИ, рдЬреЛ рдХрд┐ рдЦрд╛рд▓реА рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХрд░рддрд╛ рд╣реИ; рдФрд░ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ 3.7 рддрдХ рдореИрдВрдиреЗ рдЗрд╕реЗ рдХреИрдкреНрдЪрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдкрд╕рдВрдж рдХрд┐рдпрд╛ред рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдЬрд╛рдирдмреВрдЭрдХрд░ рдЧрд▓рдд рдкреНрд░рдХрд╛рд░ рдХреЗ рдПрдиреЛрдЯреЗрд╢рди рдЗрд╕ рд╕реАрдорд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдП рдЧрдП рдереЗ, рдЬрд┐рдиреНрд╣реЗрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЗрд╕ рддрд░рд╣ рд╕реЗ рд▓реЗрдмрд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рддрд╛рдХрд┐ рд╕рдордп рдХреЛ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдЧреНрд░реЗрдб рдореБрджреНрджреЛрдВ рдХреЛ рдмрдЪрд╛рдпрд╛ рдЬрд╛ рд╕рдХреЗред

рдореБрдЭреЗ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдХрд╛ рд░рд╛рд╕реНрддрд╛ рдЦреЛрдЬрдиреЗ рдореЗрдВ рднреА рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реИред рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рдЗрд╕реЗ рдХреЗрд╡рд▓ рдкрд░рд┐рд╡реЗрд╢ рдХреЗ рд╕рдВрджрд░реНрднреЛрдВ рдореЗрдВ рд╣реА рдЕрдиреБрдорддрд┐ рджреА рдЧрдИ рдереА? @RyanCavanaugh рдХреНрдпрд╛ рдЖрдкрдХреА рдЬрдЯрд┐рд▓рддрд╛ рдХреА рдЪрд┐рдВрддрд╛рдУрдВ рдХреЛ рджреВрд░ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛?

рдЗрд╕рдХреЗ рд▓рд┐рдП рдореЗрд░рд╛ рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓рд╛ рдпрд╣ рд╣реИ рдХрд┐ рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рдПрдкреАрдЖрдИ рд╣реИ рдЬрд╣рд╛рдВ рдПрдХ рдкреНрд░реЙрдХреНрд╕реА рдПрдХ рд╡рд╛рджрд╛ рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рд╕реЗрдЯ рдСрдкрд░реЗрд╢рди рдПрдХ рд╡рд╛рджрд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдореИрдВ рдЕрднреА рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдЗрд╕рдХрд╛ рд╡рд░реНрдгрди рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ред

let post = await loadPost()
let user = await loadUser()
post.author = user // Proxy handles links these two objects via remote IDs
await save(post)

// Somewhere else in code
let post = await loadPost()
let author = await post.author

рдЪрд╛рд╣реЗ рдЯрд╛рдЗрдк рдХрд░реЗрдХреНрдЯрд┐рдВрдЧ рдиреЗрдЯрд┐рд╡ рдлрдВрдХреНрд╢рдиреНрд╕ рд╣реЛрдВ, рдпрд╛ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдкреНрд░реЙрдХреНрд╕реА, рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЗрд╕ рд░реБрдЦ рдХрд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЙрди рдкреНрд░рдХрд╛рд░ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рдПрдХ рдЧрд▓рддреА рдереАрдВред

рдЙрдиреНрд╣реЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕ рд╕реВрдЪреА рд╕реЗ #6 рдФрд░ #7 рдХреЛ рд╣рдЯрд╛ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП (https://github.com/Microsoft/TypeScript/wiki/TypeScript-Design-Goals#goals)

рдореЗрд░рд╛ рдореБрджреНрджрд╛

рдореИрдВ рдХрд┐рд╕реА рдЖрдЗрдЯрдо рдХреЛ рд╕реЗрдЯ рд╡рд┐рдзрд┐ рдореЗрдВ рдХрд┐рд╕реА рд╕рд░рдгреА рдореЗрдВ рдзрдХреНрдХрд╛ рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдФрд░ рдкреНрд░рд╛рдкреНрдд рд╡рд┐рдзрд┐ рдореЗрдВ рд╕рдВрдкреВрд░реНрдг рд╕рд░рдгреА рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдЕрднреА рдХреЗ рд▓рд┐рдП рдореБрдЭреЗ set myArray(...value: string[]) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдЬреЛ рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдореБрджреНрджреЗ рдореЗрдВ рдмрд╣реБрдд рдЙрд▓рдЭрд╛ рд╣реБрдЖ рд╣реИ... рдХреГрдкрдпрд╛ рдЗрд╕реЗ рд╣рдЯрд╛рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╕реВрдЪрдирд╛ рдпрд╛ рдЪреЗрддрд╛рд╡рдиреА рдареАрдХ рдХрд╛рдо рдХрд░реЗрдЧреАред

рдЙрджрд╛рд╣рд░рдг (рдореИрдВ рдХреНрдпрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛)

class MyClass {
   _myArray: string[] = [];

   set myArray(value: string) {
      this._myArray.push(value);
   }

   get myArray(): string[] {
      return this._myArray;
   }
}

рдЙрджрд╛рд╣рд░рдг (рдореБрдЭреЗ рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИ)

class MyClass {
   _myArray: string[] = [];

   set myArray(...value: string[]) {
      this._myArray.push(value[0]);
   }

   get myArray(): string[] {
      return this._myArray;
   }
}

рдЬрдм рдореБрдЭреЗ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереА рддреЛ рдПрдХ рд╕рдорд╛рдзрд╛рди рдХреЗ рд╕рд╛рде рдЖрдпрд╛ рдерд╛, рд╕рдВрдкрддреНрддрд┐ рдХреЛ union type рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЗрдЯ рдХрд░рдирд╛ рдерд╛ред рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдореЗрд░рд╛ рд╕рдордп рдПрдкреАрдЖрдИ рд╕реЗ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдЖрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЕрдкрдиреЗ рдпреВрдЖрдИ рдХреЗ рд▓рд┐рдП рдПрдХ рдореЛрдореЗрдВрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдореЗрд░рд╛ рдЙрджрд╛рд╣рд░рдг

class TimeStorage {
    _startDate: string | Moment = ""
    _endDate: string | Moment = ""

    set startDate(date: Moment | string) {
        this._startDate = moment(date).utc()
    }
    get startDate(): Moment | string {
        return moment.utc(this._startDate)
    }

    set endDate(date: Moment) { 
        this._endDate = moment.utc(date)
    }
    get endDate() { 
        return moment.utc(this._endDate)
    }
}

рдореБрдЭреЗ рдкрд╛рд░реНрдЯреА рдореЗрдВ рдереЛрдбрд╝реА рджреЗрд░ рд╣реЛ рдЧрдИ рд╣реИ рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рдЦреБрдж рднрд╛рдЧ рд▓рд┐рдпрд╛ рд╣реИред рдпрд╣ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рджреБрд╡рд┐рдзрд╛ рд╣реИ рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЗрд╕рдХреЗ рд╕рд╛рде рдереЛрдбрд╝рд╛ рд╕рд╛ рдХрд╛рдо рдХрд┐рдпрд╛ред

рдЖрдЗрдП рдорд╛рди рд▓реЗрдВ рдХрд┐ рдпрд╣ рдХреБрдЫ рдРрд╕рд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╡рд░реНрдЧ рдЬрд┐рд╕рдореЗрдВ рдПрдХ рд╕рдВрдкрддреНрддрд┐ рд╣реИ рдЬреЛ рддрд╛рд░реЛрдВ рдФрд░ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреА рд╣реИ (рдХрд┐рд╕реА рднреА рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рд▓рд┐рдП) рд▓реЗрдХрд┐рди рд╕рдВрдкрддреНрддрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реЛрддреА рд╣реИ:

class Foo {
    constructor() {
        this._bar = '';
        this.baz = '';
    }

    // error: 'get' and 'set' accessor must have the same type.(2380)
    get bar(): string {
        return this._bar;
    }

    // error: 'get' and 'set' accessor must have the same type.(2380)
    set bar(value: string | number) {
        this._bar = value.toString();
    }

    public baz: string;
    private _bar: string;
}

рдЪреВрдВрдХрд┐ рдпрд╣ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ рдФрд░ рд╣рдо рдЕрднреА рднреА рдордЬрдмреВрдд рдЯрд╛рдЗрдкрд┐рдВрдЧ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рд╣рдореЗрдВ рдХреБрдЫ рдЕрддрд┐рд░рд┐рдХреНрдд рдХреЛрдб рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЕрдм рдЖрдЗрдП рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рд▓рд┐рдП рджрд┐рдЦрд╛рд╡рд╛ рдХрд░реЗрдВ рдХрд┐ рдХрд┐рд╕реА рдиреЗ рд╕рдВрдкрддреНрддрд┐ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдмрдирд╛рдпрд╛ рд╣реИ рдЬреЛ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

/**
 * Abstract base class for properties.
 */
abstract class Property<GetType, SetType> {
    abstract get(): GetType;
    abstract set(value: SetType): void;
}

/**
 * Proxify an object so that it's get and set accessors are proxied to
 * the corresponding Property `get` and `set` calls.
 */
function proxify<T extends object>(obj: T) {
    return new Proxy<any>(obj, {
        get(target, key) {
            const prop = target[key];
            return (prop instanceof Property) ? prop.get() : prop;
        },
        set(target, key, value) {
            const prop = target[key];
            if (prop instanceof Property) {
                prop.set(value);
            } else {
                target[key] = value;
            }
            return true;
        }
    });
}

рдЗрд╕ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣рдо рдЕрдкрдиреА рдЯрд╛рдЗрдк рдХреА рдЧрдИ рд╕рдВрдкрддреНрддрд┐ рдХреЛ рдЕрдкрдиреА рдХрдХреНрд╖рд╛ рдХреЗ рд▓рд┐рдП рдЗрд╕ рддрд░рд╣ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

class Bar extends Property<string, string | number> {
    constructor(bar: string | number) {
        super();
        this.set(bar);
    }

    get(): string {
        return this._bar;
    }

    set(value: string | number) {
        this._bar = value.toString();
    }

    private _bar: string;
}

class Foo {
    constructor() {
        this.bar = new Bar('');
        this.baz = '';
    }

    public bar: Bar;
    public baz: string;
}

рдФрд░ рдлрд┐рд░, рдЗрд╕ рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП bar рдХреЗ рд▓рд┐рдП рд╕реБрд░рдХреНрд╖рд┐рдд рдЧреЗрдЯрд░ рдФрд░ рд╕реЗрдЯрд░ рдЯрд╛рдЗрдк рдХрд░рдирд╛ рд╣реЛрдЧрд╛:

const foo = new Foo();

// use property's typed setter
foo.bar.set(42);
foo.baz = 'foobar';

// use property's typed getter
// output: 42 foobar
console.log(foo.bar.get(), foo.baz);

рдФрд░ рдпрджрд┐ рдЖрдкрдХреЛ рд╕рдВрдкрддреНрддрд┐ рд╕реЗрдЯрд░реНрд╕ рдпрд╛ рдЧреЗрдЯрд░реНрд╕ рдХреЛ рдЕрдзрд┐рдХ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЖрдк рдЗрд╕реЗ рд▓рдкреЗрдЯрдиреЗ рдХреЗ рд▓рд┐рдП proxify рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

const foo = new Foo();

// use proxified property setters
Object.assign(proxify(foo), { bar: 100, baz: 'hello world' });

// use property's typed getter
// output: 100 hello world
console.log(foo.bar.get(), foo.baz);

// use proxified property getters
// output: {"bar":"100","baz":"hello world"}
console.log(JSON.stringify(proxify(foo)));

рдЕрд╕реНрд╡реАрдХрд░рдг: рдпрджрд┐ рдХреЛрдИ рдЗрд╕ рдХреЛрдб рдХреЛ рд▓реЗрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рд░рдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ рдпрд╛ рдЗрд╕рдХреЗ рд╕рд╛рде рдЬреЛ рдХреБрдЫ рднреА рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ, рддреЛ рдХреГрдкрдпрд╛ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рдорд╣рд╕реВрд╕ рдХрд░реЗрдВред рдореИ рдмрд╣реБрдд рдЖрд▓рд╕реА рд╣реВрдВред

рдмрд╕ рдХреБрдЫ рдЕрддрд┐рд░рд┐рдХреНрдд рдиреЛрдЯ рдФрд░ рдлрд┐рд░ рдореИрдВ рд╡рд╛рджрд╛ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдореИрдВ рд▓реЛрдЧреЛрдВ рдХреА рдЗрд╕ рд▓рдВрдмреА рд╕реВрдЪреА рдХреЛ рд╕реНрдкреИрдо рдХрд░рдирд╛ рдмрдВрдж рдХрд░ рджреВрдВрдЧрд╛!

рдЕрдЧрд░ рд╣рдо рдЗрд╕реЗ рдХрд╛рд▓реНрдкрдирд┐рдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ:

/**
 * Create a property with custom `get` and `set` accessors.
 */
function property<GetType, SetType>(property: {
    get: () => GetType,
    set: (value: SetType) => void
}) {
    const obj = { ...property };
    Object.setPrototypeOf(obj, Property.prototype);
    return obj;
}

рд╣рдореЗрдВ рдПрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдорд┐рд▓рддрд╛ рд╣реИ рдЬреЛ рдореВрд▓ рд╡рд░реНрдЧ рдХреЗ рдереЛрдбрд╝рд╛ рдХрд░реАрдм рд╣реИ, рдФрд░ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ this рддрдХ рдкрд╣реБрдВрдЪ рд╣реИ:

class Foo {
    constructor() {
        this._bar = '';
        this.baz = '';
    }

    public bar = property({
        get: (): string => {
            return this._bar;
        },
        set: (value: string | number) => {
            this._bar = value.toString();
        }
    });

    public baz: string;
    private _bar: string;
}

рдпрд╣ рджреБрдирд┐рдпрд╛ рдХреА рд╕рдмрд╕реЗ рд╕реБрдВрджрд░ рдЪреАрдЬ рдирд╣реАрдВ рд╣реИ рд▓реЗрдХрд┐рди рдпрд╣ рдХрд╛рдо рдХрд░рддреА рд╣реИред рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдХреЛрдИ рдЗрд╕реЗ рдкрд░рд┐рд╖реНрдХреГрдд рдХрд░ рд╕рдХреЗ рдФрд░ рдХреБрдЫ рдРрд╕рд╛ рдмрдирд╛ рд╕рдХреЗ рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдЪреНрдЫрд╛ рд╣реЛред

рдЕрд╕рдВрднрд╛рд╡рд┐рдд рдШрдЯрдирд╛ рдореЗрдВ рдХрд┐ рдЗрд╕ рдзрд╛рдЧреЗ рдХреЛ рдкрдврд╝рдиреЗ рд╡рд╛рд▓рд╛ рдХреЛрдИ рднреА рд╡реНрдпрдХреНрддрд┐ рдЖрд╢реНрд╡рд╕реНрдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рдореИрдВ рдЖрдкрдХреЛ рдпрд╣ рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд░реВрдк рд╕реЗ рдмрджрд╕реВрд░рдд рд╣реИрдХ рджреЗрддрд╛ рд╣реВрдВ рдЬрд┐рд╕реЗ рдПрдВрдЧреБрд▓рд░ рдиреЗ рдЕрднреА рдкреЗрд╢ рдХрд┐рдпрд╛ рд╣реИ :

рдпрд╣рд╛рдВ рдореВрд▓реНрдп рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдмреВрд▓рд┐рдпрди рд╕реЗ рдмреВрд▓рд┐рдпрди рдореЗрдВ рдмрджрд▓рдирд╛ рдЖрджрд░реНрд╢ рд╣реЛрдЧрд╛|'', рдореВрд▓реНрдпреЛрдВ рдХреЗ рд╕реЗрдЯ рд╕реЗ рдореЗрд▓ рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕реЗрдЯрд░ рджреНрд╡рд╛рд░рд╛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рдЧреЗрдЯреНрдЯрд░ рдФрд░ рд╕реЗрдЯрд░ рджреЛрдиреЛрдВ рдХрд╛ рдПрдХ рд╣реА рдкреНрд░рдХрд╛рд░ рд╣реЛ, рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдЧреЗрдЯрд░ рдХреЛ рдПрдХ рдмреВрд▓рд┐рдпрди рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рддреЛ рд╕реЗрдЯрд░ рд╕рдВрдХрд░рд╛ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдлрдВрд╕ рдЧрдпрд╛ рд╣реИ ... рдХреЛрдгреАрдп @Input() рдХреЗ рд▓рд┐рдП рдПрдХ рд╡реНрдпрд╛рдкрдХ, рдЕрдзрд┐рдХ рдЕрдиреБрдореЗрдп рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рдБрдЪ рдХрд░рдиреЗ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред рдЗрдирдкреБрдЯ рдлрд╝реАрд▓реНрдб рдХреЗ рд▓рд┐рдП рд╣реА рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ред рдШрдЯрдХ рд╡рд░реНрдЧ рдореЗрдВ ngAcceptInputType_ рдЙрдкрд╕рд░реНрдЧ рдХреЗ рд╕рд╛рде рдПрдХ рд╕реНрдерд┐рд░ рдЧреБрдг рдЬреЛрдбрд╝рдХрд░ рдЗрд╕реЗ рд╕рдХреНрд╖рдо рдХрд░реЗрдВ:

````
рдХреНрд▓рд╛рд╕ рд╕рдмрдорд┐рдЯ рдмрдЯрди {
рдирд┐рдЬреА _рдЕрдХреНрд╖рдо: рдмреВрд▓рд┐рдпрди;

рдЕрдХреНрд╖рдо рд╣реЛ рдЬрд╛рдУ (): рдмреВрд▓рд┐рдпрди {
рдЗрд╕реЗ рд╡рд╛рдкрд╕ рдХрд░реЗрдВред_рдЕрдХреНрд╖рдо;
}

рдЕрдХреНрд╖рдо рд╕реЗрдЯ рдХрд░реЗрдВ (рдорд╛рди: рдмреВрд▓рд┐рдпрди) {
this._disabled = (рдорд╛рди === '') || рдореВрд▓реНрдп;
}

рд╕реНрдерд┐рд░ ngAcceptInputType_disabled: рдмреВрд▓рд┐рдпрди|'';
}
````

рдХреГрдкрдпрд╛, рдХреГрдкрдпрд╛ рдЗрд╕реЗ рдареАрдХ рдХрд░реЗрдВред

рд╣рд╛рдБ, рдПрдВрдЧреБрд▓рд░ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреИрдЯрд░реНрди рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╕рдЪрдореБрдЪ рдпрд╣ рдХреБрд░реВрдкрддрд╛ рд╣реИред рд╡рд░реНрддрдорд╛рди рдкреНрд░рддрд┐рдмрдВрдз рдмрд╣реБрдд рдЕрдзрд┐рдХ рд░рд╛рдп рд╡рд╛рд▓рд╛ рд╣реИред

рдпрджрд┐ рдЯреАрдПрд╕ рд╡реЗрдм рднреВрдорд┐ рдореЗрдВ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреА рдкреВрд░реА рдЪреМрдбрд╝рд╛рдИ рдХреЛ рдореЙрдбрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ, рддреЛ рдЙрд╕реЗ рдХрдо рд░рд╛рдп рд░рдЦрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдпрд╛ рдпрд╣ рд╕рднреА рдбрд┐рдЬрд╝рд╛рдЗрдиреЛрдВ рдХреЛ рдореЙрдбрд▓ рдХрд░рдиреЗ рдореЗрдВ рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред

рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░, рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рдпреЛрдЧрджрд╛рдирдХрд░реНрддрд╛рдУрдВ рдкрд░ рдпрд╣ рд╕рдВрд╡рд╛рдж рдХрд░рдиреЗ рдХреА рдЬрд┐рдореНрдореЗрджрд╛рд░реА рд╣реИ рдХрд┐ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдлрд┐рд░ рд╕реЗ рдХреНрдпреЛрдВ рдирд╣реАрдВ рдЦреЛрд▓рд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ? рдХреНрдпрд╛ рдХреЛрдИ рдРрд╕рд╛ рдпреЛрдЧрджрд╛рди рджреЗрдиреЗ рд╡рд╛рд▓рд╛ рд╕рджрд╕реНрдп рд╣реИ рдЬреЛ рдЗрд╕ рд╕рдордп рдЗрд╕рдХреЗ рд╕рдЦреНрдд рдЦрд┐рд▓рд╛рдл рд╣реИ?

рд╣рдо NodeJs рдХреЗ рд▓рд┐рдП рдПрдХ DOM рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдмрдирд╛ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ W3C рд╕реНрдкреЗрдХ рд╕реЗ рдореЗрд▓ рдЦрд╛рддреА рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕рдорд╕реНрдпрд╛ рдЗрд╕реЗ рдЕрд╕рдВрднрд╡ рдмрдирд╛ рджреЗрддреА рд╣реИред рдХрд┐рд╕реА рднреА рдЕрджреНрдпрддрди?

рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдЪреМрдВрдХрд╛рдиреЗ рд╡рд╛рд▓рд╛ рд╣реИ рдХрд┐ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреА рдХреЛрд░ рдЯреАрдо рдХреЗ рднреАрддрд░ рдХреБрдЫ рдРрд╕реА рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рдЦрд┐рд▓рд╛рдл рд╣реИрдВ рдЬреЛ рдЧреНрд░рд╣ рдкрд░ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рдлрд┐рд░ рд╕реЗ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИ: рдбреЛрдоред

a) W3C DOM рд╡рд┐рдирд┐рд░реНрджреЗрд╢рди рдХреЗ рдХрдИ рд╣рд┐рд╕реНрд╕реЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдЕрдиреНрдп рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ, рдЬрдмрдХрд┐ b) рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдЯрд╛рдЗрдк рд╕рд┐рд╕реНрдЯрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ (рдЬрдм рддрдХ рдХрд┐ рдЖрдк рд╕рднреА рдЬрдЧрд╣ any рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рд╕рд╣рд╛рд░рд╛ рдирд╣реАрдВ рд▓реЗрддреЗ, рдЬреЛ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдкреВрд░реЗ рдЙрджреНрджреЗрд╢реНрдп рдХреЛ рд╣рд░рд╛ рджреЗрддрд╛ рд╣реИ)ред

typescriptlang.org рдХрд╛ рдореБрдЦрдкреГрд╖реНрда рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЧрд▓рдд рд╣реИ рдЬрдм рдпрд╣ рдмрддрд╛рддрд╛ рд╣реИ:

рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдПрдХ рдЯрд╛рдЗрдк рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╕реБрдкрд░рд╕реЗрдЯ рд╣реИ рдЬреЛ рд╕рд╛рджреЗ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИред

рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдбреАрдУрдПрдо рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдХреЛ рдлрд┐рд░ рд╕реЗ рдмрдирд╛рдиреЗ рдореЗрдВ рдЕрд╕рдорд░реНрдерддрд╛ рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЕрднреА рднреА рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдПрдХ рдЙрдкрд╕рдореБрдЪреНрдЪрдп рдирд╣реАрдВ рдПрдХ рд╕реБрдкрд░рд╕реЗрдЯ рд╣реИред

рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ, рдореИрдВ @ gmurray81 рдФрд░ рдХрдИ рдЕрдиреНрдп рд▓реЛрдЧреЛрдВ рд╕реЗ рд╕рд╣рдордд рд╣реВрдВ рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ рддрд░реНрдХ рджрд┐рдпрд╛ рд╣реИ рдХрд┐ рдЧреЗрдЯрд░ рдХрд╛ рдкреНрд░рдХрд╛рд░ рдПрдХ рд╕реЗрдЯрд░реНрд╕ рдпреВрдирд┐рдпрди рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╕рдмрд╕реЗрдЯ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рдХреЛрдИ рдЕрд╕рдВрдмрджреНрдз рдЯрд╛рдЗрдкрд┐рдВрдЧ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдПрдХ рд╕реЗрдЯрд░ рдХреЗ рдХрд╛рд░реНрдп рдХреЛ рдЧреЗрдЯреНрдЯрд░ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдирд╖реНрдЯ рдХрд┐рдП рдмрд┐рдирд╛ рдЗрдирдкреБрдЯ рдХреЛ рд╕рд╛рдл рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ (рдпрд╛рдиреА, any рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рд╣реЛрдирд╛)ред

рдпрд╣рд╛рдБ рдореИрдВ рдХреНрдпрд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ред рдХреБрдЫ рдЖрд╕рд╛рди рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдЬреЗрдПрд╕ рдореЗрдВ рдРрд╕рд╛ рд╣реА рдХрд┐рдпрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдореИрдВ рдЯреАрдПрд╕ рдореЗрдВ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ред

4yo рдореБрджреНрджрд╛ рдЬрд┐рд╕реЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

export const enum Conns {
  none = 0, d = 1, u = 2, ud = 3,
  r = 4, rd = 5, ru = 6, rud = 7,
  l = 8, ld = 9, lu = 10, lud = 11,
  lr = 12, lrd = 13, lru = 14, lrud = 15,
  total = 16
}

class  Tile {
  public connections = Conns.none;

  get connLeft() { return this.connections & Conns.l; };

  set connLeft(val: boolean) { this.connections = val ? (this.connections | Conns.l) : (this.connections & ~Conns.l); }
}

рдЕрдм рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдЪрд▓ рд░рд╣рд╛ рд╣реИред рдиреАрдЪреЗ @calebjclark рдЙрджреНрдзреГрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдордЭрджрд╛рд░ рд╕рдорд╛рдзрд╛рди рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИ:

рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ, рдореИрдВ @ gmurray81 рдФрд░ рдХрдИ рдЕрдиреНрдп рд▓реЛрдЧреЛрдВ рд╕реЗ рд╕рд╣рдордд рд╣реВрдВ рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ рддрд░реНрдХ рджрд┐рдпрд╛ рд╣реИ рдХрд┐ рдЧреЗрдЯрд░ рдХрд╛ рдкреНрд░рдХрд╛рд░ рдПрдХ рд╕реЗрдЯрд░реНрд╕ рдпреВрдирд┐рдпрди рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╕рдмрд╕реЗрдЯ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рдХреЛрдИ рдЕрд╕рдВрдмрджреНрдз рдЯрд╛рдЗрдкрд┐рдВрдЧ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдПрдХ рд╕реЗрдЯрд░ рдХреЗ рдХрд╛рд░реНрдп рдХреЛ рдЧреЗрдЯреНрдЯрд░ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдирд╖реНрдЯ рдХрд┐рдП рдмрд┐рдирд╛ рдЗрдирдкреБрдЯ рдХреЛ рд╕рд╛рдл рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ (рдпрд╛рдиреА, рдХрд┐рд╕реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рд╣реЛрдирд╛)ред

рдЧреЗрдЯреНрдЯрд░ рдХреЗ рд▓рд┐рдП рд╕реЗрдЯрд░ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╕рдмрд╕реЗрдЯ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЕрдирд╛рд╡рд╢реНрдпрдХ рд░реВрдк рд╕реЗ рд╕реАрдорд┐рдд рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдПрдХ рд╕реЗрдЯрд░ рдХрд╛ рдкреНрд░рдХрд╛рд░ _could_ рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рд░реВрдк рд╕реЗ рдХреБрдЫ рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЬрдм рддрдХ рдХрд┐ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣рдореЗрд╢рд╛ рдЧреЗрдЯрд░ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдкреНрд░рдХрд╛рд░ рджреЗрддрд╛ рд╣реИред рд╕реЗрдЯрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЧреЗрдЯрдЯрд░ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдПрдХ рд╕реБрдкрд░рдЯрд╛рдЗрдк рд╣реЛрдирд╛ рдПрдХ рдЕрдЬреАрдм рд╕реАрдорд╛ рд╣реИ рдЬреЛ рдЗрд╕ рдЯрд┐рдХрдЯ рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХреБрдЫ рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓реЛрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░ рд╕рдХрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдмрд╛рдж рдореЗрдВ рд╢рд┐рдХрд╛рдпрддреЗрдВ рдкреНрд░рд╛рдкреНрдд рд╣реЛрдВрдЧреАред

рдРрд╕рд╛ рдХрд╣рд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ рдХрд┐ рдХрдХреНрд╖рд╛рдПрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЗрдВрдЯрд░рдлреЗрд╕ рднреА рд╣реИрдВ, рдЧреЗрдЯрд░реНрд╕ рдФрд░ рд╕реЗрдЯрд░реНрд╕ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рд╡рд░рдг рд╣реИрдВ рдЬреЛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рдкреНрд░рдХрдЯ рдирд╣реАрдВ рд╣реЛрдВрдЧреЗред рдУрдкреА рдХреЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдЖрдк type MyClass = { myDate(): moment.Moment; } рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛрдВрдЧреЗред рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдЖрдкрдХреЛ рдЗрди рдирдП рдЧреЗрдЯрд░ рдФрд░ рд╕реЗрдЯрд░ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдмреЗрдирдХрд╛рдм рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореИрдВ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдирд╣реАрдВ рджреЗрдЦрддрд╛ рдХрд┐ рдпрд╣ рд╡рд╛рдВрдЫрдиреАрдп рдХреНрдпреЛрдВ рд╣реЛрдЧрд╛ред

рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдореВрд▓ рд░реВрдк рд╕реЗ = рдФрд░ === рдХреЗ рдСрдкрд░реЗрдЯрд░ рдУрд╡рд░рд▓реЛрдбрд┐рдВрдЧ рдХреЗ рдХрдо-рд╕реАрдорд┐рдд рд╕рдВрд╕реНрдХрд░рдг рдХреА рдорд╛рдВрдЧ рдХрд░ рд░рд╣реА рд╣реИред (рдЧреЗрдЯрд░реНрд╕ рдФрд░ рд╕реЗрдЯрд░реНрд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдСрдкрд░реЗрдЯрд░ рдУрд╡рд░рд▓реЛрдбрд┐рдВрдЧ рд╣реИрдВред) рдФрд░ рдХрд┐рд╕реА рдРрд╕реЗ рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рдЬрд┐рд╕рдиреЗ рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдСрдкрд░реЗрдЯрд░ рдУрд╡рд░рд▓реЛрдб рд╕реЗ рдирд┐рдкрдЯрд╛ рд╣реИ, рдореИрдВ рдХрд╣реВрдВрдЧрд╛ рдХрд┐ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рдЯрд╛рд▓рдирд╛ рдЪрд╛рд╣рд┐рдПред рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдХреЛрдИ рдХрд╛рд░реНрдЯреЗрд╢рд┐рдпрди рдФрд░ рдзреНрд░реБрд╡реАрдп рдмрд┐рдВрджреБрдУрдВ рдЬреИрд╕реЗ рдХреБрдЫ рдЧрдгрд┐рддреАрдп рдЙрджрд╛рд╣рд░рдг рд╕реБрдЭрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдзрд┐рдХрд╛рдВрд╢ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЬрд╣рд╛рдВ рдЖрдк рдЯреАрдПрд╕ (рдЗрд╕ рдзрд╛рдЧреЗ рдореЗрдВ рдЙрджрд╛рд╣рд░рдгреЛрдВ рд╕рд╣рд┐рдд) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рдореИрдВ рддрд░реНрдХ рджреВрдВрдЧрд╛ рдХрд┐ рдСрдкрд░реЗрдЯрд░ рдУрд╡рд░рд▓реЛрдбрд┐рдВрдЧ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╢рд╛рдпрдж рдПрдХ рдХреЛрдб рдЧрдВрдз рд╣реИред рдРрд╕рд╛ рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдкреАрдЖрдИ рдХреЛ рд╕рд░рд▓ рдмрдирд╛ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд рдХрд░рддрд╛ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓реЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рд╕рддреНрдп рдирд╣реАрдВ рд╣реЛрдирд╛ рдЕрддрд┐ рднреНрд░рд╛рдордХ рдФрд░ рдЕрдирдкреЗрдХреНрд╖рд┐рдд рд╣реИред

foo.x = y;
if (foo.x === y) { // this could be false?

(рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рдореИрдВрдиреЗ рд╕реЗрдЯрд░реНрд╕ рдХреЛ рджреЗрдЦрд╛ рд╣реИ рдЬреЛ рдЙрдЪрд┐рдд рд▓рдЧ рд░рд╣рд╛ рдерд╛ рд▓реЙрдЧрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдФрд░ рд╡рд╕реНрддреБрдУрдВ рдкрд░ "рдЧрдВрджрд╛" рдзреНрд╡рдЬ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддрд╛рдХрд┐ рдХреБрдЫ рдФрд░ рдмрддрд╛ рд╕рдХреЗ рдХрд┐ рдХреЛрдИ рдлрд╝реАрд▓реНрдб рдмрджрд▓ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред рдЗрдирдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдиреБрдмрдВрдз рдХреЛ рдирд╣реАрдВ рдмрджрд▓рддрд╛ рд╣реИ рд╡рд╕реНрддреБред)

@MikeyBurkman

[...] рд▓реЗрдХрд┐рди рдЕрдзрд┐рдХрд╛рдВрд╢ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЬрд╣рд╛рдВ рдЖрдк рдЯреАрдПрд╕ (рдЗрд╕ рдзрд╛рдЧреЗ рдореЗрдВ рдЙрджрд╛рд╣рд░рдгреЛрдВ рд╕рд╣рд┐рдд) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рдореИрдВ рддрд░реНрдХ рджреВрдВрдЧрд╛ рдХрд┐ рдСрдкрд░реЗрдЯрд░ рдУрд╡рд░рд▓реЛрдбрд┐рдВрдЧ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╢рд╛рдпрдж рдПрдХ рдХреЛрдб рдЧрдВрдз рд╣реИ [...]

 foo.x = y; 
 if (foo.x === y) { // this could be false?

рдЗрд╕рд▓рд┐рдП, рдХреЗрд╡рд▓ рдкреНрд░рдХрд╛рд░ рдорд┐рд▓рд╛рди рд╣реЛрдиреЗ рд╕реЗ рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рд╡реНрдпрд╡рд╣рд╛рд░ рдирд╣реАрдВ рд░реЛрдХрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ el.style.display = ''; //so is this now true: el.style.display === ''? рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рднреА рдирд╣реАрдВ рд╣реИред рд╕рд╛рджреЗ рдкреБрд░рд╛рдиреЗ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рд╕рд╛рде рднреА, рдзрд╛рд░рдгрд╛ NaN рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рд╣реИ, рд╡реИрд╕реЗред

рд▓реЗрдХрд┐рди рдЗрд╕рд╕реЗ рднреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдЖрдкрдХрд╛ рддрд░реНрдХ рдЗрд╕ рдмрд╛рдд рдХреЛ рдирдЬрд░рдЕрдВрджрд╛рдЬ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЯреАрдПрд╕ рдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрди рдЪреАрдЬреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд░рд╛рдп рдирд╣реАрдВ рджреА рдЬрд╛ рд╕рдХрддреА рдХреНрдпреЛрдВрдХрд┐ рдЯреАрдПрд╕ рдХреЛ рдореМрдЬреВрджрд╛ рдЬреЗрдПрд╕ рдПрдкрд┐рд╕ рдХреЗ рд╕рд╛рде рдЗрдВрдЯрд░рдСрдк рдХрд░рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдкреНрд░рдореБрдЦ рдФрд░ рдбреАрдУрдПрдо рдЬреИрд╕реА рдЪреАрдЬреЛрдВ рдХреЛ рдмрджрд▓рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИред рдФрд░ рдЗрд╕ рддрд░рд╣, рдЗрд╕рд╕реЗ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рдХрд┐ рдПрдкреАрдЖрдИ рдЖрджрд░реНрд╢ рд╣реИ рдпрд╛ рдирд╣реАрдВ; рдХреНрдпрд╛ рдорд╛рдпрдиреЗ рд░рдЦрддрд╛ рд╣реИ рдХрд┐ рдЯреАрдПрд╕ рдРрд╕реЗ рджрд┐рдП рдЧрдП рдПрдкреАрдЖрдИ рдХреЗ рд╕рд╛рде рд╕рдлрд╛рдИ рд╕реЗ рдЗрдВрдЯрд░рдСрдк рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЕрдм, рдЖрдкрдХреЛ рдпрд╛ рддреЛ рдХрд┐рд╕реА рднреА рдлрд╝реЙрд▓рдмреИрдХ рддрд░реНрдХ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдПрдкреАрдЖрдИ рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ рд╕реЗрдЯрд░ рдХреЛ рджрд┐рдП рдЧрдП рдЖрдЙрдЯ-рдСрдл-рдЧреЗрдЯрд░-рдЯрд╛рдЗрдк рдорд╛рди рдХреЛ рдордЬрдмреВрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╕рдВрдкрддреНрддрд┐ рдХреЛ рдЧреЗрдЯрд░реНрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЯрд╛рдЗрдк рдХрд░рддрд╛ рд╣реИ, рдпрд╛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЯрд╛рдЗрдк рдЪреЗрдХрд┐рдВрдЧ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рддрд╛ рд╣реИ рдкреНрд░рддреНрдпреЗрдХ рдЧреЗрдЯрд░реНрд╕ рд╕рд╛рдЗрдЯ рдкрд░ рдмреЗрдХрд╛рд░ рдкреНрд░рдХрд╛рд░ рдХреЗ рджрд╛рд╡реЗ рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╕рдВрдкрддреНрддрд┐ рдХреЛ рд╕реЗрдЯрд░реНрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЯрд╛рдЗрдк рдХрд░реЗрдВред рдпрд╛, рдЗрд╕рд╕реЗ рднреА рдмрджрддрд░: рдЯреАрдПрд╕ рдЬреЛ рдХреБрдЫ рднреА рд╣реЛрддрд╛ рд╣реИ рд╡рд╣ рдбреАрдУрдПрдо рдХреЗ рд▓рд┐рдП рдПрдиреЛрдЯреЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реЛрддрд╛ рд╣реИ, рднрд▓реЗ рд╣реА рд╡рд╣ рдЖрджрд░реНрд╢ рд╣реЛред

рд╡реЗ рд╕рднреА рд╡рд┐рдХрд▓реНрдк рдЦрд░рд╛рдм рд╣реИрдВред рдЗрд╕рд╕реЗ рдмрдЪрдиреЗ рдХрд╛ рдПрдХрдорд╛рддреНрд░ рддрд░реАрдХрд╛ рдЬреЗрдПрд╕ рдПрдкрд┐рд╕ рдХреЛ рдпрдерд╛рд╕рдВрднрд╡ рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдирд╛ рд╣реИ, рдФрд░ рдпрд╣рд╛рдВ: рдпрд╣ рд╕рдВрднрд╡ рд▓рдЧрддрд╛ рд╣реИ (рдмреЗрд╢рдХ рдЯреАрдПрд╕ рдЖрдВрддрд░рд┐рдХ рдХреЗ рдХрд┐рд╕реА рднреА рдЬреНрдЮрд╛рди рдХреЗ рдмрд┐рдирд╛ рдЬреЛ рдЗрд╕реЗ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЧреИрд░-рддреБрдЪреНрдЫ рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИ)ред

рдпрд╣ рд╕рдВрднрд╡ рд▓рдЧрддрд╛ рд╣реИ (рдмреЗрд╢рдХ рдЯреАрдПрд╕ рдЗрдВрдЯрд░реНрдирд▓ рдХреЗ рдХрд┐рд╕реА рднреА рдЬреНрдЮрд╛рди рдХреЗ рдмрд┐рдирд╛ рдЬреЛ рдЗрд╕реЗ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЧреИрд░-рддреБрдЪреНрдЫ рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИ)

рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рдХреБрдЫ рдирдП рдкреНрд░рдХрд╛рд░ рдХреЗ рдбрд┐рдХреНрд▓реЗрд░реЗрд╢рди рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЛ рдЙрдиреНрд╣реЛрдВрдиреЗ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рд╕рдХреНрд╖рдо рдХрд┐рдпрд╛ рдерд╛, рдЬрдм рдпрд╣ рдкрд╣рд▓реЗ рдХрдо рд╕рдВрднрд╡ рдерд╛, рддреЛ рдЗрд╕реЗ рд╕реНрдкрд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рдереЗ, рдЗрд╕рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдлрд┐рд░ рд╕реЗ рдЦреЛрд▓рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП ... @RyanCavanaugh

рдПрдХ рдЖрджрд░реНрд╢ рджреБрдирд┐рдпрд╛ рдореЗрдВ TS рд╕рднреА JS API рдХреЗ рд╕рд╛рде рдЗрдВрдЯрд░рдСрдк рдХрд░реЗрдЧрд╛ред рд▓реЗрдХрд┐рди рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИред JS рдореБрд╣рд╛рд╡рд░реЛрдВ рдХрд╛ рдПрдХ рд╕рдореВрд╣ рд╣реИ рдЬрд┐рд╕реЗ TS рдореЗрдВ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдЯрд╛рдЗрдк рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореИрдВ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рд╡реЗ рдЙрди рдЪреАрдЬреЛрдВ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░реЗрдВ рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмреЗрд╣рддрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдореБрд╣рд╛рд╡рд░реЛрдВ рдХреА рдУрд░ рд▓реЗ рдЬрд╛рддреА рд╣реИрдВ, рдмрджрддрд░ рдирд╣реАрдВред рдЬрдмрдХрд┐ рдЗрд╕рдХрд╛ рдПрдХ рдЙрдЪрд┐рдд рддрд░реАрдХреЗ рд╕реЗ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛, рдПрдХ рджрд░реНрдЬрди рдЕрдиреНрдп рдЪреАрдЬреЗрдВ рд╣реИрдВ рдЬреЛ рдореИрдВ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдЪрд╛рд╣реВрдВрдЧрд╛ рдХрд┐ рд╡реЗ рдЕрдкрдирд╛ рд╕реАрдорд┐рдд рд╕рдордп рдкрд╣рд▓реЗ рдмрд┐рддрд╛рдПрдВред рдпрд╣ рдЙрд╕ рд╕реВрдЪреА рдореЗрдВ рдмрд╣реБрдд рдиреАрдЪреЗ рд╣реИред

@MikeyBurkman рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдХрд╛ рдкреНрд░рд╢реНрди рдорд╛рдиреНрдп рд╣реИред рдореЗрд░реА рдкреНрд░рд╛рдердорд┐рдХ рдЪрд┐рдВрддрд╛ @RyanCavanaugh рдХреЗ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдмрдВрдж рдХрд░рдиреЗ рдФрд░ рдЗрд╕реЗ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд╣реИред рдЗрд╕ рдереНрд░реЗрдб рдкрд░ рдмрддрд╛рдП рдЧрдП рд╕рднреА рдореБрджреНрджреЛрдВ рдХреЛ рдЦрд╛рд░рд┐рдЬ рдХрд░рдирд╛ рд╕реАрдзреЗ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдмрддрд╛рдП рдЧрдП рдорд┐рд╢рди рдХреЗ рд╕рд╛рде рд╕рдВрдШрд░реНрд╖ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ "рд╕реБрдкрд░рд╕реЗрдЯ" рд╣реЛрдирд╛ рд╣реИ (рдПрдХ рд╕рдмрд╕реЗрдЯ рдХреЗ рдмрдЬрд╛рдп)ред

рд╣рд╛рдБ, рдореИрдВ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╕рд╣рдордд рд╣реЛ рд╕рдХрддрд╛ рд╣реВрдБ рдХрд┐ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рд╢рд╛рдпрдж рдмрдВрдж рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдХреБрдЫ рдРрд╕рд╛ рд╣реИ рдЬрд┐рд╕реЗ _probably_ рдЕрдВрддрддрдГ рддрдп рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рдпрд╣ рд╣реЛрдЧрд╛ред)

рдЬрдмрдХрд┐ рдЗрд╕рдХрд╛ рдПрдХ рдЙрдЪрд┐рдд рддрд░реАрдХреЗ рд╕реЗ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛, рдПрдХ рджрд░реНрдЬрди рдЕрдиреНрдп рдЪреАрдЬреЗрдВ рд╣реИрдВ рдЬреЛ рдореИрдВ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдЪрд╛рд╣реВрдВрдЧрд╛ рдХрд┐ рд╡реЗ рдЕрдкрдирд╛ рд╕реАрдорд┐рдд рд╕рдордп рдкрд╣рд▓реЗ рдмрд┐рддрд╛рдПрдВ

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкрд╣рд▓реВ рдХреЛ рдХрдо рдХрд░рдХреЗ рдЖрдВрдХ рд░рд╣реЗ рд╣реИрдВ, рдЬрд┐рд╕рд╕реЗ рдпрд╣ рдореМрдЬреВрджрд╛ рдбреЛрдо рдПрдкреАрдЖрдИ рдФрд░ рдореМрдЬреВрджрд╛ рдЬреЗрдПрд╕ рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рд╕реБрд░рдХреНрд╖рд┐рдд рдмрдирд╛рдиреЗ рд╡рд╛рд▓рд╛ рд╣реИред рдпрд╣ рдХреЗрд╡рд▓ рдЖрдкрдХреЗ рдЕрдкрдиреЗ рдХреЛрдб рд╕реЗ рдЕрдзрд┐рдХ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдореМрдЬреВрдж рд╣реИ, рдЗрд╕рдХреЗ рдмреБрд▓рдмреБрд▓реЗ рдХреЗ рднреАрддрд░, рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИред

рдпрд╣рд╛рдВ рдореЗрд░рд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣реИ, рдореИрдВ рдШрдЯрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддрд╛ рд╣реВрдВ, рдФрд░ рдЬрдм рддрдХ рдореИрдВ рдЬрд╛рдирдмреВрдЭрдХрд░ рдЕрдкрдиреЗ рдбреНрд░реВрдЯрд░реНрд╕ рдХреЛ рджрд┐рдП рдЧрдП рд╕реЗрдЯрд░реНрд╕/рдЧреЗрдЯрд░реНрд╕ рдХреЗ рдмреАрдЪ рдЗрд╕ рдмреЗрдореЗрд▓ рдХрд╛ рдХрд╛рд░рдг рдирд╣реАрдВ рдмрдирд╛рдКрдВрдЧрд╛ред рдХрднреА-рдХрднреА рдореЗрд░реЗ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рдЕрдиреНрдп рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдЗрдВрдЯрд░рдлреЗрд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдореЗрд░рд╛ рд╣рд╛рде рдордЬрдмреВрд░ рд╣реЛрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдХреЛрдгреАрдп рд╕рднреА рдЗрдирдкреБрдЯ рдЧреБрдгреЛрдВ рдХреЛ рдорд╛рд░реНрдХрдЕрдк рд╕реЗ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдШрдЯрдХ рдкрд░ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ, рдмрдЬрд╛рдп рд▓рдХреНрд╖реНрдп рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрдкрдиреЗ рдЬреНрдЮрд╛рди рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдЬрдмрд░рджрд╕реНрддреА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП (рдХрдо рд╕реЗ рдХрдо, рдЖрдЦрд┐рд░реА рдмрд╛рд░ рдореИрдВрдиреЗ рдЬрд╛рдВрдЪ рдХреА)ред рддреЛ, рдХреНрдпрд╛ рдЖрдк рддрд╛рд░ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рд╕реЗ рдЗрдирдХрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ? рдХреНрдпрд╛ рдЖрдк рд╕рдм рдХреБрдЫ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдмрдирд╛рддреЗ рд╣реИрдВ, рднрд▓реЗ рд╣реА рдпрд╣ рдЖрдкрдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднрдпрд╛рдирдХ рдмрдирд╛ рджреЗрдЧрд╛? рдпрд╛ рдЖрдк рд╡рд╣ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдЖрдк рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд░реЗрдВрдЧреЗ рдФрд░ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ рдЬреИрд╕реЗ: рд╕реНрдЯреНрд░рд┐рдВрдЧ | рд░рдВрдЧ рд▓реЗрдХрд┐рди рднрдпрд╛рдирдХ рдЧреЗрдЯрд░реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред рдпреЗ рд╕рднреА рдмрд╣реБрдд рд╣реА рднрдпрд╛рдирдХ рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ рдЬреЛ рд╕реБрд░рдХреНрд╖рд╛ рдХреЛ рдХрдо рдХрд░рддреЗ рд╣реИрдВ, рдЬрдм рдЯрд╛рдЗрдк рд╕рд┐рд╕реНрдЯрдо рд╕реЗ рдХреБрдЫ рдЕрддрд┐рд░рд┐рдХреНрдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдореЗрдВ рдорджрдж рдорд┐рд▓рддреАред

рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдХреЗрд╡рд▓ рдХреЛрдгреАрдп рдирд╣реАрдВ рд╣реИ рдЬреЛ рдЗрди рдореБрджреНрджреЛрдВ рдХрд╛ рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИред рдЙрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдХреЛрдгреАрдп рдШрд╛рд╡ рд╣реЛ рдЧрдпрд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдбреАрдУрдПрдо рдореЗрдВ рдмрд╣реБрдд рд╕реЗ рдкрд░рд┐рджреГрд╢реНрдпреЛрдВ рдХреЛ рдкреНрд░рддрд┐рдмрд┐рдВрдмрд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдПрдХ рд╕рдВрдкрддреНрддрд┐ рд╕реЗрдЯ рдкрд░ рдСрдЯреЛ-рдЬрдмрд░рджрд╕реНрддреА рд╣реЛрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдЧреЗрдЯрд░ рд╣рдореЗрд╢рд╛ рдПрдХ рдЕрдиреБрдорд╛рдирд┐рдд рдПрдХрд╡рдЪрди рдкреНрд░рдХрд╛рд░ рд╣реЛрддрд╛ рд╣реИред

рдереЛрдбрд╝рд╛ рдКрдкрд░ рдХреА рдУрд░ рджреЗрдЦреЗрдВ: рдХреЛрдгреАрдп рдЖрдкрдХреЗ рд╡рд┐рдЪрд╛рд░ рд╕реЗ рдмрд╣реБрдд рдЦрд░рд╛рдм рд╣реИ ред

рдореЗрд░реЗ рд▓рд┐рдП рдЖрдорддреМрд░ рдкрд░ рдпрд╣ рдореБрджреНрджрд╛ рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдЖрдк рдХреБрдЫ рд╕рд╛рдорд╛рдиреНрдп-рдЙрджреНрджреЗрд╢реНрдп рднрдВрдбрд╛рд░рдг рдХреЗ рдЖрд╕рдкрд╛рд╕ рд░реИрдкрд░ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЬреЛ рдХреБрдВрдЬреА-рдореВрд▓реНрдп рдЬреЛрдбрд╝реЗ рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЖрдк рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдХреБрдЫ рдЪрд╛рдмрд┐рдпреЛрдВ рддрдХ рд╕реАрдорд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред

class Store {
  private dict: Map<string, any>;

  get name(): string | null {
    return this.dict.get('name') as string | null;
  }

  set name(value: string) {
    this.dict.set('name', value);
  }
}

рдЖрдк рдЗрд╕ рддрд░рд╣ рдХреА рдмрд╛рдзрд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ: рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ null рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдпрджрд┐ рдореВрд▓реНрдп рдкрд╣рд▓реЗ рд╕реЗрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдЗрд╕реЗ null рдкрд░ рд╕реЗрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╡рд░реНрддрдорд╛рди рдореЗрдВ, рдЖрдк рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ, рдХреНрдпреЛрдВрдХрд┐ рд╕реЗрдЯрд░ рдЗрдирдкреБрдЯ рдкреНрд░рдХрд╛рд░ рдореЗрдВ null рд╢рд╛рдорд┐рд▓ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

@ рдлреИрди-рдЯреЙрдо, рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдлрд┐рд░ рд╕реЗ рдЦреЛрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рд▓рд┐рдП рдорд╣рд╛рди рдЙрдкрдпреЛрдЧ-рдорд╛рдорд▓рд╛! рд░рдЦреЛ рдФрд░ рдЖрдУред

рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рдЕрдк рд╡реЛрдЯреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╣реИ!

рдпрд╣ TS рдЯреАрдо рдХрд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╡реЗ рдЬреИрд╕рд╛ рдЪрд╛рд╣реЗрдВ рд╡реИрд╕рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╡реЗ рдЖрдирдВрдж рд▓реЗрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЙрдирдХрд╛ рд▓рдХреНрд╖реНрдп рдмрд╛рд╣рд░реА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд╕рдореБрджрд╛рдп рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдпрдерд╛рд╕рдВрднрд╡ рдЙрдкрдпреЛрдЧреА рдмрдирд╛рдирд╛ рд╣реИ, рддреЛ рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ TS рдЯреАрдо рд╕рдореБрджрд╛рдп рдХреЗ рдЙрдЪреНрдЪ рд╡реЛрдЯреЛрдВ рдХреЛ рдЧрдВрднреАрд░рддрд╛ рд╕реЗ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦ рд╕рдХрддреА рд╣реИред

typescriptlang.org рдХрд╛ рдореБрдЦрдкреГрд╖реНрда рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЧрд▓рдд рд╣реИ рдЬрдм рдпрд╣ рдмрддрд╛рддрд╛ рд╣реИ:

рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдПрдХ рдЯрд╛рдЗрдк рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╕реБрдкрд░рд╕реЗрдЯ рд╣реИ рдЬреЛ рд╕рд╛рджреЗ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИред

рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ _subset_ рдХрд╛ рдПрдХ рдЯрд╛рдЗрдк рдХрд┐рдпрд╛ рд╣реБрдЖ _superset_ рд╣реИ рдЬреЛ рд╕рд╛рджреЗ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд рд╣реЛрддрд╛ рд╣реИред :рд╕реНрдорд╛рдЗрд▓реА:

рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдПрдХ рд╕рдмрд╕реЗрдЯ рдХрд╛ рдЯрд╛рдЗрдк рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╕реБрдкрд░рд╕реЗрдЯ рд╣реИ рдЬреЛ рд╕рд╛рджреЗ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИред

рдЕрдзрд┐рдХ рдХреВрдЯрдиреАрддрд┐рдХ рд░реВрдк рд╕реЗ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдПрдХ рд╕реБрд╡рд┐рдЪрд╛рд░рд┐рдд рд╕реБрдкрд░рд╕реЗрдЯ рд╣реИ, рдЬрдм рдЯреАрдо рдЯрд╛рдЗрдк рд╕рд┐рд╕реНрдЯрдо рдореЙрдбрд▓рд┐рдВрдЧ рд╕реЗ рдЗрд╕ рддрд░рд╣ рдХреА рд░рд╛рдп рдХреЛ рдЫреЛрдбрд╝ рджреЗрддреА рд╣реИред

рд╡реЗ рдХрд╣ рд░рд╣реЗ рд╣реИрдВ, "рд╣рдо рдЗрд╕реЗ рдореЙрдбрд▓ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдХрд░рдирд╛ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдХрдард┐рди рд╣реИ, рдФрд░ рд╣рдореЗрдВ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдЗрд╕реЗ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП"ред рд▓реЗрдХрд┐рди рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЙрди рдЪреАрдЬреЛрдВ рд╕реЗ рднрд░рд╛ рд╣реБрдЖ рд╣реИ рдЬреЛ рдЖрдк рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЖрдо рддреМрд░ рдкрд░ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЖрдкрдХреЛ рдЗрди рдЪреАрдЬреЛрдВ рдХреЛ рдХрд░рдиреЗ рд╕реЗ рдирд╣реАрдВ рд░реЛрдХреЗрдЧрд╛ рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЗрдЪреНрдЫрд╛ рдФрд░ рдЬрд╛рдирдХрд╛рд░реА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рд╛рдорд╛рдиреНрдп рд░рдгрдиреАрддрд┐ рдХреА рддрд░рд╣ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд░рд╛рдп рдирд╣реАрдВ рд╣реИ рдЖрдк рдХреЗрд╡рд▓ рдЯрд╛рдЗрдкрдкреНрд░рддрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдирд╣реАрдВ рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВред

рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдЗрд╕ рдЖрдо (рдбреАрдУрдПрдо рдореЗрдВ рдкреНрд░рдпреБрдХреНрдд!) рдкрд░рд┐рджреГрд╢реНрдп рдХреЛ рдореЙрдбрд▓ рдХрд░рдиреЗ рд╕реЗ рдЗрдВрдХрд╛рд░ рдХрд░рдирд╛ рдмрд╣реБрдд рдЕрдЬреАрдм рд╣реИ, рдЗрд╕ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдХрд╛ рд╣рд╡рд╛рд▓рд╛ рджреЗрддреЗ рд╣реБрдП рдХрд┐ рдПрдкреАрдЖрдИ рдХреЛ рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЗрдЯрд░ рдЖрдзрд╛рд░рд┐рдд рдЬрдмрд░рджрд╕реНрддреА рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рд╡рд░реНрддрдорд╛рди рдореЗрдВ, рдпрд╣ рд╕рдВрднрд╡ рдирд╣реАрдВ рд▓рдЧрддрд╛ рд╣реИ, рдФрд░ рдореБрдЭреЗ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рдХрд╛ рд╕рд╣рд╛рд░рд╛ рд▓реЗрдирд╛ рд╣реЛрдЧрд╛:

class MyClass {

    private _myDate: moment.Moment;

    get myDate(): moment.Moment {
        return this._myDate;
    }

    set myDate(value: moment.Moment) {
        assert.fail('Setter for myDate is not available. Please use: setMyDate() instead');
    }

    setMyDate(value: Date | moment.Moment) {
        this._myDate = moment(value);
    }
}

рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдЖрдк рдПрдХ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╡рд╣рд╛рдВ рдХрд╕реНрдЯрдо рд╕реЗрдЯрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдпрджрд┐ рдХреЗрд╡рд▓ рдЙрд╕реА рд╕рдордп рдЖрдк рдЙрд╕ рдорд╛рди рдХреЛ рд╕реЗрдЯ рдХрд░ рд░рд╣реЗ рд╣реИрдВред

constructor(value: Date | moment.Moment) {
    this.setMyDate(value);
}

рд╕реАрдзреЗ рдорд╛рди рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╕рдордп рд╕рдорд╕реНрдпрд╛ рдЕрднреА рднреА рдмрдиреА рд╣реБрдИ рд╣реИред

5.5 рд╕рд╛рд▓ рд╕реЗ рдЕрдзрд┐рдХ рд╕рдордп рдХреЗ рдмрд╛рдж рдЗрд╕ рдкрд░ рдХреЛрдИ рдЕрдкрдбреЗрдЯ?

@xhliu рдЬреИрд╕рд╛ рдХрд┐ рд▓реЗрдмрд▓ рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдпрд╣ рдПрдХ рдбрд┐рдЬрд╝рд╛рдЗрди рд╕реАрдорд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рдирд╛ рдмрд╣реБрдд рдЬрдЯрд┐рд▓ рд╣реИ, рдФрд░ рдЗрд╕рд▓рд┐рдП рд╕рдорд╕реНрдпрд╛ рдмрдВрдж рд╣реИред рдореБрдЭреЗ рдЕрдкрдбреЗрдЯ рдХреА рдЙрдореНрдореАрдж рдирд╣реАрдВ рдереАред рдПрдХ рдмрдВрдж рдореБрджреНрджреЗ рдХреЗ рд▓рд┐рдП рд╕рдордп рдХреА рд▓рдВрдмрд╛рдИ рдЕрдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реИред

рдХреГрдкрдпрд╛ рдлрд┐рд░ рд╕реЗ рдЦреЛрд▓реЗрдВред рд╕рд╛рде рд╣реА рдЗрд╕реЗ рдЗрдВрдЯрд░рдлреЗрд╕ рд╕реНрддрд░ рдкрд░ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред рдПрдХ рдЙрддреНрдХреГрд╖реНрдЯ рдЙрджрд╛рд╣рд░рдг рд╣реИ рдЬрдм рдПрдХ рдкреНрд░реЙрдХреНрд╕реА рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЬрд╣рд╛рдВ рдЖрдк рдЬреЛ рдкрдврд╝ рдФрд░ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдЙрд╕ рдкрд░ рдЖрдкрдХреЛ рдкреВрд░реНрдг рд▓рдЪреАрд▓рд╛рдкрди рд╣реИред

@xhliu ... рдкрддрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЬрдЯрд┐рд▓ ...

https://ts-ast-viewer.com/#code/MYewdgzgLgBFCm0DyAjAVjAvDA3gKBkJgDMQQAuGAIhQEMAnKvAXzzwWXQDpSQg

const testObj = {
    foo: "bar"
}

testObj.foo

рдкреНрд░рддреАрдХ рдлреВ рдХрд╛ рдпрд╣ рдХрд╣рдирд╛ рд╣реИ:

  foo
    flags: 4
    escapedName:"foo"
    declarations: [
      PropertyAssignment (foo)
    ]
    valueDeclaration: PropertyAssignment (foo)

рдЕрддрд┐рд░рд┐рдХреНрдд рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП рдпрд╣рд╛рдБ рдмрд╣реБрдд рдЬрдЧрд╣ рд╣реИ, рдЬреЛ TS рдХреА рдУрд░ рд╕реЗ рдмрдврд╝рд┐рдпрд╛ рдбрд┐рдЬрд╝рд╛рдЗрди рд╣реИред рдЬрд┐рд╕рдиреЗ рднреА рдЗрд╕реЗ рдбрд┐рдЬрд╛рдЗрди рдХрд┐рдпрд╛ рд╣реИ, рдЙрд╕рдиреЗ рд╢рд╛рдпрдж рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реБрд╡рд┐рдзрд╛рдУрдВ (рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдмрдбрд╝реЗ рд╡рд╛рд▓реЗ) рдХреЛ рд╕рдВрднрд╡ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдРрд╕рд╛ рдХрд┐рдпрд╛ рд╣реИред

рдЗрд╕ рдмрд┐рдВрджреБ рд╕реЗ рд╕рдЯреНрдЯрд╛:

рдпрджрд┐ рдпрд╣ рдШреЛрд╖рд┐рдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рдерд╛ (рдЫрджреНрдо рдХреЛрдб рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП) рдПрдХ accessDelclaration: AccessSpecification (foo) , рддреЛ PropertyAccessExpression рдЬреЛ рдкреНрд░рддреАрдХ рдлреВ рдФрд░ рдЙрд╕рдХреА рдШреЛрд╖рдгрд╛рдУрдВ рд╕реЗ рдЕрд╡рдЧрдд рд╣реИ, рд╕рд╢рд░реНрдд рд░реВрдк рд╕реЗ рдЬрд╛рдВрдЪ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ "рдПрдХреНрд╕реЗрд╕ рдбрд┐рдХреНрд▓реЗрд░реЗрд╢рди" рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдЙрд╕ рд╕реЗ рдЯрд╛рдЗрдкрд┐рдВрдЧ рдХрд╛ рдкреНрд░рдпреЛрдЧ рдХрд░реЗрдВред

рдорд╛рди рд▓реЗрдВ рдХрд┐ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЙрд╕ accessDelclaration рд╕рдВрдкрддреНрддрд┐ рдХреЛ "foo" рдкреНрд░рддреАрдХ рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдореМрдЬреВрдж рд╣реИ, рддреЛ PropertyAccessExpression ts.createIdentifier("foo") рд╕реЗ рдкреНрд░рд╛рдкреНрдд рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рддреАрдХ рд╕реЗ "AccessSpecification" рдХреЛ рдЦреАрдВрдЪрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

ts.createPropertyAccess(
  ts.createIdentifier("testObj"),
  ts.createIdentifier("foo")
)

рдЕрдиреБрдорд╛рдирддрдГ, рдРрд╕рд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдЪреБрдиреМрддреА рдХрд╛ рд╕рдмрд╕реЗ рдХрдард┐рди рд╣рд┐рд╕реНрд╕рд╛ рд╕рд┐рдВрдЯреИрдХреНрд╕ (рдпрд╛ рд╢рд╛рдпрдж рдПрдХ рдХрдВрдкрдиреА рджрд░реНрд╢рди?) ts.createPropertyAccess() рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдПрдХ рдПрдХрд▓ рд╢рд░реНрдд рдЬреЛрдбрд╝реА рдЬрд╛рдПрдЧреА, рдФрд░ рдЙрд╕ рд╕реНрдерд┐рддрд┐ рдФрд░ рдЙрд╕рдХреЗ рдкреНрд░рднрд╛рд╡реЛрдВ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдШреЛрд╖рдгрд╛ рд╡рд░реНрдЧ рдХреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рдкреНрд░реЙрдкрд░реНрдЯреА рдХреЗ рдкреНрд░рддреАрдХ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдмрд╣реБрдд рд╕рд╛рд░реЗ рдЕрдЪреНрдЫреЗ рдЙрджрд╛рд╣рд░рдг рд▓рд┐рдЦреЗ рдЧрдП рд╣реИрдВ рдХрд┐ рдЗрд╕рдХреА рд╕рдЦреНрдд рдЬрд░реВрд░рдд рдХреНрдпреЛрдВ рд╣реИ (рд╡рд┐рд╢реЗрд╖рдХрд░ рдбреЛрдо рдФрд░ рдПрдВрдЧреБрд▓рд░ рдХреЗ рд▓рд┐рдП)ред

рдореИрдВ рдмрд╕ рдЗрддрдирд╛ рдЬреЛрдбрд╝реВрдВрдЧрд╛ рдХрд┐ рдкреБрд░рд╛рдиреЗ рдЬреЗрдПрд╕ рдХреЛрдб рдХреЛ рдЯреАрдПрд╕ рдореЗрдВ рдорд╛рдЗрдЧреНрд░реЗрдЯ рдХрд░рддреЗ рд╕рдордп рдореИрдВ рдЖрдЬ рдЗрд╕рд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рд╣реБрдЖ, рдЬрд╣рд╛рдВ string рд╕реЗ window.location рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдЪрд▓рд╛ рдФрд░ рдореБрдЭреЗ as any рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдХрд░рдирд╛ рдкрдбрд╝рд╛ рдореИрдВ

Window.location рдХреЗрд╡рд▓-рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЧреБрдг рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЗ рд╡рд░реНрддрдорд╛рди рд╕реНрдерд╛рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд╕рд╛рде рд╕реНрдерд╛рди рдСрдмреНрдЬреЗрдХреНрдЯ рджреЗрддрд╛ рд╣реИред

рд╣рд╛рд▓рд╛рдВрдХрд┐ Window.location рдХреЗрд╡рд▓-рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдерд╛рди рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИ, рдЖрдк рдЗрд╕реЗ DOMString рднреА рдЕрд╕рд╛рдЗрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЖрдк рд╕реНрдерд╛рди рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреИрд╕реЗ рдХрд┐ рдпрд╣ рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдереА: рд╕реНрдерд╛рди = ' http://www.example.com ' location.href = ' http://www.example.com ' рдХрд╛ рдкрд░реНрдпрд╛рдп рд╣реИ ред .
рд╕реНрд░реЛрдд

рдкреБрд░рд╛рдиреЗ JS рдХреЛрдб рдХреЛ TS рдореЗрдВ рдорд╛рдЗрдЧреНрд░реЗрдЯ рдХрд░рдирд╛ рдЬрд╣рд╛рдВ string рд╕реЗ window.location рдЕрд╕рд╛рдЗрди рдХрд░рдирд╛ рдХрд╛рдо рдирд╣реАрдВ рдХрд┐рдпрд╛ рдФрд░ рдореБрдЭреЗ as any рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдХрд░рдирд╛ рдкрдбрд╝рд╛

рдпрд╣ рдПрдХ рдмрдврд╝рд┐рдпрд╛ рдЙрджрд╛рд╣рд░рдг рд╣реИред

рдЯреАрдПрд╕ рдХреЛ рдЗрд╕рдХреА рдЬрд░реВрд░рдд рд╣реИред рдпрд╣ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рд╛рдорд╛рдиреНрдп рд╣рд┐рд╕реНрд╕рд╛ рд╣реИред

рдореИрдВ рджреЗрдЦрддрд╛ рд╣реВрдВ рдХрд┐ рд╡рд░реНрддрдорд╛рди рдореБрджреНрджрд╛ рдмрдВрдж рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рд▓реЗрдХрд┐рди рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ, рдЗрд╕ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рдПрд╣рд╕рд╛рд╕ рдирд╣реАрдВ рд╣реБрдЖ рдерд╛?

@AGluk , рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдлрд┐рд░ рд╕реЗ рдЦреЛрд▓рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

Zlatkovsky picture Zlatkovsky  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

Antony-Jones picture Antony-Jones  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

remojansen picture remojansen  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

weswigham picture weswigham  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

CyrusNajmabadi picture CyrusNajmabadi  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ