Typescript: рдкреНрд░рддреАрдХреЛрдВ рдХреЗ рд╕рд╛рде рдЕрдиреБрдХреНрд░рдордг рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВ

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

рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдЕрдм ES6 рд▓рдХреНрд╖реНрдп рдореЛрдб рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд╛рдПрдБ Symbol ред рд╣рд╛рд▓рд╛рдБрдХрд┐ рдЬрдм рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдкреНрд░рддреАрдХ рдХреЗ рд╕рд╛рде рдЕрдиреБрдХреНрд░рдорд┐рдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рдЬрд╛рддреА рд╣реИ, рддреЛ рдореБрдЭреЗ рдПрдХ рддреНрд░реБрдЯрд┐ рдорд┐рд▓рддреА рд╣реИ (рдПрдХ рдЗрдВрдбреЗрдХреНрд╕ рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рддрд░реНрдХ рдкреНрд░рдХрд╛рд░ 'рд╕реНрдЯреНрд░рд┐рдВрдЧ', 'рд╕рдВрдЦреНрдпрд╛', рдпрд╛ 'рдХреЛрдИ') рдХрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

var theAnswer = Symbol('secret');
var obj = {};
obj[theAnswer] = 42; // Currently error, but should be allowed
Moderate Fix Available Suggestion help wanted

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

рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ 3.0.1, рдЗрд╕рд╕реЗ рдХрд╛рдЯ рд▓рд┐рдпрд╛ рдЧрдпрд╛ред
рдореИрдВ рдПрдХ рдРрд╕рд╛ рд░рд┐рдХреЙрд░реНрдб рдЪрд╛рд╣рддрд╛ рд╣реВрдБ рдЬреЛ symbol рд╕реНрд╡реАрдХрд╛рд░ рдХрд░реЗ рд▓реЗрдХрд┐рди TS рдореБрдЭреЗ рдирд╣реАрдВ рджреЗрдЧрд╛ред

рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдЦреЛрд▓реЗ рд╣реБрдП 3.5 рд╕рд╛рд▓ рд╣реЛ рдЧрдП рд╣реИрдВ, рдХреНрдпрд╛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрдм рдкреНрд░рддреАрдХ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдХреГрдкрдпрд╛ this

рд╡рд┐рдбрдВрдмрдирд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЯреАрдПрд╕ рдЦреБрдж рд╡рд┐рд░реЛрдзрд╛рднрд╛рд╕реА рд╣реИред
TS keyof any = number | string | symbol ред

рд▓реЗрдХрд┐рди рддрдм рдЬрдм рдЖрдк record[symbol] TS рдХреЛ рдордирд╛ рдХрд░рддреЗ рд╣реИрдВ
_Type 'рдкреНрд░рддреАрдХ' рдХреЛ indexer_ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

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

рдпрд╣ ES6 рдкреНрд░рддреАрдХ рдХрд╛ рдПрдХ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ рдЬрд┐рд╕рдХрд╛ рд╕рдорд░реНрдерди рд╣рдо @JsonFreeman рдкрд░ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдЕрдЧрд▓реЗ рд░рд┐рд▓реАрдЬ рдореЗрдВ рдЖрдкрдХреЗ рдХреЛрдб рдирдореВрдиреЗ рдХрд╛ рд╕рдорд░реНрдерди рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

@ рд╡реЗрдпрд░рдореАрдк , # рез реп request request рдХреЗ рдЕрдиреБрд░реЛрдз рдХреЗ рд╕рд╛рде, рдпрд╣ рдХрд╛рдиреВрдиреА рд╣реЛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ obj[theAnswer] any рдЯрд╛рдЗрдк рд╣реЛрдЧрд╛ред рдХреНрдпрд╛ рдЖрдк рдЬреЛ рдЦреЛрдЬ рд░рд╣реЗ рд╣реИрдВ, рдЙрд╕рдХреЗ рд▓рд┐рдП рдпрд╣ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ рдпрд╛ рдЖрдкрдХреЛ рдордЬрдмреВрдд рдЯрд╛рдЗрдкрд┐рдВрдЧ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ?

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

var theAnswer = Symbol('secret');
interface DeepThought {
   [theAnswer]: number;
}

рдЙрд╕ рдкреАрдЖрд░ рдореЗрдВ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдирд╣реАрдВ:

_ рдпрд╣ рдкреНрд░рддреАрдХ рдЗрдВрдбреЗрдХреНрд╕рд░реНрд╕ рдХреЛ рдХрд╡рд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдордирдорд╛рдиреЗ рдврдВрдЧ рд╕реЗ рдкреНрд░рддреАрдХ рдХреБрдВрдЬреА_ рдХреЗ рд╕рд╛рде рдирдХреНрд╢реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ @werepie @danquirk рд╕реЗ рдЬреНрдпрд╛рджрд╛ рдордЬрдмреВрдд рдЯрд╛рдЗрдкрд┐рдВрдЧ рдХреА рдмрд╛рдд рдХрд░ рд░рд╣рд╛ рд╣реИред рдпрд╣рд╛рдБ рд╕рдорд░реНрдерди рдХреЗ 3 рд╕реНрддрд░ рд╣реИрдВред рд╕рдмрд╕реЗ рдореВрд▓ рд╕реНрддрд░ рдореЗрд░реЗ рдкреАрдЖрд░ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕рд┐рд░реНрдл рдЙрди рдкреНрд░рддреАрдХреЛрдВ рдХреЗ рд▓рд┐рдП рд╣реИ рдЬреЛ рд╡реИрд╢реНрд╡рд┐рдХ рдкреНрд░рддреАрдХ рд╡рд╕реНрддреБ рдХреЗ рдЧреБрдг рд╣реИрдВ, рди рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдкреНрд░рддреАрдХред рдЗрд╕рд▓рд┐рдП,

var theAnswer = Symbol('secret');
interface DeepThought {
    [Symbol.toStringTag](): string; // Allowed
    [theAnswer]: number; // not allowed
}

рд╕рдорд░реНрдерди рдХрд╛ рдЕрдЧрд▓рд╛ рд╕реНрддрд░ рдкреНрд░рддреАрдХ рд╕реВрдЪрдХ рдХреЛ рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рд╣реЛрдЧрд╛:

var theAnswer = Symbol('secret');
interface DeepThought {
   [s: symbol]: number;
}
var d: DeepThought;
d[theAnswer] = 42; // Typed as number

рдпрд╣ рд╣рдорд╛рд░реЗ рд░рдбрд╛рд░ рдкрд░ рд╣реИ, рдФрд░ рдЗрд╕реЗ рдЖрд╕рд╛рдиреА рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рд╕рдмрд╕реЗ рдордЬрдмреВрдд рд╕реНрддрд░ рд╡рд╣ рд╣реИ рдЬреЛ рдЖрдк рдкреВрдЫ рд░рд╣реЗ рд╣реИрдВ, рдЬреЛ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╣реИ:

var theAnswer = Symbol('secret');
var theQuestion = Symbol('secret');
interface DeepThought {
   [theQuestion]: string;
   [theAnswer]: number;
}
var d: DeepThought;
d[theQuesiton] = "why";
d[theAnswer] = 42;

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

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

@ рд╕реНрд╡рдкреНрдирдореЗрд╡ рдореИрдВрдиреЗ # 2012 рдореЗрдВ рдереЛрдбрд╝рд╛ рд▓реЗрдЦрди рдХрд┐рдпрд╛ рдерд╛ рдЬрд┐рд╕рдореЗрдВ рдЖрдкрдХреА рд░реБрдЪрд┐ рд╣реЛ рд╕рдХрддреА рд╣реИред

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

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

рдХрд┐рд╕реА рднреА рд╡рд┐рдЪрд╛рд░ рдЬрдм symbol рдПрдХ рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдиреНрдп рд╣реЛрдЧрд╛? рдХреНрдпрд╛ рдпрд╣ рдХреБрдЫ рдРрд╕рд╛ рд╣реИ рдЬреЛ рд╕рд╛рдореБрджрд╛рдпрд┐рдХ рдкреАрдЖрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ?

рд╣рдо рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдкреАрдЖрд░ рд▓реЗрдВрдЧреЗред @JsonFreeman рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдЪрд▓рд╛рдП рдЬрд╛

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

@RyanCavanaugh , рдЕрдВрддрддрдГ https://github.com/Microsoft/TypeScript/issues/1863#issuecomment -73668456 рдЯрд╛рдЗрдкрд╕реЗрдХ рдореЗрдВ рдЕрдВрддрд┐рдо рдЙрджрд╛рд╣рд░рдг рджреЗрдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдк рдЪрд╛рд╣реЗрдВ рддреЛ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдХрдИ рдЫреЛрдЯреЗ рдореБрджреНрджреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдПрдХ-рджреВрд╕рд░реЗ рдХреЗ рдКрдкрд░ рдмрдирддреЗ рд╣реИрдВред

рдХреНрдпрд╛ рдЗрд╕ рдореЛрд░реНрдЪреЗ рдкрд░ рдХреЛрдИ рдЕрдкрдбреЗрдЯ рдерд╛? AFAIU рд╕рдВрдХрд▓рдХ рдХрд╛ рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг https://github.com/Microsoft/TypeScript/issues/1863#issuecomment -73668456 рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдХреЗрд╡рд▓ рдкреНрд░рдердо рд╕реНрддрд░ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред

рд╣рдореЗрдВ рдЗрд╕ рдмрджрд▓рд╛рд╡ рдХреЗ рд▓рд┐рдП рдкреАрдЖрд░ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдореЗрдВ рдЦреБрд╢реА рд╣реЛрдЧреАред

рдпрд╣ рджреЛ рд╕реНрддрд░реЛрдВ рдХреЛ рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдореБрджреНрджреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рдХрд╛рдлреА рд╕реАрдзреА рд▓рдЧрддреА рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЙрдкрдпреЛрдЧрд┐рддрд╛ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИред рдирд┐рд░рдВрддрд░ рдЯреНрд░реИрдХрд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдкреВрд░реНрдг рд╕рдорд░реНрдерди рдХрд╛рдлреА рдореБрд╢реНрдХрд┐рд▓ рд▓рдЧрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╢рд╛рдпрдж рдЕрдзрд┐рдХ рдЙрдкрдпреЛрдЧреА рд╣реИред

рд▓рдЧрд╛рддрд╛рд░ рдЯреНрд░реИрдХрд┐рдВрдЧ рдХреЛ https://github.com/Microsoft/TypeScript/issues/5579 рдореЗрдВ рдЯреНрд░реИрдХ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ

рд╕рдордЭ рдЧрдпрд╛, рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред

@JsonFreeman @mhegazy рдПрдХ рдЗрд╢реНрдпреВ # 12932 рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИ

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

рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░рддреАрдХреЛрдВ рдХреЛ рдЗрдВрдбреЗрдХреНрд╕ рдХреБрдВрдЬрд┐рдпреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрдмрдХрд┐ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд, рдореБрдЭреЗ рдХрдИ рд╕реНрдерд╛рдиреЛрдВ рдкрд░ <any> рдбрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдХреЛрдб рдХреА рдЧреБрдгрд╡рддреНрддрд╛ рдХреЛ рдиреАрдЪрд╛ рджрд┐рдЦрд╛рддрд╛ рд╣реИред

interface Query {
  [key: string|symbol]: any;
}

const Q = {
  startsWith: Symbol('startsWith'),
  gte: Symbol('gte'),
  lte: Symbol('lte')
}

const sample: Query = {
  name: {
    [Q.startsWith]: 'M',
    length: {
      [Q.lte]: 25
    }
  },
  age: {
    [Q.gte]: 18
  }
};

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

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

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

рдореИрдВ рдкреВрдЫ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдХреНрдпрд╛ рдХреБрдЫ рдкреНрд░рдЧрддрд┐ рдкрд░ рд╣реИ? рдкреВрд░реА рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рд╕рдорд░реНрдерди рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

https://github.com/Microsoft/TypeScript/pull/15473 рд╕рдВрдмрдВрдзрд┐рдд рджрд┐рдЦрддрд╛ рд╣реИред

рд╣рд╛рдБ рдЖрдЬ рднреА рдЗрд╕рдХреА рддрд▓рд╛рд╢ рд╣реИ, рдпрд╣реА рдореИрдВ рд╡реЗрдмрд╕реНрдЯреЙрд░реНрдо рдореЗрдВ рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдБ:

screenshot 2017-10-08 21 37 17

рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ

var test: symbol = Symbol();

const x = {
    [test]: 1
};

x[test];

console.log(x[test]);

console.log(x['test']);

рд▓реЗрдХрд┐рди x рдХрд╛ рдкреНрд░рдХрд╛рд░ рд╕рд╣реА рдирд╣реАрдВ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ

{
  [key: string]: number
}

рд╣рд╛рдБ рдЖрдЬ рднреА рдЗрд╕рдХреА рддрд▓рд╛рд╢ рд╣реИ, рдпрд╣реА рдореИрдВ рд╡реЗрдмрд╕реНрдЯреЙрд░реНрдо рдореЗрдВ рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдБ:

рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ JetBrains рдХреА рдЕрдкрдиреА рднрд╛рд╖рд╛ рд╕реЗрд╡рд╛ рдЬреЛ WebStorm, intelliJ IDEA рдЗрддреНрдпрд╛рджрд┐ рдореЗрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд╕рдХреНрд╖рдо рд╣реИред

рдпрд╣ TS 2.7 рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ

const key = Symbol('key')
const a: { [key]?: number } = {}
a[key] = 5

рдЗрд╕ рдкрд░ рдХрд┐рд╕реА рднреА рдЕрджреНрдпрддрди?

рдореЗрд░реА рд╕рдорд╕реНрдпрд╛:

export interface Dict<T> {
  [index: string]: T;

  [index: number]: T;
}

const keyMap: Dict<number> = {};

function set<T extends object>(index: keyof T) {
  keyMap[index] = 1; // Error Type 'keyof T' cannot be used to index type 'Dict<number>'
}

рд▓реЗрдХрд┐рди рдпрд╣ рднреА рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░рддреАрдХ рд╕реВрдЪрдХрд╛рдВрдХ рдкреНрд░рдХрд╛рд░ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

export interface Dict<T> {
  [index: string]: T;
  [index: symbol]: T; // Error: An index signature parameter type must be 'string' or 'number'
  [index: number]: T;
}

рдЕрдкреЗрдХреНрд╖рд┐рддреН рд╡реНрдпрд╡рд╣рд╛рд░:
symbol рдПрдХ рд╡реИрдз рд╕реВрдЪрдХрд╛рдВрдХ рдкреНрд░рдХрд╛рд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП

рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╡реНрдпрд╡рд╣рд╛рд░:
symbol рдПрдХ рд╡реИрдз рд╕реВрдЪрдХрд╛рдВрдХ рдкреНрд░рдХрд╛рд░ рдирд╣реАрдВ рд╣реИ

as string | number рдХрд╛рд╕реНрдЯрд┐рдВрдЧ рдХреЗ рд╕рд╛рде рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдореЗрд░реЗ рд▓рд┐рдП рдмрд╣реБрдд рдмреБрд░рд╛ рд▓рдЧрддрд╛ рд╣реИред

TypeScript рдореЗрдВ util.promisify.custom рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ? рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдирд┐рд░рдВрддрд░ рдкреНрд░рддреАрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдм рд╕рдорд░реНрдерд┐рдд рд╣реИ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдЕрдЧрд░ рдЙрдиреНрд╣реЗрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рддреЛ рдпрд╣ рдорд╛рдиреНрдп рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╣реИ ( f рд╕реЗ рд╢реБрд░реВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ):
typescript const custom = Symbol() interface PromisifyCustom<T, TResult> extends Function { [custom](param: T): Promise<TResult> } const f: PromisifyCustom<string, void> f[custom] = str => Promise.resolve()
рд▓реЗрдХрд┐рди рдпрджрд┐ promisify.custom рдХрд╛ рдЙрдкрдпреЛрдЧ custom рдмрдЬрд╛рдп рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ f[promisify.custom] Element implicitly has an 'any' type because type 'PromisifyCustom<string, void>' has no index signature.
typescript import {promisify} from 'util' interface PromisifyCustom<T, TResult> extends Function { [promisify.custom](param: T): Promise<TResult> } const f: PromisifyCustom<string, void> f[promisify.custom] = str => Promise.resolve()
рдореИрдВ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ promisify.custom рдлрд╝реАрд▓реНрдб рдХреЛ рдЕрд╕рд╛рдЗрди рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ (рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП) рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рдПрдХрдорд╛рддреНрд░ рддрд░реАрдХрд╛ рдлрд╝рдВрдХреНрд╢рди рдХреЛ any рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдбрд╛рд▓рдирд╛ рд╣реИред

рдореБрдЭреЗ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖ рд░рд╣рд╛ рд╣реИ рдХрд┐ рдкреНрд░рддреАрдХ рдХреЛ рдкреНрд░рдореБрдЦ рд╕реВрдЪрдХрд╛рдВрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдиреБрдорддрд┐ рдХреНрдпреЛрдВ рдирд╣реАрдВ рджреА рдЬрд╛рддреА рд╣реИ, рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдХреЛрдб рдХреЛ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ 2.8 рджреНрд╡рд╛рд░рд╛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдЯрд╛рдЗрдкрд╕реА 2.9 рджреНрд╡рд╛рд░рд╛ рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рд╣реИ

/**
 * Key can only be number, string or symbol
 * */
export class SimpleMapMap<K extends PropertyKey, V> {
  private o: { [k: string ]: V } = {};

  public has (k: K): boolean {
    return k in this.o;
  }

  public get (k: K): V {
    return this.o[k as PropertyKey];
  }

  public set (k: K, v: V) {
    this.o[k as PropertyKey] = v;
  }

  public getMap (k: K): V {
    if (k in this.o) {
      return this.o[k as PropertyKey];
    }
    const res = new SimpleMapMap<K, V>();
    this.o[k as PropertyKey] = res as any as V;
    return res as any as V;
  }

  public clear () {
    this.o = {};
  }
}

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

/**
 * Key can only be number, string or symbol
 * */
export class SimpleMapMap<K extends PropertyKey, V> {
  private o: { [k: K ]: V } = {};

  public has (k: K): boolean {
    return k in this.o;
  }

  public get (k: K): V {
    return this.o[k];
  }

  public set (k: K, v: V) {
    this.o[k] = v;
  }

  public getMap (k: K): V {
    if (k in this.o) {
      return this.o[k];
    }
    const res = new SimpleMapMap<K, V>();
    this.o[k as PropertyKey] = res as any as V;
    return res as any as V;
  }

  public clear () {
    this.o = {};
  }
}

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

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

/**
 * Key can only be number, string or symbol
 * */
export class SimpleMapMap<K extends PropertyKey, V> {
  private o: { [k: string]: V } = {};

  public has(k: K): boolean {
    return k in this.o;
  }

  public get(k: K): V {
    return this.o[k as any];
  }

  public set(k: K, v: V) {
    this.o[k as any] = v;
  }

  public getMap(k: K): V {
    if (k in this.o) {
    return this.o[k as any];
    }

    const res = new SimpleMapMap<K, V>();
    this.o[k as any] = res as any as V;
    return res as any as V;
  }

  public clear() {
    this.o = {};
  }
}

рдХреНрдпреЛрдВрдХрд┐ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рд╕рдорд╛рди рд╣реИрдВ, рдЬрдм рднреА рдЖрдк рдЗрд╕ рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЗ рдкрд╛рд╕ рд╕рд╣реА рдкреНрд░рдХрд╛рд░ рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╕рддреНрдпрд╛рдкрди рд╣реЛрдЧрд╛, рдФрд░, рдЬрдм рдпрд╣ рд╕рдорд╕реНрдпрд╛ рд╣рд▓ рд╣реЛ рдЬрд╛рдПрдЧреА, рддреЛ рдЖрдкрдХреЛ рдмрд╕ рдЗрд╕ рд╡рд░реНрдЧ рдХреЛ рдмрджрд▓рдирд╛ рд╣реЛрдЧрд╛ (рдпрд╣ рдЙрдкрднреЛрдХреНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдкрд╛рд░рджрд░реНрд╢реА рд╣реЛрдЧрд╛)ред

рдПрдХ рдЙрдкрднреЛрдХреНрддрд╛ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг bellow рдХреА рддрд░рд╣ рд╣реИ (рдЬрдм рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдареАрдХ рд╣реЛ рдЬрд╛рддреА рд╣реИ рддреЛ рдХреЛрдб рдХреЛ рдХрд┐рд╕реА рднреА рдмрджрд▓рд╛рд╡ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдЧреА):

const s1 = Symbol(1);
const s2 = Symbol(2);

let m = new SimpleMapMap<symbol, number>()
m.set(s1, 1);
m.set(s2, 2);
m.get(s1);
m.get(1); //error

рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ 3.0.1, рдЗрд╕рд╕реЗ рдХрд╛рдЯ рд▓рд┐рдпрд╛ рдЧрдпрд╛ред
рдореИрдВ рдПрдХ рдРрд╕рд╛ рд░рд┐рдХреЙрд░реНрдб рдЪрд╛рд╣рддрд╛ рд╣реВрдБ рдЬреЛ symbol рд╕реНрд╡реАрдХрд╛рд░ рдХрд░реЗ рд▓реЗрдХрд┐рди TS рдореБрдЭреЗ рдирд╣реАрдВ рджреЗрдЧрд╛ред

рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдЦреЛрд▓реЗ рд╣реБрдП 3.5 рд╕рд╛рд▓ рд╣реЛ рдЧрдП рд╣реИрдВ, рдХреНрдпрд╛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрдм рдкреНрд░рддреАрдХ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдХреГрдкрдпрд╛ this

рд╡рд┐рдбрдВрдмрдирд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЯреАрдПрд╕ рдЦреБрдж рд╡рд┐рд░реЛрдзрд╛рднрд╛рд╕реА рд╣реИред
TS keyof any = number | string | symbol ред

рд▓реЗрдХрд┐рди рддрдм рдЬрдм рдЖрдк record[symbol] TS рдХреЛ рдордирд╛ рдХрд░рддреЗ рд╣реИрдВ
_Type 'рдкреНрд░рддреАрдХ' рдХреЛ indexer_ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рд╣рд╛рдБ, рдореИрдВ рдЗрд╕ рджреБрдЦ рд╕реЗ рдереЛрдбрд╝реА рджреЗрд░ рдХреЗ рд▓рд┐рдП рдкреАрдбрд╝рд┐рдд рд╣реВрдВ, рдЗрд╕ рд╡рд┐рд╖рдп рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореЗрд░рд╛ рдирд╡реАрдирддрдо рдкреНрд░рд╢реНрди:

https://stackoverflow.com/questions/53404675/ts2538-type-unique-symbol-cannot-be-used-as-an-index-type

@RyanCavanaugh @DanielRosenwasser @mhegazy рдХреЛрдИ рдЕрдкрдбреЗрдЯ? рдпрд╣ рдореБрджреНрджрд╛ рдЕрдкрдиреЗ рдЪреМрдереЗ рдЬрдиреНрдорджрд┐рди рдХреЗ рдХрд░реАрдм рд╣реИред

рдЕрдЧрд░ рдХреЛрдИ рдореБрдЭреЗ рд╕рд╣реА рджрд┐рд╢рд╛ рдореЗрдВ рд▓реЗ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рдореИрдВ рдЗрд╕реЗ рджреЗ рд╕рдХрддрд╛ рд╣реВрдВред рдЕрдЧрд░ рдореИрдЪ рдХреЗ рд▓рд┐рдП рдФрд░ рднреА рдмреЗрд╣рддрд░ рд╣реИред

@ рдЭрдкрдЯреНрдЯрд╛ # 26797 рдкрд░ рдПрдХ рдкреАрдЖрд░ рд╣реИ (рдиреЛрдЯ - рдкреНрд░рд╕рд┐рджреНрдз рдкреНрд░рддреАрдХреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪреЗрддрд╛рд╡рдиреА)ред # 28581 рдореЗрдВ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣рд╛рд▓рд┐рдпрд╛ рдбрд┐рдЬрд╝рд╛рдЗрди рдореАрдЯрд┐рдВрдЧ рдиреЛрдЯреНрд╕ рд╣реИрдВ (рд▓реЗрдХрд┐рди рд╡рд╣рд╛рдВ рдХреЛрдИ рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рди рд░рд┐рдХреЙрд░реНрдб рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ)ред рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рдФрд░ рдЕрдзрд┐рдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╣реИ рдХрд┐ рдкреАрдЖрд░ рдХреЛ рдпрд╣рд╛рдВ рдХреНрдпреЛрдВ рд░рдЦрд╛ рдЧрдпрд╛

рд╕рд╛рднрд╛рд░ @yortus рдореИрдВрдиреЗ рдмрд╕ рд░рдпрд╛рди рд╕реЗ рдкреВрдЫрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдкреАрдЖрд░ рдЕрднреА рднреА 3.2 рдХреЗ рд▓рд┐рдП рдпреЛрдЬрдирд╛рдмрджреНрдз рд╣реИ, рдЬреЛ рдХрд┐ рдореАрд▓ рдХреЗ рдкрддреНрдерд░ рд╕реЗ рд╕рдВрдХреЗрдд рдорд┐рд▓рддрд╛ рд╣реИред рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рдорд╛рдорд▓рд╛ рд╣реИ, рдФрд░ рдпрд╣ рд╣рд▓ рд╣реЛ рдЬрд╛рдПрдЧрд╛!

@Yortus рджреНрд╡рд╛рд░рд╛ рдЗрдВрдЧрд┐рдд рдкреАрдЖрд░ рдПрдХ рдмрд╣реБрдд рдмрдбрд╝рд╛ рдмрджрд▓рд╛рд╡ рд▓рдЧрддрд╛ рд╣реИ,
рдЗрд╕ рдмрдЧ рдХреЗ рд▓рд┐рдП рдареАрдХ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдмрд╣реБрдд рдорд╛рдореВрд▓реА? рдЬреИрд╕реЗ рд╣рд╛рд▓рдд рдХреА рдЬрд╛рдБрдЪ рдореЗрдВ рдПрдХ рдмрдпрд╛рди рдпрд╛ рдЬреЛрдбрд╝рдирд╛ред
(рдореИрдВрдиреЗ рдЕрднреА рддрдХ рдЬрдЧрд╣ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдерд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИред)

рдпрд╣рд╛рдБ рдЕрд╕реНрдерд╛рдпреА рд╕рдорд╛рдзрд╛рди https://github.com/Microsoft/TypeScript/issues/24587#issuecomment -412287117, рдереЛрдбрд╝реЗ рдмрджрд╕реВрд░рдд рд▓реЗрдХрд┐рди рдХрд╛рдо рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ

const DEFAULT_LEVEL: string = Symbol("__default__") as any;

рдПрдХ рдФрд░ https://github.com/Microsoft/TypeScript/issues/24587#issuecomment -460650063, рдЪреВрдВрдХрд┐ рд▓рд┐рдВрдЯрд░реНрд╕ h8 any

const ItemId: string = Symbol('Item.Id') as unknown as string;
type Item = Record<string, string>;
const shoes: Item = {
  name: 'whatever',
}
shoes[ItemId] = 'randomlygeneratedstring'; // no error
{ name: 'whatever', [Symbol(Item.Id)]: 'randomlygeneratedstring' }

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

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


рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗрд╡рд▓ Record<X,Y> рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди Interfaces ред рдЕрднреА рдХреЗ рд▓рд┐рдП // @ts-ignore рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рд╕реЗ рдпрд╣ рдЕрднреА рднреА рдПрдХ рд╕рд┐рдВрдЯреИрдХреНрдЯрд┐рдХ рд░реВрдк рд╕реЗ рд╕рд╣реА рд╣реИ рдФрд░ рдЕрднреА рднреА рдЬреЗрдПрд╕ рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЗрд╕реЗ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдзреНрдпрд╛рди рджреЗрдиреЗ рд╡рд╛рд▓реА рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдкреНрд░рддреАрдХреЛрдВ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд▓рд╛рдЗрдиреЛрдВ рдкрд░ // @ts-ignore рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрд╕ рдкреНрд░рддреАрдХ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдореЗрдВ (рдФрд░ рдорджрдж рдХрд░рддрд╛ рд╣реИ) рд╣реИред VSCode рдЕрднреА рднреА рдЗрд╕ рдкрд░ рдЙрдард╛рддрд╛ рд╣реИред

const id = Symbol('ID');

interface User {
  name: string;
  age: number;
}

const alice: User = {
  name: 'alice',
  age: 25,
};

// @ts-ignore
alice[id] = 'maybeSomeUUIDv4String';

// ...

// then somewhere, when you need this User's id

// @ts-ignore
const id: string = alice[id];

console.log(id); // here you can hover on id and it will say it's a string

рдкрддрд╛ рдирд╣реАрдВ, рдЕрдЧрд░ рдХрд┐рд╕реА рдиреЗ рдЗрд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╢реБрд░реВ рдХрд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рдореЗрд░реЗ рдкрд╛рд╕ рдЕрдм рд╣реИред

рдореЗрд░рд╛ рд╕рдордп рд╕реАрдорд┐рдд рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдФрд░ рдореБрдЭреЗ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реНрд░реЛрддреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╢реВрдиреНрдп рдЬреНрдЮрд╛рди рд╣реИред рдореИрдВрдиреЗ рдПрдХ рдХрд╛рдВрдЯрд╛ рдмрдирд╛рдпрд╛ рд╣реИ (https://github.com/Neonit/TypeScript), рд▓реЗрдХрд┐рди рдХреЛрдИ рдкреБрд▓ рдЕрдиреБрд░реЛрдз рдирд╣реАрдВ, рдлрд┐рд░ рднреА, рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдЕрдзреВрд░реЗ (?) рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рд╕рд╛рде рджреЗрд╡реЛрдВ рд╕реЗ рдЫреЗрдбрд╝рдЫрд╛рдбрд╝ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ред рдореИрдВ рд╣рд░ рдХрд┐рд╕реА рдХреЛ рдпреЛрдЧрджрд╛рди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣реВрдВрдЧрд╛ рдХрд┐ рд╡реЗ рдореЗрд░реЗ рдХрд╛рдВрдЯреЗ рдкрд░ рдХреНрдпрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдореИрдВ рдЖрдЦрд┐рд░рдХрд╛рд░ рдПрдХ рдкреАрдЖрд░ рдЬрд╛рд░реА рдХрд░реВрдВрдЧрд╛ред

рдЕрдм рддрдХ рдореБрдЭреЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЗрдВрдбреЗрдХреНрд╕ рдЯрд╛рдЗрдк рдкреНрд░рддрд┐рдмрдВрдз рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдорд┐рд▓ рдЧрдпрд╛ рд╣реИред рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛, рдЕрдЧрд░ рдЗрд╕рдореЗрдВ рдХреБрдЫ рдФрд░ рд╣реИред рдореИрдВ рдмрд┐рдирд╛ рдХрд┐рд╕реА рд╕реБрдзрд╛рд░ рдХреЗ TS 3.4 рдореЗрдВ рдПрдХ рдкреНрд░рддреАрдХ рдХреЗ рд╕рд╛рде рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХреЛ рдЕрдиреБрдХреНрд░рдорд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛ред ( https://www.typescriptlang.org/play/#src = const% 20o% 20% 3D% 20% 7B% 7D% 3B% 0D% 0Aconst% 20s% 20% 3D% 20Symbol ('s')% 3B % 0 d% 0A% 0 d% 0Ao% 5BS% 5D% 20% 3 рдбреА% 20123% 3 рдмреА)

рдореИрдВрдиреЗ рдЬреЛ рдкрд╛рдпрд╛, рдЙрд╕реЗ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдореЗрд░реА рдкреНрд░рддрд┐рдмрджреНрдзрддрд╛рдУрдВ рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ: https://github.com/Neonit/TypeScript-SymbolKeys/commit/11cb7c13c2494ff32cdec2d4f826730bc825dc3

рд▓рд╛рдкрддрд╛:

  • рдЯреЗрд╕реНрдЯ: рдореЗрд░реЗ рдкрд╛рд╕ рдпрд╣ рджреЗрдЦрдиреЗ рдХрд╛ рд╕рдордп рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЯреАрдПрд╕ рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдХреИрд╕реЗ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдФрд░ рд╕рдВрд░рдЪрд┐рдд рд╣реИрдВред
  • рд╕реНрдерд╛рдиреАрдпрдХрд░рдг: рдиреИрджрд╛рдирд┐рдХ тАЛтАЛрд╕рдВрджреЗрд╢ рдХреЗрд╡рд▓ рдЕрдВрдЧреНрд░реЗрдЬреА рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рдЕрджреНрдпрддрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдХреЛ рдЕрднреА рднреА рдкреБрд░рд╛рдирд╛ рд╕рдВрджреЗрд╢ рдорд┐рд▓реЗ рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ред рдореИрдВ рд╡реИрд╕реЗ рднреА рдХреЗрд╡рд▓ рдПрдХ рдЬрд░реНрдорди рдЕрдиреБрд╡рд╛рдж рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддрд╛ рдерд╛ред

рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рд╡рд░реНрд╖реЛрдВ рдХреЗ рдЗрдВрддрдЬрд╛рд░ рдХреЗ рдмрд╛рдж рдпрд╣ рдЪреАрдЬреЗрдВ рд╢реБрд░реВ рд╣реЛ рдЬрд╛рдПрдВрдЧреАред

рдлрд┐рдХреНрд╕ рдЕрдЪреНрдЫрд╛ рд▓рдЧ рд░рд╣рд╛ рд╣реИред рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рджреЗрд╡ рдЗрд╕ рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ?

рд╣реИрд▓реЛ, рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдкреНрд░рдЧрддрд┐?

рдмрд╕ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ SO рдереНрд░реЗрдб рдЦреЛрд▓рд╛: https://stackoverflow.com/questions/59118271/use-symbol-as-object-key-type-in-typescript

рдРрд╕рд╛ рдХреНрдпреЛрдВ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ? рдХреНрдпрд╛ symbol рдПрдХ рдФрд░ рдЖрджрд┐рдо рдкреНрд░рдХрд╛рд░ number - рдЗрд╕рд▓рд┐рдП рдЕрдВрддрд░ рдХреНрдпреЛрдВ рд╣реИ?

рд╣реИрд▓реЛ, рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдкреНрд░рдЧрддрд┐?

рдкрд╛рдБрдЪ рд╕рд╛рд▓ рд╣реЛ рдЧрдП!

рдЖрдкрдХреЛ рдпрд╣ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдХрд┐ рдХреНрд▓реЛрдЬрд░ рдкрд╛рдиреЗ рдореЗрдВ C ++ рдХреЛ рдХрд┐рддрдирд╛ рд╕рдордп рд▓рдЧрд╛

рдпреЛрдЧреНрдп рдирд┐рд╖реНрдкрдХреНрд╖, рд▓реЗрдХрд┐рди C ++ рдЕрдкрдиреЗ рдЖрдк рдХреЛ рдЙрд╕ рднрд╛рд╖рд╛ рдХреЗ рд╕реБрдкрд░рд╕реЗрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд┐рдкрдгрди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдХреНрд▓реЛрдЬрд░ рд╣реИ :-p

@ljharb рдЙрд╕ рдШреЛрдбрд╝реЗ рдХреЛ рдорд░реЛрдбрд╝ рд░рд╣рд╛ рд╣реИ

рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЬреЛ рдирдП рд░рдирдЯрд╛рдЗрдореНрд╕ рдХреЛ рд▓рдХреНрд╖рд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ, Map рдЙрдкрдпреЛрдЧ рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд░рддреЗ ? рдореИрдВрдиреЗ рдкрд╛рдпрд╛ рд╣реИ рдХрд┐ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдбреЗрд╡рд▓рдкрд░реНрд╕ Map s рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЙрддреНрд╕реБрдХ рд╣реВрдВ рдХрд┐ рдХреНрдпрд╛ рдХреЛрдИ рдФрд░ рдкрд░рд┐рджреГрд╢реНрдп рд╣реИ рдЬреЛ рдореБрдЭреЗ рдпрд╛рдж рдЖ рд░рд╣рд╛ рд╣реИред

let m = new Map<symbol, number>();
let s = Symbol("arbitrary symbol!");

m.set(s, 1000);
let a = m.get(s);


рдорд╛рдирдЪрд┐рддреНрд░ рдФрд░ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╣реИрдВред

@DanielRosenwasser рдкреНрд░рд╕рд┐рджреНрдз рдкреНрд░рддреАрдХреЛрдВ рдХреЛ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ; рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, Symbol.match рдПрдХ рдорд╛рдирдЪрд┐рддреНрд░ рдХреБрдВрдЬреА, рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ RegExp-like рдирд╣реАрдВ рдмрдирд╛рдПрдЧреА (рдФрд░ рдХреЛрдИ рднреА рд╡рд╕реНрддреБ Symbol.iterable рдХреБрдВрдЬреА рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ TS рдмрд┐рд▓реНрдЯ-рдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛ рдЗрд╕реЗ рдЪрд▓рдиреЗ рдпреЛрдЧреНрдп рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛ рд╕рдХрддреА рд╣реИред рдирд┐рд╖реНрдХреНрд░рд┐рдп рдкреНрд░рдХрд╛рд░)ред

рд▓рдЧрднрдЧ 5 рд╕рд╛рд▓ (

рдХреГрдкрдпрд╛, рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдВ, рдореИрдВ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдХреЛрдб рдирд╣реАрдВ рд▓рд┐рдЦ рд╕рдХрддрд╛ рд╣реВрдБред

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

рдореИрдВ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдЙрджрд╛рд╣рд░рдг рдХреЛ рдирд╣реАрдВ рд╕рдордЭрддрд╛ рдФрд░ рдЖрдЬ рдпрд╣ рдХреНрдпреЛрдВ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИред

рдпрд╣рд╛рдБ StringConvertible рдЙрджрд╛рд╣рд░рдг рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ

const intoString = Symbol("intoString")

/**
 * Something that can be converted into a string.
 */
interface StringConvertible {
    [intoString](): string;
}

/**
 * Something that is adorable.
 */
class Dog implements StringConvertible {
    [intoString](): string {
        return "RUFF RUFF";
    }
}

/**
 * <strong i="9">@see</strong> {https://twitter.com/drosenwasser/status/1102337805336768513}
 */
class FontDog implements StringConvertible {
    [intoString](): string {
        return "WOFF WOFF";
    }
}

console.log(new Dog()[intoString]())
console.log(new FontDog()[intoString]())

рдпрд╣рд╛рдБ Mappable рдпрд╛ Functor рдХрд╛ рдЙрджрд╛рд╣рд░рдг рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ (рдЙрдЪреНрдЪ-рдХреНрд░рдо рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛рдУрдВ рдХреА рдХрдореА):

const map = Symbol("map")

interface Mappable<T> {
    [map]<U>(f: (x: T) => U): Mappable<U>
}

class MyCoolArray<T> extends Array<T> implements Mappable<T> {
    [map]<U>(f: (x: T) => U) {
        return this.map(f) as MyCoolArray<U>;
    }
}

@DanielRosenwasser рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдЬреИрд╕реЗ рдЖрдк рдорд╛рди рд░рд╣реЗ рд╣реИрдВ рдХрд┐ рд╕рднреА рд╡рд╕реНрддреБрдУрдВ рдореЗрдВ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реИ рдпрд╛ рдПрдХ рд╡рд░реНрдЧ рдЙрджрд╛рд╣рд░рдг рд╣реИ рдпрд╛ рдЕрдЧреНрд░рд┐рдо рдореЗрдВ рдЬреНрдЮрд╛рдд рд╣реИрдВ; рдЖрдкрдХреЗ рдЕрдВрддрд┐рдо рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдореБрдЭреЗ рдХрд┐рд╕реА рднреА рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рдкрд░ map , рдХрд╣рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП (рдпрд╛ рдХрдо рд╕реЗ рдХрдо, рдПрдХ рдРрд╕реА рд╡рд╕реНрддреБ рдЬрд┐рд╕рдХрд╛ рдкреНрд░рдХрд╛рд░ рдХрд┐рд╕реА рднреА рдкреНрд░рддреАрдХ рдХреЛ рдЗрд╕рдореЗрдВ рдЬреЛрдбрд╝реЗ рдЬрд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ), рдЬреЛ рддрдм рдЗрд╕реЗ рдореИрдкреЗрдмрд▓ рдмрдирд╛рддрд╛ рд╣реИред

рддрдереНрдп рдХреЗ рдмрд╛рдж рдПрдХ рд╡рд╕реНрддреБ рдкрд░ рдПрдХ рд╕рдВрдкрддреНрддрд┐ (рдкреНрд░рддреАрдХ рдпрд╛ рдирд╣реАрдВ) рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рдПрдХ рдЕрд▓рдЧ рд╕реБрд╡рд┐рдзрд╛ рдЕрдиреБрд░реЛрдз (рдЬрд┐рд╕реЗ рдЕрдХреНрд╕рд░ "рдПрдХреНрд╕рдкреЗрдВрдбреЛ рдЧреБрдг" рдпрд╛ "рдПрдХреНрд╕рдкреЗрдВрдбреЛ рдкреНрд░рдХрд╛рд░" рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ) рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реЛрддрд╛ рд╣реИред

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

interface SymbolIndexable {
   [prop: symbol]: any; // ?
}

рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рдЖрдорддреМрд░ рдкрд░ рдПрдХ рдХрд╛рд░реНрдп рд╣реИ, рд▓реЗрдХрд┐рди рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдпрд╣ unknown ред

рдореБрдЭреЗ рдЬрд┐рд╕ рдЪреАрдЬрд╝ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рд╡рд╣ type O = { [k: string]: unknown } рдХреЗ рдкреНрд░рддреАрдХ (рдФрд░ bigint) рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдкреНрд░рдХрд╛рд░ рдкреНрд░рдгрд╛рд▓реА рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ JS рдСрдмреНрдЬреЗрдХреНрдЯ (рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреА рдХреБрдВрдЬреА рд╣реЛ рд╕рдХрддреА рд╣реИ) рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред рдореИрдВ рдмрд╛рдж рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛рдиреБрд╕рд╛рд░ рдЗрд╕реЗ рд╕рдВрдХреАрд░реНрдг рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдЬреЗрдПрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдЖрдзрд╛рд░ рдкреНрд░рдХрд╛рд░ { [k: string | bigint | symbol | number]: unknown } , рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рд╣реЛрдЧрд╛ред

рдЖрд╣ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ @DanielRosenwasser рдмрд┐рдВрджреБ рджреЗрдЦрддрд╛

export interface Environment<T> {
    [Default](tag: string): Intrinsic<T>;
    [Text]?(text: string): string;
    [tag: string]: Intrinsic<T>;
    // TODO: allow symbol index parameters when typescript gets its shit together
    // [tag: symbol]: Intrinsic<T>;
}

рдЬрд╣рд╛рдВ Intrinsic<T> рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдкреНрд░рдХрд╛рд░ рд╣реИ, рдФрд░ рдореИрдВ рджреЗрд╡реЛрдВ рдХреЛ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреЗ рд╕рдорд╛рди рд╡рд╛рддрд╛рд╡рд░рдг рдкрд░ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдкреНрд░рддреАрдХ рдЧреБрдгреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк [Symbol.iterator] , [Symbol.species] рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐рд╕реА рднреА рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд▓рд┐рдП рдХрд╕реНрдЯрдо рдкреНрд░рддреАрдХ рдЧреБрдг, рдкреНрд░рддреАрдХреЛрдВ рдХреЗ рд╕рд╛рде рд╕реВрдЪрдХрд╛рдВрдХ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдЗрди рдЧреБрдгреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХрд┐рд╕реА рднреА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдЧрд▓рдд рддрд░реАрдХреЗ рд╕реЗ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдХрд░реЗрдЧрд╛ред

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

рд╡рд┐рдХрд▓реНрдк рдпрд╣ рд╣реЛрдЧрд╛ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЕрдкрдиреЗ рдкреНрд░рддреАрдХ рдЧреБрдгреЛрдВ рдХреЗ рд╕рд╛рде рд╕реНрд╡рдпрдВ рдкрд░реНрдпрд╛рд╡рд░рдг рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░реЗрдВ, рд▓реЗрдХрд┐рди рдЗрд╕рд╕реЗ рдХреЛрдИ рдЕрддрд┐рд░рд┐рдХреНрдд рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╕реБрд░рдХреНрд╖рд╛ рдмреАрдорд╛ рдирд╣реАрдВ рдорд┐рд▓рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕рд┐рдВрдмрд▓ рдХреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рдкрд░ рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВред

@DanielRosenwasser рдпрд╣рд╛рдБ рдореЗрд░реЗ рдЙрддреНрдкрд╛рджрди рдХреЛрдб


рд╡реИрд╕реЗ рднреА рд╡рд░реНрддрдорд╛рди рд╡реНрдпрд╡рд╣рд╛рд░ рдИрдПрд╕ рдорд╛рдирдХ рдХреЗ рд╕рд╛рде рдЕрд╕рдВрдЧрдд рд╣реИ рдЬреЛ рдЧрд▓рдд рд╣реИред

рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рджреЗрд░ рд░рд╛рдд рд╕реЛрдЪрд╛ рдХрд┐ рдореИрдВ рдкреНрд░рддреАрдХ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдерд╛ред рдпрд╣ рдПрдХ рддреНрд░реБрдЯрд┐ рдХреНрдпреЛрдВ рдирд╣реАрдВ рд╣реИ?

const foo = {
  [Symbol.iterator]: 1,
}

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

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

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

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

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

рдЗрди рд╕рдмрдХреЗ рдЕрд▓рд╛рд╡рд╛ рд╕рд╛рдорд╛рдиреНрдп рдЙрдкрдпреЛрдЧ рдХрд╛ рдорд╛рдорд▓рд╛ рд╣реИ рдпрджрд┐ рдЖрдк рдордирдорд╛рдиреЗ рдкреНрд░рддреАрдХреЛрдВ рдкрд░ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдореИрдк рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдпрд╛ рдЧреИрд░-рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП ES6 рдХреЛрдб рдХреЗ рд╕рд╛рде рд╕рдВрдЧрддрддрд╛ рдХреЗ рд▓рд┐рдПред

рдпрд╣рд╛рдБ рдПрдХ рдЬрдЧрд╣ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ рдЬреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдорджрджрдЧрд╛рд░ рд╣реЛрдЧрд╛: https://github.com/choojs/nanobus/pull/40/filesред рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ, eventName s рдкреНрд░рддреАрдХ рдпрд╛ рддрд╛рд░ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдХрд╣рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛

type EventsConfiguration = { [eventName: string | Symbol]: (...args: any[]) => void }

рдкрд╣рд▓реА рдкрдВрдХреНрддрд┐ рдкрд░ред

рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдХреБрдЫ рдЧрд▓рддрдлрд╣рдореА рд╣реЛ рд╕рдХрддреА рд╣реИ рдХрд┐ рдореБрдЭреЗ рдпрд╣ рдХреИрд╕реЗ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рджрд░реНрдж рдХреЗ рдмрд┐рдирд╛ рд╕рд░рд▓ рдкреНрд░рдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

type Dict<T> = {
    [key in PropertyKey]: T;
};

function dict<T>() {
    return Object.create(null) as Dict<T>;
}

const has: <T>(dict: Dict<T>, key: PropertyKey) => boolean = Function.prototype.call.bind(Object.prototype.hasOwnProperty);

function forEach<T>(dict: Dict<T>, callbackfn: (value: T, key: string | symbol, dict: Dict<T>) => void, thisArg?: any) {
    for (const key in dict)
        if (has(dict, key))
            callbackfn.call(thisArg, dict[key], key, dict);
    const symbols = Object.getOwnPropertySymbols(dict);
    for (let i = 0; i < symbols.length; i++) {
        const sym = symbols[i];
        callbackfn.call(thisArg, dict[sym], sym, dict); // err
    }
}

const d = dict<boolean>();
const sym = Symbol('sym');
const bi = 9007199254740991n;

d[1] = true;
d['x'] = true;
d[sym] = false; // definitely PITA
d[bi] = false; // another PITA

forEach(d, (value, key) => console.log(key, value));

рдореИрдВ рдпрд╣ рднреА рдирд╣реАрдВ рд╕рдордЭ рдкрд╛ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдпрд╣рд╛рдВ рдПрдХ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реЛрдЧреАред

@neonit рдЗрд╕рдХреЛ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕рд▓рд┐рдП -

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЕрдзрд┐рдХрд╛рдВрд╢ рд▓реЛрдЧреЛрдВ рдХреЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рдорд╛рдорд▓реЛрдВ рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рд╣рд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдХрд▓реНрдкрдирд╛ рдХрд░рддреЗ рд╣реИрдВ (рджреЗрдЦреЗрдВ @brainkim рдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдпрд╣рд╛рдВ https://github.com/microsoft/TypeScript/issues/1863#issuecomment-574555587) рдпрд╛ рд╡реЗ рдкреНрд░рддреАрдХ рдЧреБрдгреЛрдВ (https://github.com/microsoft/TypeScript/issues/1863#issuecomment-574538121) рдпрд╛ рдореИрдкреНрд╕ (https://github.com/microsoft/TypeScript/issues/1863) рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рдорд╛рди рд░реВрдк рд╕реЗ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╣рд▓ рдХрд░ рд░рд╣реЗ рд╣реИрдВ # issuecomment-572,733,050)ред

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

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

рдпрд╣ рдХрд╣рдирд╛ рд╣рдореЗрд╢рд╛ рдЖрд╕рд╛рди рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдЖрдкрдХреЛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ! This рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдЖрдкрдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЙрдкрдпреЛрдЧреА рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдЖрдк рдЗрд╕рдХрд╛ рд╕рдореНрдорд╛рди рдХрд░реЗрдВрдЧреЗред

рдпрд╣ рдПрдХ ES6 рдЕрд╕рдВрдЧрддрд┐ рд╣реИ

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

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

const Answerable = Symbol.for("Answerable");
declare global {
  interface KnownSymbols {
    [Answerable](): string  | number;
  }
}

interface MyObject {
  [name: symbol]: boolean;
}

const MySymbol = Symbol.for("MySymbol");
const obj: MyObject = {
  [MySymbol]: true,
};

obj[Answerable] = () => "42";

рд╡реИрд╢реНрд╡рд┐рдХ KnownSymbols рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкрд░ рдЕрддрд┐рд░рд┐рдХреНрдд рдЧреБрдгреЛрдВ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рдХреЗ, рдЖрдк рд╕рднреА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдЙрд╕ рдкреНрд░рддреАрдХ рджреНрд╡рд╛рд░рд╛ рдЕрдиреБрдХреНрд░рдорд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ рдФрд░ рд╕рдВрдкрддреНрддрд┐ рдХреЗ рдореВрд▓реНрдп рдХреЛ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд / рдЖрдкрдХреЗ рдореВрд▓реНрдп рдкреНрд░рдХрд╛рд░ рддрдХ рд╕реАрдорд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рддреБрд░рдВрдд ES6 рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП рдкреНрд░рд╕рд┐рджреНрдз рдкреНрд░рддреАрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдЯрд╛рдЗрдкрд┐рдВрдЧ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдХрд░ рдореВрд▓реНрдп рдкреНрд░рджрд╛рди рдХрд░реЗрдЧрд╛ред рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ Symbol.iterator рдкреНрд░реЙрдкрд░реНрдЯреА рдЬреЛрдбрд╝рдирд╛ рдЬреЛ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдирд╣реАрдВ рд╣реИ рдЬреЛ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рддреНрд░реБрдЯрд┐ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдПрдХ рдирд╣реАрдВ рд╣реИред рдФрд░ рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЖрд╕рд╛рди рдкреНрд░рддреАрдХ рдЧреБрдгреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рдЖрд╕рд╛рди рдмрдирд╛ рджреЗрдЧрд╛ред

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

рдХреНрдпрд╛ рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╕реЗ рд╕реВрдЪрдХрд╛рдВрдХ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдЖрдЧреЗ рдмрдврд╝рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдорд┐рд▓реЗрдЧреА?

рд╡реНрдпрдХреНрддрд┐рдЧрдд рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдЕрдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реИрдВред рдпрджрд┐ рдпрд╣ cromulent JavaScript рд╣реИ, рддреЛ рдЗрд╕реЗ TS рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рд╡реНрдпрдХреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

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

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

рдЗрд╕рдиреЗ рдЬреНрдпрд╛рджрд╛рддрд░ рдЗрд╕ рдмрд╛рдд рдкрд░ рдЪрд░реНрдЪрд╛ рдХреА рдХрд┐ рд╣рдо рдХреИрд╕реЗ рдмрдВрдж рдкреНрд░рдХрд╛рд░ рдмрдирд╛рдо рдЦреБрд▓реЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдкрд╣рдЪрд╛рдирдиреЗ рдореЗрдВ рд╡рд┐рдлрд▓ рд╣реИрдВред рдЗрд╕ рд╕рдВрджрд░реНрдн рдореЗрдВ, рдПрдХ "рдмрдВрдж" рдкреНрд░рдХрд╛рд░ рдХреБрдВрдЬреА рдХреЗ рд╕реАрдорд┐рдд рд╕реЗрдЯ рдХреЗ рд╕рд╛рде рдПрдХ рдкреНрд░рдХрд╛рд░ рд╣реЛрдЧрд╛ рдЬрд┐рд╕рдХрд╛ рдорд╛рди рдмрдврд╝рд╛рдпрд╛ рдирд╣реАрдВ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рд╕рдЯреАрдХ рдкреНрд░рдХрд╛рд░ рдХреА рдЪрд╛рдмрд┐рдпрд╛рдБ, рдпрджрд┐ рдЖрдк рдХрд░реЗрдВрдЧреЗред рдЗрд╕ рдмреАрдЪ рдЗрд╕ рд╕рдВрджрд░реНрдн рдореЗрдВ рдПрдХ "рдЦреБрд▓рд╛" рдкреНрд░рдХрд╛рд░ рдПрдХ рдкреНрд░рдХрд╛рд░ рд╣реИ, рдЬрд┐рд╕реЗ рдЙрдкрдкреНрд░рдХрд╛рд░рд┐рдд рдХрд░рддреЗ рд╕рдордп, рдЕрдзрд┐рдХ рдХреБрдВрдЬрд┐рдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЦреБрд▓рд╛ рд╣реЛрддрд╛ рд╣реИ (рдЬреЛ, рд╣рдорд╛рд░реЗ рд╡рд░реНрддрдорд╛рди рдЙрдк-рдирд┐рдпрдо рдХреЗ рддрд╣рдд, рд╕реЙрд░реНрдЯрд╛ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдЬреНрдпрд╛рджрд╛рддрд░ рдХрднреА-рдХрднреА рд╣реЛрддреЗ рд╣реИрдВ, рдХреЗрд╡рд▓ рдЗрдВрдбреЗрдХреНрд╕ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рд╡рд╛рд▓реЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдЫреЛрдбрд╝рдХрд░, рдЬреЛ рдмрд╣реБрдд рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╣реИрдВ) ред рд╕реВрдЪрдХрд╛рдВрдХ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдПрдХ рдЦреБрд▓реЗ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддреЗ рд╣реИрдВ, рдЬрдмрдХрд┐ рдореИрдк рдХрд┐рдП рдЧрдП рдкреНрд░рдХрд╛рд░ рдХрд╛рдлреА рд╣рдж рддрдХ рд╕рдВрдмрдВрдзрд┐рдд рд╣реЛрддреЗ рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╡реЗ рдмрдВрдж рдкреНрд░рдХрд╛рд░реЛрдВ рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдпрд╣ _usually_ рдХрд╛рдлреА рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЕрдзрд┐рдХрд╛рдВрд╢ рдХреЛрдб, рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ, рдмрдВрдж рдСрдмреНрдЬреЗрдХреНрдЯ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рд╕рдВрдЧрдд рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд╕рд╛рде рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ flow (рдЬрд┐рд╕рдореЗрдВ рдмрдВрдж рдмрдирд╛рдо рдЦреБрд▓реА рд╡рд╕реНрддреБ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рд╕реНрдкрд╖реНрдЯ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рд╣реИ) рдмрдВрдж рд╡рд╕реНрддреБ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдЪреВрдХред рдпрд╣ рдЬреЗрдиреЗрд░рд┐рдХ рдЗрдВрдбреЗрдХреНрд╕ рдХреАрдЬрд╝ рдХреЗ рд╕рд╛рде рд╕рд┐рд░ рдкрд░ рдЖрддрд╛ рд╣реИ; рдпрджрд┐ рдореЗрд░реЗ рдкрд╛рд╕ T extends string , рддреЛ T рдХрд╛ рддреНрд╡рд░рд┐рдд рдФрд░ рд╡реНрдпрд╛рдкрдХ рдкреНрд░рдХрд╛рд░ рд╣реИ ( "a" рд╕реЗ "a" | "b" string ) рддрдХ, рд╡рд╕реНрддреБ рдЬрдм рддрдХ рд╣рдо "a" | "b" | ... (every other possible string) рд╕реЗ string рд╕реЗ рдЕрдзрд┐рдХ рд╕реНрд╡реИрдк рдирд╣реАрдВ рдХрд░ рд▓реЗрддреЗ, рддрдм рддрдХ рдЙрддреНрдкрд╛рджрди рдЕрдзрд┐рдХ рдФрд░ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реЛрддрд╛ рд╣реИред рдПрдХ рдмрд╛рд░ рдРрд╕рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рдЕрдЪрд╛рдирдХ рдкреНрд░рдХрд╛рд░ рдмрд╣реБрдд рдЦреБрд▓рд╛ рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдЬрдмрдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рд╕рдВрдкрддреНрддрд┐ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдореМрдЬреВрдж рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╣ рдХрд╛рдиреВрдиреА рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕реЗ рдПрдХ рдЦрд╛рд▓реА рд╡рд╕реНрддреБ рдЕрд╕рд╛рдЗрди рдХрд░реЗрдВред рд╕рдВрд░рдЪрдирд╛рддреНрдордХ рд░реВрдк рд╕реЗ рдпрд╣реА рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЬрдм рд╣рдо рдЬреЗрдирд░рд┐рдХ рдХреЛ рдореИрдк рдХрд┐рдП рдЧрдП рдкреНрд░рдХрд╛рд░реЛрдВ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдЗрд╕ рдмрд╛рдд рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░ рджреЗрддреЗ рд╣реИрдВ - рдЬреЗрдиреЗрд░рд┐рдХ рдореИрдкреНрдб рдЯрд╛рдЗрдк рдХреА рдкрд░ рдПрдХ string рдмрд╛рдзрд╛ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕рднреА рд╕рдВрднрд╛рд╡рд┐рдд рдХреБрдВрдЬреА рдореМрдЬреВрдж рд╣реИред рдпрд╣ рддрд╛рд░реНрдХрд┐рдХ рд░реВрдк рд╕реЗ рдХреБрдВрдЬреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╡рд┐рдЪрд░рдг-рдЖрдзрд╛рд░рд┐рдд рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рдЕрдиреБрд╕рд░рдг рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рд╕рд╣реА рд╣реИ рдХрд┐ рдЪрд╛рдмрд┐рдпрд╛рдБ рдПрдХ _closed_ рдкреНрд░рдХрд╛рд░ рд╕реЗ рдЖрддреА рд╣реИрдВ (рдЬреЛ, inc, рдПрдХ рд╕реВрдЪрдХрд╛рдВрдХ рдХреЗ рд╕рд╛рде рдПрдХ рдкреНрд░рдХрд╛рд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрднреА рдмрдВрдж рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ!)ред рддреЛ, рдЕрдЧрд░ рд╣рдо рдкреАрдЫреЗ рдХреА рдУрд░ рд╕рдВрдЧрдд рд╣реЛрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдБ, рд╣рдо рдЗрд▓рд╛рдЬ _can't_ {[x: T]: U} рдХреЗ рд░реВрдк рдореЗрдВ рд╣реА {[_ in T]: U} , рдЬрдм рддрдХ, рдСрдкреНрдЯрд┐рдХрд▓ рдлрд╛рдЗрдмрд░ рдХреЗрдмрд▓, рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐, рдЧреИрд░ рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдорд▓реЗ рдореЗрдВ рдХреЗ рдмрд╛рдж рд╕реЗ {[_ in T]: U} {[x: T]: U} {[_ in T]: U} рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░реЗрдВ рдХрд┐ рд╣рдо рдХреИрд╕реЗ рдЦреБрд▓реЗ рдкреНрд░рдХрд╛рд░ "рдмрдврд╝рдд" рдХреЗ рд▓рд┐рдП рдареАрдХ рд╕реЗ рдЦрд╛рддреЗ рдХреЗ рд▓рд┐рдП рдореИрдк рдХрд┐рдП рдЧрдП рдкреНрд░рдХрд╛рд░ рдХреА рдХреБрдВрдЬреА рдХреЗ рд╡рд┐рдЪрд░рдг рдХреЛ рд╕рдВрднрд╛рд▓рддреЗ рд╣реИрдВ, рдЬреЛ рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рдмрджрд▓рд╛рд╡ рд╣реИ рдЬреЛ рдкрд╛рд░рд┐рд╕реНрдерд┐рддрд┐рдХреА рддрдВрддреНрд░ рдХреЗ рдкреНрд░рднрд╛рд╡ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

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

рд╡реНрдпрдХреНрддрд┐рдЧрдд рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдЕрдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реИрдВред

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

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

рдЖрдк рд╣рдореЗрдВ рдЕрдВрдзрд╛ рдЙрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣ рд░рд╣реЗ рд╣реИрдВред рдХреГрдкрдпрд╛ рдирд╣реАрдВ! рдХреГрдкрдпрд╛ рд╣рдореЗрдВ рдмрддрд╛рдПрдВ рдХрд┐ рдЖрдк рдХрд╣рд╛рдБ рдЬрд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ!

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

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

const sym = Symbol();
interface Foo
{
    [sym]: number;
    [s: symbol]: string; // just imagine this would be allowed
}

рдЕрдм рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрдВрдкрд╛рдЗрд▓рд░ рдЗрд╕реЗ рдПрдХ рд╕рдВрдШрд░реНрд╖ рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦреЗрдВрдЧреЗ, рдХреНрдпреЛрдВрдХрд┐ Foo[sym] рдореЗрдВ рдПрдХ рдЕрд╕реНрдкрд╖реНрдЯ рдкреНрд░рдХрд╛рд░ рд╣реИред рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рддрд╛рд░ рдХреЗ рд╕рд╛рде рдПрдХ рд╣реА рдореБрджреНрджрд╛ рд╣реИред

interface Foo
{
    ['str']: number; // <-- compiler error: not assignable to string index type 'string'
    [s: string]: string;
}

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

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

рдпрд╣ рдорд╛рдирддреЗ рд╣реБрдП рдХрд┐ рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдкреНрд░рддреАрдХ рдЯрд╛рдЗрдкрд┐рдВрдЧ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рд╣реИ, рдпрд╣ рд╣рдореЗрд╢рд╛ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп [s: symbol]: SomeType рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЛ рдЕрдорд╛рдиреНрдп рдмрдирд╛ рджреЗрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдкреНрд░рддреАрдХ рд╕реВрдЪрдХ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрд╕рдВрдЧрдд рдкреНрд░рдХрд╛рд░ рд╣реЛрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА function рдкреНрд░рдХрд╛рд░ рд╣реЛ, рдХреНрдпреЛрдВрдХрд┐ рдЕрдзрд┐рдХрд╛рдВрд╢ (/ рд╕рднреА?) рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдкреНрд░рддреАрдХ рдХреБрдВрдЬрд┐рдпрд╛рдБ function рдкреНрд░рдХрд╛рд░ рдХреА рд╣реИрдВред

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

const foo: Foo = {str: 42, a: 'one', b: 'two'};
const input: string = getUserInput();
const value = foo[input];

рд╡рд╣реА рд╕рдорд╕реНрдпрд╛ рдкреНрд░рддреАрдХ рдХреБрдВрдЬрд┐рдпреЛрдВ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрдЧреАред рд╕рдВрдХрд▓рди-рд╕рдордп рдкрд░ value рдХрд╛ рд╕рдЯреАрдХ рдкреНрд░рдХрд╛рд░ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИред рдпрджрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ 'str' , рддреЛ рдпрд╣ number , рдЕрдиреНрдпрдерд╛ рдпрд╣ string (рдХрдо рд╕реЗ рдХрдо рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реЗ рдпрд╣ string рд╣реЛрдиреЗ рдХреА рдЙрдореНрдореАрдж рд╣реЛрдЧреА, рдЬрдмрдХрд┐ рдпрд╣ рд╕рдВрднрд╛рд╡рдирд╛ undefined рд╣реЛ рд╕рдХрддреА рд╣реИред рдХреНрдпрд╛ рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рдирд╣реАрдВ рд╣реИ? рдХреЛрдИ рдЗрд╕реЗ value рдПрдХ рдпреВрдирд┐рдпрди рдкреНрд░рдХрд╛рд░ рджреЗрдХрд░ рдкрд░рд┐рднрд╛рд╖рд╛ рдореЗрдВ рд╕рднреА рд╕рдВрднрд╛рд╡рд┐рдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░ рд╕рдХрддрд╛ рд╣реИ (рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ number | string )ред

@Neonit рдЦреИрд░, рдпрд╣ рдореБрджреНрджрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдПрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рдкреНрд░рдЧрддрд┐ рд░реБрдХреА рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрди рдореБрджреНрджреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ рдЬреЛ рдореИрдВ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ - рдХрд┐ рдЖрдк рдЬреЛ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЙрд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдкреНрд░рддреАрдХ рдЗрдВрдбреЗрдХреНрд╕рд░реНрд╕ рдХрд╛ рдЬрд╡рд╛рдм рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

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

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

рдХреНрдпрд╛ UserSymbol рдкреНрд░рдХрд╛рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рд╣реИ рдЬреЛ рд╕рд┐рд░реНрдл symbol рдорд╛рдЗрдирд╕ рдореЗрдВ рдирд┐рд░реНрдорд┐рдд рдкреНрд░рддреАрдХ рд╣реИрдВ? рдкреНрд░рддреАрдХреЛрдВ рдХреА рдмрд╣реБрдд рдкреНрд░рдХреГрддрд┐ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддреА рд╣реИ рдХрд┐ рдХрднреА рдЖрдХрд╕реНрдорд┐рдХ рдЯрдХрд░рд╛рд╡ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред

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

@RyanCavanaugh рдпрд╣рд╛рдБ рдореЗрд░реА рдЙрдбрд╝рд╛рди рдпреЛрдЬрдирд╛ рд╣реИред

рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рдкреНрд░рдгрд╛рд▓реА рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдореИрдВ рдЧреБрдгреЛрдВ рдХреЗ рд▓рд┐рдП рдЗрд╕ рддрд░рд╣ рдХреЗ рдкреНрд░рддреАрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВред

const X = Symbol.for(":ns/name")

const txMap = {
  [X]: "fly away with me!"
}

transact(txMap) // what's the index signature here?

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

// please forgive my tardiness but in essence this is how I'm typing "TxMap" for objects
type TxMapNs = { [ns: string]: TxMapLocal }
type TxMapLocal = { [name: string]: string | TxMapNs } // leaf or non leaf

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

interface TxMap = {
  [DB_IDENT]: symbol // leaf
  [DB_VALUE_TYPE]?: TxMap // not leaf
  [DB_CARDINALITY]?: TxMap
}

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


рдореБрдЭреЗ рдпрд╣ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдпрд╣ рдереЛрдбрд╝рд╛ рджрд░реНрдж рд╣реИред

const x = Symbol.for(":x");
const y = Symbol.for(":x");

type X = { [x]: string };
type Y = { [y]: string };

const a: X = { [x]: "foo" };
const b: Y = { [x]: "foo" }; // not legal
const c: X = { [y]: "foo" }; // not legal
const d: Y = { [y]: "foo" };

рдпрд╣ рдмрд╣реБрдд рдмрдврд╝рд┐рдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕рдордЭ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ Symbol.for рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдмрдирд╛рдП рдЧрдП рдкреНрд░рддреАрдХ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рдорд╛рди рд╣реИрдВред


рдпрд╣ рднреА рд╕реБрдкрд░ рдХрд╖реНрдЯрдкреНрд░рдж рд╣реИред

function keyword(ns: string, name: string): unique symbol { // not possible, why?
  return Symbol.for(":" + ns + "/" + name)
}

const x: unique symbol = keyword("db", "id") // not possible, why?

type X = {
  [x]: string // not possible, why?
}

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

рдореИрдВ рдПрдХ рдЕрдиреНрдп рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдЖрдпрд╛ рд╣реВрдВ, рдЬрд╣рд╛рдВ рдПрдХ рдЗрдВрдбреЗрдХреНрд╕рд┐рдВрдЧ рдореВрд▓реНрдп рдХреЗ рд░реВрдк рдореЗрдВ symbol рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛, рдЬрдм рдПрдХ рдлреИрдХреНрдЯреНрд░реА рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП ES рдкреНрд░реЙрдХреНрд╕реА рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдкреНрд░реЙрдХреНрд╕реА рдХреЗ рд╕рд╛рде рд▓рдкреЗрдЯрддрд╛ рд╣реИред

рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХреЛ рд▓реЗрдВ:

let original = {
    foo: 'a',
    bar: 'b',
    baz: 1
};

function makeProxy<T extends Object>(source: T) {
    return new Proxy(source, {
        get: function (target, prop, receiver) {
            return target[prop];
        }
    });
}

let proxied = makeProxy(original);

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

function makeProxy<T extends Object & { [key: string]: any}>(source: T) {

рд▓реЗрдХрд┐рди рдЕрдм рдпрд╣ рдПрдХ рддреНрд░реБрдЯрд┐ рдЙрддреНрдкрдиреНрди рдХрд░реЗрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ prop get рдХрд╛ 2 рддрд░реНрдХ ( prop get ProxyHandler PropertyKey рдХрд╛ рдкреНрд░рдХрд╛рд░ рд╣реИ, рдЬреЛ рдРрд╕рд╛ рд╣реЛрддрд╛ рд╣реИ PropertyKey ред

рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЕрдирд┐рд╢реНрдЪрд┐рдд рд╣реВрдВ рдХрд┐ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЗ рдкреНрд░рддрд┐рдмрдВрдз рдХреЗ рдХрд╛рд░рдг рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд╕рд╛рде рдРрд╕рд╛ рдХреИрд╕реЗ рдХрд░реЗрдВред

@ARonpowell рдЖрдк рдХрд┐рд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ? рдореИрдВ рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдБ рдХрд┐ рдпрд╣ рдареАрдХ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░ рд░рд╣рд╛ рд╣реИ:

let original = {
    foo: 'a',
    bar: 'b',
    baz: 1
};

function makeProxy<T extends Object>(source: T) {
    return new Proxy(source, {
        get: function (target, prop, receiver) {
            return target[prop];
        }
    });
}

let proxied = makeProxy(original);

function assertString(s:string){}
function assertNumber(x:number){}

assertString(proxied.foo); // no problem as string
assertNumber(proxied.baz); // no problem as number
console.log(proxied.foobar); // fails as expected: error TS2339: Property 'foobar' does not exist on type '{ foo: string; bar: string; baz: number; }'.

tsconfig.json:

{
  "compilerOptions": {
    "module": "esnext",
    "moduleResolution": "node",
    "target": "es2015"
  }

package.json:

{
  "devDependencies": {
    "typescript": "~3.4.5"
  }
}

@beenotung рдореБрдЭреЗ рдЦреЗрд▓ рдХреЗ рдореИрджрд╛рди рдореЗрдВ рдПрдХ рддреНрд░реБрдЯрд┐ рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИ:

image

@ARonpowell рддреНрд░реБрдЯрд┐ рддрдм рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИ рдЬрдм рдЖрдк tsconfig.json рдореЗрдВ 'рдХрдВрдкрд╛рдЗрд▓рд░' рдореЗрдВ 'рд╕рдЦреНрдд' рдзреНрд╡рдЬ рд╕рдХреНрд╖рдо рдХрд░рддреЗ рд╣реИрдВред

рдЗрд╕рд▓рд┐рдП рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЗ рд╡рд░реНрддрдорд╛рди рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рддрд╣рдд, рдЖрдкрдХреЛ рдпрд╛ рддреЛ рд╕рдЦреНрдд рдореЛрдб рдХреЛ рдмрдВрдж рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдпрд╛ рдЯрд╛рд░рдЧреЗрдЯ рдХреЛ any рдореЗрдВ рдбрд╛рд▓рдирд╛ рд╣реЛрдЧрд╛ред

рдЬрд╝рд░реВрд░, рд▓реЗрдХрд┐рди рдПрдХ any рдХрд╛рд╕реНрдЯ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрджрд░реНрд╢ рдирд╣реАрдВ рд╣реИ рдФрд░ рд╕рдЦреНрдд рдореЛрдб рдХреЛ рдЕрдХреНрд╖рдо рдХрд░рдирд╛ рдХреЗрд╡рд▓ рдкреНрд░рдХрд╛рд░ рдХреА рд╕реБрд░рдХреНрд╖рд╛ рдореЗрдВ рдкреНрд░рддрд┐рдмрдВрдзреЛрдВ рдХреЛ рдвреАрд▓рд╛ рдХрд░рдирд╛ рд╣реИред

рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рдкрдврд╝рдирд╛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдЧрд▓реЗ "рд╕рдорд╛рдзрд╛рди" рд╢рд╛рдпрдж "рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдЕрдХреНрд╖рдо рдХрд░рдирд╛" рд╣реЛрдЧрд╛ред

рд╣рдореЗрдВ рд╕реНрдЯреЙрдкрдЧреИрдк рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХреА рдЦреЛрдЬ рдирд╣реАрдВ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП рдФрд░ рди рд╣реА рдпрд╣ рд╕рдордЭрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИред

рдпрд╣ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреА рдПрдХ рдорд╛рдирдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

@DanielRosenwasser рдореЗрд░реА рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ @aaronpowell рдХреЗ рд╕рдорд╛рди рд╣реИ - рдореЗрдВ рдПрдХ рдкреНрд░рддреАрдпрдорд╛рди рдмреЗрдореЗрд▓ ProxyHandler рдЗрдВрдЯрд░рдлреЗрд╕ рдФрд░ рдЯрд╛рдЗрдкрдкреНрд░рддрд┐ рдХреЗ рдирд┐рдпрдореЛрдВ рдореБрдЭреЗ рдареАрдХ рд╕реЗ рдкреНрд░реЙрдХреНрд╕реА рд╣реИрдВрдбрд▓рд░ рдЬрд╛рд▓ рдЯрд╛рдЗрдкрд┐рдВрдЧ рд╕реЗ рд░реЛрдХрддрд╛ рд╣реИред

рдПрдХ рдЙрдмрд▓рд╛ рд╣реБрдЖ рдЙрджрд╛рд╣рд░рдг рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ:

const getValue = (target: object, prop: PropertyKey) => target[prop]; // Error

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

рдореИрдВ рдПрдХ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдиреМрд╕рд┐рдЦрд┐рдпрд╛ рд╣реВрдВ рддреЛ рдХреГрдкрдпрд╛ рдореБрдЭреЗ рдорд╛рдл рдХрд░ рджреЗрдВ рдЕрдЧрд░ рдореБрдЭреЗ рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рдпрд╛рдж рдЖ рд░рд╣рд╛ рд╣реИред

рдПрдХ рдЕрдиреНрдп рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓рд╛: рдореИрдВ рдХреЙрд▓рд░реНрд╕ рдХреЗ рд▓рд┐рдП {[tag: symbol]: SomeSpecificType} рдПрдХ рдкреНрд░рдХрд╛рд░ рд░рдЦрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рддрд╛рдХрд┐ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЯреИрдЧ рдХрд┐рдП рдЧрдП рдорд╛рдиреЛрдВ рдХрд╛ рдирдХреНрд╢рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ рдЬреЛ рд╡рд╕реНрддреБ рд╢рд╛рдмреНрджрд┐рдХ рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдХреА рдХреЙрдореНрдкреИрдХреНрдЯрдиреЗрд╕ рд╕реЗ рд▓рд╛рднрд╛рдиреНрд╡рд┐рдд рдХрд░рддрд╛ рд╣реИ (рдЬрдмрдХрд┐ рдЕрднреА рднреА рдирд╛рдо рдХреЗ рдЯрдХрд░рд╛рд╡ рд╕реЗ рдмрдЪрд╛ рд░рд╣рд╛ рд╣реИ рдЯреИрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рд╛рджреЗ рддрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдЬреЛрдЦрд┐рдо)ред

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

type ContextKeyMap = Record<PropertyKey, ContextKeyValue>

function setFromObject(context: Context, object: ContextKeyMap) {
    for (const key in object) {
        if (hasOwn.call(object, key)) context.setKey(key, object[key])
    }

    for (const symbol of Object.getOwnPropertySymbols(object)) {
        if (propertyIsEnumerable.call(object, symbol)) {
            context.setKey(symbol, object[symbol as unknown as string])
        }
    }
}

рдореИрдВ рдмрд╣реБрдд рджреГрдврд╝рддрд╛ рд╕реЗ рд╕рд┐рд░реНрдл рдРрд╕рд╛ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдкрд╕рдВрдж рдХрд░реВрдВрдЧрд╛:

type ContextKeyMap = Record<PropertyKey, ContextKeyValue>

function setFromObject(context: Context, object: ContextKeyMap) {
    for (const key in object) {
        if (hasOwn.call(object, key)) context.setKey(key, object[key])
    }

    for (const symbol of Object.getOwnPropertySymbols(object)) {
        if (propertyIsEnumerable.call(object, symbol)) {
            context.setKey(symbol, object[symbol])
        }
    }
}

рдореИрдВ рдкреНрд░рддреАрдХреЛрдВ рдХреЗ рд╕рд╛рде рдЕрдиреБрдХреНрд░рдордг рдХреЗ рд╕рд╛рде рднреА рд╕рдорд╕реНрдпрд╛ рд╣реИред рдореЗрд░рд╛ рдХреЛрдб рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:

const cacheProp = Symbol.for('[memoize]')

function ensureCache<T extends any>(target: T, reset = false): { [key in keyof T]?: Map<any, any> } {
  if (reset || !target[cacheProp]) {
    Object.defineProperty(target, cacheProp, {
      value: Object.create(null),
      configurable: true,
    })
  }
  return target[cacheProp]
}

рдореИрдВрдиреЗ @ARonpowell рджреНрд╡рд╛рд░рд╛ рд╕рдорд╛рдзрд╛рди рдХрд╛ рдкрд╛рд▓рди рдХрд┐рдпрд╛ рдФрд░ рдХрд┐рд╕реА рддрд░рд╣ рдЗрд╕реЗ рд╣рд▓ рдХрд░рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣рд╛

const cacheProp = Symbol.for('[memoize]') as any

function ensureCache<T extends Object & { [key: string]: any}>(target: T, reset = false): { [key in keyof T]?: Map<any, any> } {
  if (reset || !target[cacheProp]) {
    Object.defineProperty(target, cacheProp, {
      value: Object.create(null),
      configurable: true,
    })
  }

  return target[cacheProp]
}

рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд╕реНрдЯрд┐рдВрдЧ any рд╕реЗ symbol рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реИред

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд┐рд╕реА рднреА рдЕрдиреНрдп рд╕рдорд╛рдзрд╛рди рдХреЗ рд▓рд┐рдП рд╕рд░рд╛рд╣рдирд╛ рдХреАред

@ahnpnl рдЙрд╕ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЖрдк рдкреНрд░рддреАрдХреЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ WeakMap рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмреЗрд╣рддрд░ рд╣реЛрдВрдЧреЗ, рдФрд░ рдЗрдВрдЬрди рдЙрд╕ рдмреЗрд╣рддрд░ рдХреЛ рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝ рдХрд░реЗрдВрдЧреЗ - рдпрд╣ target рдкреНрд░рдХрд╛рд░ рдХреЗ рдорд╛рдирдЪрд┐рддреНрд░ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЖрдкрдХреЛ рдЕрднреА рднреА рдЗрд╕реЗ рдХрд╛рд╕реНрдЯ рдХрд░рдирд╛ рдкрдбрд╝ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдкрдХрд╛ рдХрд╛рд╕реНрдЯ рд░рд┐рдЯрд░реНрди рд╡реИрд▓реНрдпреВ рдореЗрдВ рд░рд╣реЗрдЧрд╛ред

рдорд╛рди рдХреЛ рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдорд╛рдзрд╛рди рд╣реИ ...

var theAnswer: symbol = Symbol('secret');
var obj = {} as Record<symbol, number>;
obj[theAnswer] = 42; // Currently error, but should be allowed

Object.assign(obj, {theAnswer: 42}) // allowed

рдорд╛рди рдХреЛ рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдорд╛рдзрд╛рди рд╣реИ ...

var theAnswer: symbol = Symbol('secret');
var obj = {} as Record<symbol, number>;
obj[theAnswer] = 42; // Currently error, but should be allowed

Object.assign(obj, {theAnswer: 42}) // allowed

рдореЗрдВ рд╕рд╣рдордд рдирд╣реАрдВ рд╣реВрдБред рдпреЗ рддреАрди рд░реЗрдЦрд╛рдПрдБ рдПрдХ-рджреВрд╕рд░реЗ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛрддреА рд╣реИрдВ:

Object.assign(obj, {theAnswer: 42});
Object.assign(obj, {'theAnswer': 42});
obj['theAnswer'] = 42;

@DanielRosenwasser
рдореЗрд░реЗ рдкрд╛рд╕ рдпрд╣ рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓рд╛ рд╣реИ, рдЦреЗрд▓ рдХреЗ рдореИрджрд╛рди рдХреЗ рд▓рд┐рдВрдХ рдореЗрдВ, рдореИрдВрдиреЗ рдЗрд╕реЗ рдирдХреНрд╢реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рднреА рд╣рд▓ рдХрд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ, рддреЛ рдпрд╣ рдмрджрд╕реВрд░рдд рд╣реИред

const system = Symbol('system');
const SomeSytePlugin = Symbol('SomeSytePlugin')

/** I would prefer to have this working in TS */
interface Plugs {
    [key: symbol]: (...args: any) => unknown;
}
const plugins = {
    "user": {} as Plugs,
    [system]: {} as Plugs
}
plugins[system][SomeSytePlugin] = () => console.log('awsome')
plugins[system][SomeSytePlugin](); ....

рдЦреЗрд▓ рдХрд╛ рдореИрджрд╛рди рд▓рд┐рдВрдХ

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

рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╕рдорд╛рдзрд╛рди рд╣реИ рдЬреЛ рдЯреАрдПрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдХреЛрдб рдореЗрдВ рд╕рдорд╛рди рдкрдардиреАрдпрддрд╛ рд╣реИ, рддреЛ рдореИрдВ рд╕рднреА рдХрд╛рди рд╣реВрдВред

рдЗрд╕ рдореБрджреНрджреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рд╡реНрдпрд╛рдЦреНрдпрд╛?

рдорд╛рди рдХреЛ рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдорд╛рдзрд╛рди рд╣реИ ...

var theAnswer: symbol = Symbol('secret');
var obj = {} as Record<symbol, number>;
obj[theAnswer] = 42; // Currently error, but should be allowed

Object.assign(obj, {theAnswer: 42}) // allowed

рдЖрдк рджреЗрдЦ рд░рд╣реЗ рд╣реИрдВ

Objet.assign(obj, { [theAnswer]: 42 });

рд╣рд╛рд▓рд╛рдБрдХрд┐, x[theAnswer] рдХрд╛рд╕реНрдЯ рдХреЗ рдмрд┐рдирд╛ рдкрдврд╝рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ AFAIK рдиреАрдЪреЗ рджреЛ рдЯрд┐рдкреНрдкрдгреА рджреЗрдЦреЗрдВ

рднрдЧрд╡рд╛рди рдХреЗ рдкреНрдпрд╛рд░ рдХреЗ рд▓рд┐рдП, рдХреГрдкрдпрд╛ рдЗрд╕реЗ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рджреЗрдВред

рдЖрдк рджреЗрдЦ рд░рд╣реЗ рд╣реИрдВ

Objet.assign(obj, { [theAnswer]: 42 });

рд╣рд╛рд▓рд╛рдБрдХрд┐ x[theAnswer] рдПрдХ рдХрд▓рд╛рдХрд╛рд░ AFAIK рдХреЗ рдмрд┐рдирд╛ рдкрдврд╝рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ

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

var theAnswer: symbol = Symbol("secret");
var obj = {} as Record<symbol, number>;

obj[theAnswer] = 42; // Not allowed, but should be allowed

Object.assign(obj, { [theAnswer]: 42 }); // allowed

function get<T, K extends keyof T>(object: T, key: K): T[K] {
  return object[key];
}

var value = obj[theAnswer]; // Not allowed, but should be allowed

var value = get(obj, theAnswer); // allowed

рдкрд╛рдВрдЪ рд╕рд╛рд▓ рдФрд░ рдкреНрд░рддреАрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдЕрднреА рднреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рд╣реИ

рдЗрд╕ рдорд╛рдорд▓реЗ рдкрд░ рдПрдХ рдХрд╛рдо рдХреЗ рдЖрд╕рдкрд╛рд╕ рдорд┐рд▓рд╛, рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ:

const SYMKEY = Symbol.for('my-key');

interface MyObject {   // Original object interface
  key: string
}

interface MyObjectExtended extends MyObject {
  [SYMKEY]?: string
}

const myObj: MyObject = {
  'key': 'value'
}

// myObj[SYMKEY] = '???' // Not allowed

function getValue(obj: MyObjectExtended, key: keyof MyObjectExtended): any {
  return obj[key];
}

function setValue(obj: MyObjectExtended, key: keyof MyObjectExtended, value: any): void {
  obj[key] = value
}

setValue(myObj, SYMKEY, 'Hello world');
console.log(getValue(myObj, SYMKEY));

@ james4388 @beenotung рд╕реЗ рдЖрдкрдХрд╛ рдЙрджрд╛рд╣рд░рдг рдХреИрд╕реЗ рдЕрд▓рдЧ рд╣реИ?

FYI рдХрд░реЗрдВ: https://github.com/microsoft/TypeScript/pull/26797

(рдмрд╕ рдпрд╣ рдкрд╛рдпрд╛ рдЧрдпрд╛ - рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЯреАрдПрд╕ рдЯреАрдо рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдирд╣реАрдВ рд╣реВрдВред)

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

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

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

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

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

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

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