Typescript: рд╕реБрдЭрд╛рд╡: рдкреНрд░реЙрдкрд░реНрдЯреА рдФрд░ рдлрдВрдХреНрд╢рди рдХреЗ рдирд╛рдореЛрдВ рдХреЛ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдореЗрдВ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдВрдкрд╛рдЗрд▓-рдЯрд╛рдЗрдо рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдирд╛рдо рдЬреЛрдбрд╝реЗрдВ

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

рдореИрдВ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ nameof рдСрдкрд░реЗрдЯрд░ рдХреЛ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд▓рд┐рдП рдорд╛рдирд╛ рдЬрд╛рдПред

рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рдЕрднреА C# рд╡рд┐рд╡рд░рдг рдореЗрдВ рдЬреЛрдбрд╝реА рдЧрдИ рдереА, рдФрд░ рдпрд╣ Javascript рдореЗрдВ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдПрдХ рд╕реБрдВрджрд░ рд╕рдорд╛рдзрд╛рди рд╣реИред

рд╕рдВрдХрд▓рди рд╕рдордп рдкрд░, nameof рдЕрдкрдиреЗ рдкреИрд░рд╛рдореАрдЯрд░ (рдпрджрд┐ рдорд╛рдиреНрдп рд╣реЛ) рдХреЛ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддрд╛ рд╣реИред рдпрд╣ "рдореИрдЬрд┐рдХ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕" рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рддрд░реНрдХ рдХрд░рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рдмрдирд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рд░рд┐рдлреИрдХреНрдЯрд░ рдореЗрдВ рдЪрд░ рдпрд╛ рд╕рдВрдкрддреНрддрд┐ рдХреЗ рдирд╛рдореЛрдВ рд╕реЗ рдореЗрд▓ рдЦрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рд╡рд░реНрддрдиреА рдХреА рдЧрд▓рддрд┐рдпреЛрдВ рдХреЛ рд░реЛрдХрдирд╛, рдФрд░ рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреА рд╕реБрд░рдХреНрд╖рд┐рдд рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВред

рд▓рд┐рдВрдХ рдХрд┐рдП рдЧрдП рд╕реА # рдЖрд▓реЗрдЦ рд╕реЗ рдЙрджреНрдзреГрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП:

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

(if x == null) throw new ArgumentNullException(nameof(x));

рдПрдХ рдФрд░ рдЙрджрд╛рд╣рд░рдг рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдпрд╣ рд╡реНрдпрдХреНрддрд┐ рд╡рд░реНрдЧ рд╣реИ:

class Person {
    firstName: string
    lastName: string
}
var instance : Person = new Person();

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

   someFunction(personInstance, "firstName");

рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдореИрдВ firstName рдЧрд▓рдд рд╡рд░реНрддрдиреА рдХрд░рддрд╛ рд╣реВрдВ, рддреЛ рдореБрдЭреЗ рд░рдирдЯрд╛рдЗрдо рддреНрд░реБрдЯрд┐ рдорд┐рд▓ рдЬрд╛рдПрдЧреАред
рддреЛ рдпрд╣ рдЯрд╛рдЗрдк-рд╕реБрд░рдХреНрд╖рд┐рдд рд╕рдордХрдХреНрд╖ рд╣реИ:

   someFunction(personInstance, nameof(Person.firstName));
Suggestion Waiting for TC39

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

рдЗрддрдиреЗ рд╕рдордп рдХреЗ рдмрд╛рдж рднреА, TS рдХреЗ рдкрд╛рд╕ рдЕрднреА рднреА MAGIC STRINGS рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП (рдЬреИрд╕реЗ nameof ) рдХреЛрдИ рддрдВрддреНрд░ рдирд╣реАрдВ рд╣реИ?

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

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

#394 рдФрд░ #103 рднреА рджреЗрдЦреЗрдВред

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

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

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

рд╕реА # рдореЗрдВ рдпрд╣ рджреВрд╕рд░реА рддрд░рдл рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ - рдЖрдкрдХреЛ рдЕрд╕реАрдорд┐рдд рд╕реНрдЯреНрд░рд┐рдВрдЧ рдорд┐рд▓рддреА рд╣реИред рдЯрд╛рдЗрдкрдкреНрд░рддрд┐ рдореЗрдВ рдореИрдВ рдЫреЛрдЯрд╛ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рддреЛ рд╢рд╛рдпрдж рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрд▓рдЧ рдкреНрд░рд╕реНрддрд╛рд╡ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ :-) рдЬреИрд╕рд╛ рдХрд┐ unminified рднреА рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред рдмрд╕ рдХреБрдЫ рдЦрдпрд╛рд▓...

рдЗрд╕ рдмрд╛рдд рд╕реЗ рд╕рд╣рдорддред рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдХреА рддрд░рд╣ рдирд╣реАрдВ рджрд┐рдЦрддрд╛ рд╣реИред рдПрдХ nameof рдСрдкрд░реЗрдЯрд░ рдХреЛ рдПрдХ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рдорд╛рдирд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╢рд╛рдпрдж рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП "рдЖрд╕рд╛рди" рднреАред
рдореИрдВ angularjs рдХреЗ рд╕рд╛рде рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рдореИрдВ рдЕрдкрдиреЗ рдирд┐рдпрдВрддреНрд░рдХ/рдирд┐рд░реНрджреЗрд╢рдХ рд╡рд░реНрдЧреЛрдВ рдХреЗ рдЕрдВрджрд░ рд╕реНрдерд┐рд░ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╕реНрдерд┐рд░рд╛рдВрдХ рдмрдирд╛рдирд╛ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдореИрдВ рдЗрди рдХрдХреНрд╖рд╛рдУрдВ рдХреЛ рдХреЛрдгреАрдп рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдкрдВрдЬреАрдХреГрдд рдХрд░рддреЗ рд╕рдордп рдХрд░рддрд╛ рд╣реВрдВред рдЗрди рдирд╛рдореЛрдВ рдХреЛ рд╣рд╛рд░реНрдбрдХреЛрдб рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдореИрдВ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп nameof(MyDirectiveClass) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред
рдпрд╣ рдЙрд╕реА рддрд░рд╣ рдХреА рд╕рдорд╕реНрдпрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдордиреЗ рдкрд╣рд▓реЗ WPF рдореЗрдВ PropertyChanged рдИрд╡реЗрдВрдЯ (nameof/CallerMemberName рд╕реЗ рдкрд╣рд▓реЗ) рдХреЗ рд╕рд╛рде рдЕрдиреБрднрд╡ рдХрд┐рдпрд╛ рдерд╛ рдЬрдм рдЖрдкрдиреЗ рд╕рд╛рдорд╛рди рдХрд╛ рдирд╛рдо рдмрджрд▓рд╛ рдерд╛ред

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

:рдердореНрд╕ рдЕрдк:

рдореИрдВ рдХрд╛рдо рдкрд░ рдПрдХ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдФрд░ рд░рди-рдЯрд╛рдЗрдо рдбрдХ рдЯрд╛рдЗрдк рдЪреЗрдХрд░ рдбрд╛рд▓ рд░рд╣рд╛ рд╣реВрдВред рдЙрдкрдпреЛрдЧ рдХрд╛ рдорд╛рдорд▓рд╛ URL рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдбреА-рд╕реАрд░рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░ рд░рд╣рд╛ рд╣реИред

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

class Foo {
    prop: string;
}

function isFoo(obj: Foo): boolean;
function isFoo(obj: any) {
    return (typeof obj === 'object') && 
              (obj !== null) && 
              (nameof(Foo.prop) in obj);
}

// Output for isFoo()
function isFoo(obj: any) {
    return (typeof obj === 'object') && 
              (obj !== null) && 
              ('prop' in obj);
}

рдХреНрдпрд╛ рдпрд╣ рд╕рд╣реА рдзрд╛рд░рдгрд╛ рд╣реИ?

@frodegil , рдпрд╣ рдПрдХ рднрдпрд╛рдирдХ рдЙрдкрдпреЛрдЧ рдХрд╛ рдорд╛рдорд▓рд╛ рд╣реЛрдЧрд╛ред рдореЗрд░реЗ рджреИрдирд┐рдХ рдХрд╛рд░реНрдп-рдкреНрд░рд╡рд╛рд╣ рд╕реЗ рдмрд╣реБрдд рд╕реА рдХреЛрдб-рдЧрдВрдз рдФрд░ рджреЛрд╣рд░рд╛рд╡рджрд╛рд░ рдкреНрд░рддрд┐рд▓рд┐рдкрд┐/рдЪрд┐рдкрдХрд╛рдиреЗ рдХреЛ рдХрдо рдХрд░реЗрдЧрд╛ред

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

@bryanerayner , рдЖрдкрдХреА рдзрд╛рд░рдгрд╛ рд╕рд╣реА рд╣реИред nameof рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЗрд╡рд▓ рд╕рдВрдХрд▓рди рдХреЗ рджреМрд░рд╛рди рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

module pd {
   export class MyAngularControllerClass {
      public static IID : string = nameof(MyAngularControllerClass);  // "MyAngularControllerClass"
      public static $inject: string[] = [Model1.IID, Model2.IID, "$scope"];
      constructor(model1: Model1, model2:Model2, $scope:angular.IScope) {
      }
      public get nameOfThisGetter() : string {
         return nameof(this.nameOfThisGetter);    // "nameOfThisGetter";
      }
   }
   angular.module(nameof(pd)).controller(MyAngularControllerClass.IID, MyAngularControllerClass);
   // angular.module("myapp").controller("OldName", MyAngularControllerClass); < out of sync
}

рд░рд┐рдлреИрдХреНрдЯрд░рд┐рдВрдЧ рдХреЗ рджреМрд░рд╛рди рдЗрди рд╣рд╛рд░реНрдбрдХреЛрдбреЗрдб рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреЛ рдЖрдЙрдЯ-рдСрдл-рд╕рд┐рдВрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЗрддрдирд╛ рдЖрд╕рд╛рди рд╣реИ

рдпрд╣ рд╢рд╛рдирджрд╛рд░ рд╣реЛрдЧрд╛ред

рд╡рд╛рдХрдИ рд╢рд╛рдирджрд╛рд░ред рдРрд╕реЗ рдСрдкрд░реЗрдЯрд░ рдХреЗ рд╕рд╛рде рдЗрддрдирд╛ рдХреБрдЫ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рд╣рдо рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ #394 рдФрд░ #1003 рдХреЗ рдмрд╛рдж рдЪреАрдЬреЗрдВ 'рдорд╣рд╕реВрд╕' рдХреИрд╕реЗ рд╣реЛрддреА рд╣реИрдВред рдпрд╣ рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рд╣рдо рдирдП рдПрдХреНрд╕рдкреНрд░реЗрд╢рди-рд▓реЗрд╡рд▓ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рд╕рд╣рд╛рд░рд╛ рд▓рд┐рдП рдмрд┐рдирд╛ рдЗрди рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓реЛрдВ рдХреЛ рдЯрд╛рдЗрдк рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рд╣рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

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

рдЦреИрд░, рдорд╛рдорд▓реЗ рдХреЛ рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ @frodegil рджреНрд╡рд╛рд░рд╛ Function/Class рдХрд╛ рдПрдХ рд╣реА рдирд╛рдо рд╣реИ), рдЬреИрд╕рд╛ рдХрд┐ рдПрдВрдЧреБрд▓рд░ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд╣реИ, рд╣реИ рдПрдХ рдРрд╕рд╛ рдорд╛рдорд▓рд╛, рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛрдореИрдВ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдВ, #394 рдХреЗ memberof рджреНрд╡рд╛рд░рд╛ рдпрд╛ рддреЛ #394 рдХреЗ рджреНрд╡рд╛рд░рд╛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рди рд╣реА #103 рд╕реЗ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╢рд╛рдмреНрджрд┐рдХ рдкреНрд░рдХрд╛рд░реЛрдВ рджреНрд╡рд╛рд░рд╛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмрд╛рдж рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ!)ред

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

рдПрдХ рдФрд░ рдЫреЛрдЯрд╛ рдорд╛рдорд▓рд╛

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

рдЕрднреА рдХреЗ рд▓рд┐рдП рдореБрдЭреЗ рдЕрдкрдиреЗ рд╕рднреА рдореЙрдбрд▓реЛрдВ рдкрд░ рдХреНрд▓рд╛рд╕рдирд╛рдо рдирд╛рдордХ рд╕рдВрдкрддреНрддрд┐ рдХреЛ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

class Person {
  className = 'Person';

  _id: string;
  $_dateCreated: number;
}

var p:Person;
p._id = `${this.className}_${window.appMetadata.cordovaUuid}__${this.$_dateCreated}__${window.uuid.v4()}`
pouchdb.put(p)

рдЬрд┐рд╕реЗ рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

class Person {
  _id: string;
  $_dateCreated: number;
}

var p:Person;
p._id = `${nameof Person}_${window.appMetadata.cordovaUuid}__${this.$_dateCreated}__${window.uuid.v4()}`
pouchdb.put(p)

рджреВрд░рджрд░реНрд╢реА рдореБрджреНрджреЗ

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

рдкрддрд▓реЗ рд╡рд┐рдХрд▓реНрдк

рдпрд╣ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП рдХрд┐ рд╕рдВрдкрддреНрддрд┐ рдХреЗ рдирд╛рдо рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╕рднреА рдорд╛рдорд▓реЛрдВ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ #394 рдпрд╛ #1003 рджреНрд╡рд╛рд░рд╛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдореИрдВ рдХрд╣реВрдВрдЧрд╛ рдХрд┐ getClass() рдФрд░ getClassName() (рдЙрджрд╛рд╣рд░рдг рдпрд╣рд╛рдВ рджреЗрдЦреЗрдВ) рдХреЗ рдПрдХреНрд╕рдкреЛрдЬрд░ рд╕реЗ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рд╢реЗрд╖ рдорд╛рдорд▓реЗ рдЬрд┐рдиреНрд╣реЗрдВ рдореИрдВ рдирдП рд╕рд┐рдВрдЯреЗрдХреНрд╕ рддрддреНрд╡ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдмрд┐рдирд╛ рдЬрд╛рдирддрд╛ рд╣реВрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдпрд╣ рдПрдХ рдХреЛрд░ рдбреЗрдХреЛрд░реЗрдЯрд░ рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдПрдХ рдЙрдкрдпреЛрдЧ рдХрд╛ рдорд╛рдорд▓рд╛ рдЬрд╣рд╛рдВ рди рддреЛ # 394, # 2003, getClass () рдФрд░ рди рд╣реА GetClassName () рдорджрдж рдХрд░реЗрдЧрд╛, рдпрд╣ Angular2 рдореЗрдВ рд╣реЛрдЧрд╛:

    @Component({
        selector: 'my-selector',
        template: `<h1>{{${nameof MyComponent.prototype.title}}}</h1>`
    })
    class MyComponent { 
        public title = "Hellow world";
    }

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

nameof рд▓рд┐рдП Enums рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣рд╛рдВ рд╕реБрдЭрд╛рд╡ рдЬреЛрдбрд╝рдирд╛, рдПрдХ enum toString'ing рдХреЗ рд╢реЙрд░реНрдЯрдХрдЯ рдХреЗ рд░реВрдк рдореЗрдВ:

nameof(MyModule.Enums.FooEnum.Bar) === "Bar"

рдЗрд╕рдХреЗ рд▓рд┐рдП рд╕рдВрдХрд▓рд┐рдд рд╣реЛрдЧрд╛:

MyModule.Enums.FooEnum[MyModule.Enums.FooEnum.Bar] === "Bar"

рдпрд╛ рдХреЗрд╡рд▓:

"Bar" === "Bar"

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

var obj = new MyClass();
sinon.stub(obj, 'methodName', () => null); // Prone to break.
var obj = new MyClass();
sinon.stub(obj, nameof(MyClass.methodName), () => null);

рдпрд╛, рдпрджрд┐ рдареВрдВрда рдирд╛рдо рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдзреЗрдп рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдХрд░реЗрдЧрд╛:

var obj = new MyClass();
function stub<T>(targetObject: T, targetMethodPredicate: (T)=>string, methodStub: Function){}
sinon.stub(obj, x => nameof(x.methodName), () => null);

рдореЗрд░реЗ рдкрд╛рд╕ SQL тАЛтАЛтАЛтАЛрд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХреЗрд╕ рд╣реИред рдпрд╣рд╛рдБ рдПрдХ рдХреЛрдб рдХрд╛ рдЯреБрдХрдбрд╝рд╛ рд╣реИ:

interface User {
    id: string;
    name: string;
    birthday: Date;
}

// Current implementation
var sql = `SELECT id,name FROM Users`;

// Desired implementation
var sql = `SELECT ${nameof(User.id)},${nameof(User.name)} FROM ${nameof(User)}s`;

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

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

@RyanCavanaugh
рдкрд╛рдБрдЪ рдорд╣реАрдиреЗ рдмрд╛рдж:

1003 рдЙрддрд░рд╛ рд╣реИ рд▓реЗрдХрд┐рди рдХрдИ рдкрд░рд┐рджреГрд╢реНрдпреЛрдВ рдореЗрдВ рдорджрдж рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ (рдиреАрдЪреЗ рджреЗрдЦреЗрдВ)ред

394 #1295 рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рдмрдВрдж рд╣реИред рдЙрддреНрддрд░рд╛рд░реНрджреНрдз рдХрд╣реАрдВ рднреА рд▓реИрдВрдбрд┐рдВрдЧ рдХреЗ рдкрд╛рд╕ рдирд╣реАрдВ рд▓рдЧрддрд╛ рд╣реИ рдФрд░ рдЬрдм рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рд╣рд┐рд╕реНрд╕рд╛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИ (рдЯрд╛рдЗрдкрд┐рдВрдЧ) рдпрд╣ рд╕реНрдЯреНрд░рд┐рдВрдЧ/рдирд╛рдо рднрд╛рдЧ рдХреЗ рд╕рд╛рде рдорджрдж рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рд╢рд╛рдпрдж рдлрд┐рд░ рд╕реЗ рдЬрд╛рдиреЗ рдХрд╛ рд╕рдордп?

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

рдСрд░реЗрд▓рд┐рдпрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдХреБрдЫ рдЙрджрд╛рд╣рд░рдг:

let p: Person;

// Observe a property for changes
let bindingEngine: BindingEngine;
bindingEngine.observeProperty(p, 'firstName')
             .subscribe((newValue: string) => ...);

class Person {
  firstName: string;

  // Declare a function to call when value changes
  @bindable({ changeHandler: 'nameChanged'})
  lastName: string;

  nameChanged(newValue: string, oldValue: string) { ... }

  // Declare computed property dependencies
  @computedFrom('firstName', 'lastName')
  get fullName() {
    return `${firstName} ${lastName}`;
  }
}

// Declare dependencies for validation
validation.on(p)
  .ensure('firstName').isNotEmpty()
  .ensure('fullName', config => config.computedFrom(['firstName', 'lastName'])).isNotEmpty();

рд╡рд╣рд╛рдВ рдЖрдкрдХреЗ рдкрд╛рд╕ рдкрд╛рдВрдЪ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдПрдкреАрдЖрдИ рд╣реИрдВ рдЬреЛ nameof рдСрдкрд░реЗрдЯрд░ рд╣реЛрдиреЗ рд╕реЗ рд╕рднреА рд▓рд╛рднрд╛рдиреНрд╡рд┐рдд рд╣реЛрдВрдЧреЗред

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

рдХреНрд╖рдорд╛ рдХрд░реЗрдВ рдореИрдВрдиреЗ рдЕрдкрдиреА рдкреЛрд╕реНрдЯ рдмрд╣реБрдд рдЬрд▓реНрдж "Ctrl-Entered" рдХрд░ рджреАред рдореИрдВрдиреЗ рдХрдИ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЬреАрд╡рди рдХреЛрдб рдЙрджрд╛рд╣рд░рдг рдЬреЛрдбрд╝реЗ рд╣реИрдВ рдЬреЛ рд▓рд╛рднрд╛рдиреНрд╡рд┐рдд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред

рдорд╛рдорд▓реЛрдВ рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдКрдкрд░ рджрд┐рдП рдЧрдП рдХреБрдЫ рдПрдкреАрдЖрдИ рдкрде рднреА рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреЗ рд╣реИрдВред рддреЛ @computedFrom('p.address.city') рдорд╛рдиреНрдп рд╣реИ рдФрд░ рдЗрд╕рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рднреА рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛...

рдЗрд╕ рдЯрд┐рдкреНрдкрдгреА рдореЗрдВ рдПрдХ рдЕрдиреНрдп рдЕрдВрдХ рдореЗрдВ рдореИрдВрдиреЗ C# рд╕реЗ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реАрдорд┐рдд _Expressions_ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рд░рдЦрд╛ред

рд╡реЗ рдЗрд╕ рдзрд╛рдЧреЗ рдХреЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП nameof рд╕реЗ рдмреЗрд╣рддрд░ рд╡рд┐рдХрд▓реНрдк рд╣реЛрдВрдЧреЗ:

  • рд╡реЗ рдкрд░рд┐рдгрд╛рдо рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ;
  • рд╡реЗ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╕рджрд╕реНрдп рдкрд╣реБрдВрдЪ (рдиреЗрд╕реНрдЯреЗрдб, рдЗрдВрдбреЗрдХреНрд╕рд░реНрд╕) рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реИрдВ;
  • рд╡реЗ рдЖрдкрдХреЛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЪрд░ рджреЗрддреЗ рд╣реИрдВ, рдЬреЛ рдХрд┐рд╕реА рдорд╛рдорд▓реЗ рдореЗрдВ рдЖрдкрдХреЗ рдкрд╛рд╕ nameof рджрд╛рдпрд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред

рдЕрдВрддрд┐рдо рдмрд┐рдВрджреБ рдХрд╛ рджреЛрд╖ рдпрд╣ рд╣реИ рдХрд┐ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдореЗрдВ рдРрд╕реЗ рдорд╛рдорд▓реЗ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реЛрдВрдЧреЗ рдЬреИрд╕реЗ:

function f(x: number) {
  let s = nameof(x);
}

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

рдореИрдВ рджреВрд╕рд░реЗ рдЕрдВрдХ рд╕реЗ рд╡рд┐рдЪрд╛рд░ рдХреЗ рд╡рд┐рд╡рд░рдг рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛ рд░рд╣рд╛ рд╣реВрдВ:


рдорд╛рди рд▓реЗрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рднрд╛рд╡реЛрдВ рдХреЛ рджрд░реНрд╢рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢реЗрд╖ рдкреНрд░рдХрд╛рд░ рдХреЗ рддрд╛рд░ рд╣реИрдВред
рдЖрдЗрдП рдЗрд╕реЗ type Expr<T, U> = string ред
рдЬрд╣рд╛рдВ T рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╡рд╕реНрддреБ рдкреНрд░рдХрд╛рд░ рд╣реИ рдФрд░ U рдкрд░рд┐рдгрд╛рдо рдкреНрд░рдХрд╛рд░ рд╣реИред

рдорд╛рди рд▓реЗрдВ рдХрд┐ рд╣рдо рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ Expr<T,U> рдПрдХ рд▓реИрдореНрдмреНрдбрд╛ рдЙрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рд▓реЗрддрд╛ рд╣реИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ T рдФрд░ рдкреНрд░рджрд░реНрд╢рди рдЙрд╕ рдкрд░ рдПрдХ рд╕рджрд╕реНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП: person => person.address.city ред
рдЬрдм рдРрд╕рд╛ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдкреВрд░реЗ рд▓реИрдореНрдмреНрдбрд╛ рдХреЛ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдкреИрд░рд╛рдореАрдЯрд░ рдкрд░ рдЬреЛ рднреА рдПрдХреНрд╕реЗрд╕ рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ: "address.city" ред

рдЖрдк рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдПрдХ рд╕рд╛рджреЗ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ Expr<any, any> рд░реВрдк рдореЗрдВ рджреЗрдЦрд╛ рдЬрд╛рдПрдЧрд╛ред

рднрд╛рд╖рд╛ рдореЗрдВ рдпрд╣ рд╡рд┐рд╢реЗрд╖ Expr рдкреНрд░рдХрд╛рд░ рд╣реЛрдиреЗ рд╕реЗ рдЗрд╕ рддрд░рд╣ рдХреА рдЪреАрдЬреЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрддреА рд╣реИрдВ:

function pluck<T, U>(array: T[], prop: Expr<T, U>): U[];

let numbers = pluck([{x: 1}, {x: 2}], p => p.x);  // number[]
// compiles to:
// let numbers = pluck([..], "x");

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

https://github.com/basarat/typescript-book/issues/33 рдореЗрдВ рдХрдо рд╕реЗ рдХрдо рдХреБрдЫ рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рд╣реИрдВ (рд╣рд╛рд▓рд╛рдБрдХрд┐ рдореИрдВ рдЕрднреА рдПрдХ рдРрд╕реЗ рдореБрджреНрджреЗ рдореЗрдВ рднрд╛рдЧрд╛ рд╣реВрдБ рдЬрд╣рд╛рдБ рдХреЛрдИ рдЕрдиреБрдЧрд╛рдореА рдирд╣реАрдВ рдерд╛ ';' ASP.Net рдХреЗ рд╕рд░рд▓ рдЦрдирди рдХреЗ рдХрд╛рд░рдг рдореЗрд░реА рд╡рд╛рдкрд╕реА рдХреЗ рдмрд╛рдж)

рдмрдбрд╝рд╛:+1::100: рд╕рдорд░реНрдерди рдХреЗ рд▓рд┐рдП рдореБрдЭрд╕реЗред

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

рдпрд╣рд╛рдВ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рджреБрдирд┐рдпрд╛ рдХрд╛ рдЙрджрд╛рд╣рд░рдг рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬрд╣рд╛рдВ nameof рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рдерд╛ред

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

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

export class LocalDBWorkerController<V> extends LocalDBBase<V> {
        initializeWorkerDB(options: BrowserDBOptions): Promise<void> {
            return this.executeInWorker("initializeWorkerDB", [options]);
        }

        getEntry(key: string): Promise<DBEntry<V>> {
            return this.executeInWorker("getEntry", [key]);
        }

        getEntries(keys: string[]): Promise<EntryArray<V>> {
            return this.executeInWorker("getEntries", [keys]);
        }

        getAllEntries(): Promise<EntryArray<V>> {
            return this.executeInWorker("getAllEntries");
        }

        // ...
}

рдпрджрд┐ рд╡рд┐рдзрд┐ рдирд╛рдореЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХрд╛ рдирд╛рдо рдмрджрд▓ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдореБрдЭреЗ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдЗрд╕рдХреЗ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд╛ рдирд╛рдо рдмрджрд▓рдирд╛ рдпрд╛рдж рд░рдЦрдирд╛ рд╣реЛрдЧрд╛, рдЕрдиреНрдпрдерд╛ рдореБрдЭреЗ рдПрдХ рд░рди-рдЯрд╛рдЗрдо рддреНрд░реБрдЯрд┐ рдорд┐рд▓реЗрдЧреА (рдпрд╣ рдорд╛рдирддреЗ рд╣реБрдП рдХрд┐ рдпрд╣ рдХреЛрдб рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЕрдиреНрдпрдерд╛ рдпрд╣ рдЫреВрдЯ рд╕рдХрддрд╛ рд╣реИ)ред

рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрддрд╛ рдЕрдЧрд░ рдореИрдВ рд╕рд┐рд░реНрдл рд▓рд┐рдЦ рдкрд╛рддрд╛:

export class LocalDBWorkerController<V> extends LocalDBBase<V> {
        initializeWorkerDB(options: BrowserDBOptions): Promise<void> {
            return this.executeInWorker(nameof(this.initializeWorkerDB), [options]);
        }

        getEntry(key: string): Promise<DBEntry<V>> {
            return this.executeInWorker(nameof(this.getEntry), [key]);
        }

        getEntries(keys: string[]): Promise<EntryArray<V>> {
            return this.executeInWorker(nameof(this.getEntries), [keys]);
        }

        getAllEntries(): Promise<EntryArray<V>> {
            return this.executeInWorker(nameof(this.getAllEntries));
        }

        // ...
}

рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдлрд┐рд░ рд╕реЗ рдЦреЛрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдирд╛рдо рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред

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

рдереЛрдбрд╝реА рджреЗрд░ рдХреЗ рд▓рд┐рдП рдЪрд░реНрдЪрд╛ рдХреА рдФрд░ рд╣рдореЗрдВ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдмреЗрд╣рддрд░ рдкреНрд░рд╕реНрддрд╛рд╡ рд╣реИ рдЬреЛ рдЗрд╕ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИред

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

1295 рдмреЗрд╣рддрд░ рдЯрд╛рдЗрдкрдЪреЗрдХрд┐рдВрдЧ рднреА рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ (рдХреНрдпреЛрдВрдХрд┐ рдЖрдк nameof рдЧрд▓рдд рдмрд╛рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ) рдЬрдмрдХрд┐ рдХреЙрдореНрдкреЗрдЯ рд╕рдорд╕реНрдпрд╛ рд╕реЗ рдмрдЪрддреЗ рд╣реИрдВ (рдЖрдкрдХреЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА nameof рдирд╛рдо рдХрд╛ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ!) рдФрд░ "рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ рдпрджрд┐ ES7+ рдЬреЛрдбрд╝рддрд╛ рд╣реИ рдпрд╣ рдСрдкрд░реЗрдЯрд░ рднреА" рд╕рдорд╕реНрдпрд╛ред

рддреБрдо рдЕрдм рднреА рднреА рдХреБрдЫ рдЕрдЪреНрдЫреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╕реНрддрд░ рдХреЗ рд╕рддреНрдпрд╛рдкрди, рднреА рд╣реИ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛ рдХреНрдпреЛрдВрдХрд┐ рддреБрдо рдЬреИрд╕реЗ рд▓рд┐рдЦ рд╕рдХрддрд╛ рдерд╛ <memberof MyType>"SomeMember" (рдЬреЛ рдорд╛рдиреНрдп рд╣реЛрдЧрд╛!) рдХреЗ рдмрдЬрд╛рдп nameof myTypeInstance.SomeMember ред рдпрд╣ рдФрд░ рднреА рдлрд╛рдпрджреЗрдордВрдж рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЕрдм рдЖрдкрдХреЛ рдЗрд╕рдХреА рд╕рдВрдкрддреНрддрд┐ рдХреЗ рдирд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП MyType рдЙрджрд╛рд╣рд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдЬреЛ рдХрд┐ рдЕрдХреНрд╕рд░ рд╣реЛрддрд╛ рд╣реИред

<memberof MyType>"someMember"
  1. рд╢реБрд░реБрдЖрддреА рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕рд╣рдЬ рдпрд╛ рдореИрддреНрд░реАрдкреВрд░реНрдг рдирд╣реАрдВ рджрд┐рдЦрддрд╛ рд╣реИ (рдЕрдзрд┐рдХ рд╕рд╛рд░, рдпрд╣ рд╕рдордЭрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдХрд╛рд╕реНрдЯ рдХреНрдпрд╛ рд╣реИ, рдкреНрд░рдХрд╛рд░ рд╕рдВрд╢реЛрдзрдХ)ред
  2. рд▓рдВрдмрд╛ред рдЕрддрд┐рд░рд┐рдХреНрдд 'рд╢реЛрд░' ( < > , " " ) рдЬреЛрдбрд╝рддрд╛ рд╣реИред
  3. рдЕрдирд╛рдо рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдЖрд░рд╛рдо рд╕реЗ рдкреНрд░рдпреЛрдЧ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдирд╣реАрдВ рд╣реИред рдЬреИрд╕реЗ let x = { prop1: 123 }; let s = nameof(x.prop1) ред рдЬрдм рддрдХ рдХреБрдЫ рд╣рдж рддрдХ рд╡рд░реНрдмреЛрдЬрд╝ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП <memberof typeof x>"prop1" ред
  4. рдШреЛрдВрд╕рд▓реЗ рдХреЗ рд╢рд┐рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рдХреГрддрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд╛ рд╕реБрдЭрд╛рд╡ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИред рдЬреИрд╕реЗ nameof(myTypeInstance.someMember.nestedMember) ред
  5. рд╕рдВрдкрд╛рджрдХ рд╕реНрд╡рддрдГ рдкреВрд░реНрдг рд╣реЛрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИред
  6. рдирд╛рдо рдмрджрд▓рдиреЗ рдХреА рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреЗ рд▓рд┐рдП рдЦреБрдж рдХреЛ рд▓рдХреНрд╖реНрдп рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдХреНрд▓рд┐рдХ рдХрд░рдирд╛ рдФрд░ F2 рджрдмрд╛рдирд╛)ред
  7. рдХрдо рдЬрд╛рдирдХрд╛рд░реАрдкреВрд░реНрдг рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢: рдЬреИрд╕реЗ "someMember" is not assignable to... "member1" | "member2" | .. рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рдХреЗ рдмрдЬрд╛рдп 'someMember' is not a member of ... ред
  8. рдирд┐рдЬреА рдпрд╛ рд╕рдВрд░рдХреНрд╖рд┐рдд рд╕рджрд╕реНрдпреЛрдВ рдХреЛ рдмрд╛рд╣рд░ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ (рдЬрдм рддрдХ рдХрд┐ publicMemberof рдпрд╛ publicOrProtectedMembersOf рдЬреИрд╕рд╛ рдХреБрдЫ рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рд╡рд░реНрдмреЛрдЬрд╝ рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ)ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд╣реИ - рдпрд╣ рдЙрд╕ рддрд░рд╣ рдХреА рд╕реБрд░рдХреНрд╖рд╛ рд╣реИ рдЬрд┐рд╕рдХреА рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЛ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдФрд░ nameof рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ #1295 рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ рд▓реЗрдХрд┐рди рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдкреВрд░рдХ рд▓рдЧрддрд╛ рд╣реИ (рд╡реЗ рдПрдХ рд╕рд╛рде рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ)? рдпрд╣ рдПрдХ рдЕрдЬреАрдм рдирд┐рд░реНрдгрдп рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИ (рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ 'рдЕрд╕реНрд╡реАрдХрд╛рд░' рдлреИрд╕рд▓реЗ-рдЬреИрд╕реЗ рдЯреИрдЧ рдХреЗ рд╕рд╛рде рдЬреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣рд╛рдВ рдЕрдиреБрдЪрд┐рдд рд╣реИ - рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ)ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ nameof рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдФрд░ рдЕрд╡рдзрд╛рд░рдгрд╛ рд╣реИред рдЕрддреНрдпрдзрд┐рдХ 'рддрд░реНрдХрд╕рдВрдЧрдд' рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдпрд╛ рдЗрд╕реЗ рд▓рд╛рдЧреВ рди рдХрд░рдиреЗ рдХреЗ рдирд┐рд░реНрдгрдп рдХреЛ рдЙрдЪрд┐рдд рдард╣рд░рд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдПрдХреНрдорд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдореЗрдВ рд╣рд╕реНрддрдХреНрд╖реЗрдк рдХрд░ рд╕рдХрддрд╛ рд╣реИ (рдЬреЛ рдпрд╣рд╛рдВ рдкреНрд░рд╛рдердорд┐рдХ рдЪрд┐рдВрддрд╛ рд╣реИ, рдореБрдЭреЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рд╣реИ)ред

рдкреБрди: рдЕрдВрдХ 1-4 рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдЖрдк рд╕рд┐рд░реНрдл "someMember" рд▓рд┐рдЦрддреЗ рд╣реИрдВ рдФрд░ рд╕рдм рдХреБрдЫ рдмрд╕ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред рдореИрдВ рдХреЗрд╡рд▓ <...>" " рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реВрдВрдЧрд╛ рдЬрдм рд▓рдХреНрд╖реНрдп рдиреЗ memberof рдкреНрд░рдХрд╛рд░ рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд┐рдпрд╛, рдЬреЛ рдХреБрдЫ рд╣рдж рддрдХ рджреБрд░реНрд▓рдн рд╣реЛрдиреЗ рд╡рд╛рд▓рд╛ рд╣реИред

рдмрд┐рдВрджреБ 5 рд╕рд╣реА рд╣реИред

рдмрд┐рдВрджреБ 6 рд╕рд╣реА рдирд╣реАрдВ рд╣реИ; рдЖрдк рдЙрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдирд╛рдо рдмрджрд▓рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдВрдЧреЗред

рдмрд┐рдВрджреБ 7 рд╕рд╣реА рдирд╣реАрдВ рд╣реИ рдЬрдм рд▓рдХреНрд╖реНрдп memberof -- рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рд╡рд╣рд╛рдВ рдПрдХ рдЕрдЪреНрдЫрд╛ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдВрдЧреЗред

рдмрд┐рдВрджреБ 8, рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдБ рдХрд┐ рд╣рдореЗрдВ рдЗрд╕рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рд╣реЛрдЧрд╛ред

рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ 'рдЕрд╕реНрд╡реАрдХрд╛рд░' рдлреИрд╕рд▓реЗ-рдЬреИрд╕реЗ рдЯреИрдЧ рдХреЗ рд╕рд╛рде рдЬреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣рд╛рдВ рдЕрдиреБрдЪрд┐рдд рд╣реИ - рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░

рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╡рд┐рдХрд▓реНрдк рдХреНрдпрд╛ рд╣реИ?

class Example {
   a: number
   protected b: string: 
   private c: boolean;
}

function getProp(obj: Example, prop: memberof Example) {
  //..
}

nameof рд╕рд╛рде рдЕрдкреЗрдХреНрд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ 1-4 (8 рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ) рдХреЗ рд▓рд┐рдП рдпрд╣рд╛рдВ рдПрдХ рд╕реАрдорд╛ рд╣реИред рд╕реАрдорд╛ рдпрд╣ рд╣реИ рдХрд┐ nameof , рдХреЙрд▓ рдХреЗ рд╕рдВрджрд░реНрдн рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдПрдХ рдЕрд▓рдЧ рдЕрдкреЗрдХреНрд╖рд╛ рд╣реЛрдЧреА рдХрд┐ рдХреМрди рд╕реЗ рд╕рджрд╕реНрдп рд╡реИрдз рдХреЗ рд░реВрдк рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрдВрдЧреЗред рдпрджрд┐ рдХрдХреНрд╖рд╛ рдХреЗ рдмрд╛рд╣рд░ рд╕реЗ рд╕рдВрджрд░реНрднрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ memberof рдХреЗрд╡рд▓ "a" рд╢рд╛рдорд┐рд▓ рд╣реЛрдиреЗ рдХреА рдЙрдореНрдореАрдж рдХреА рдЬрд╛рдПрдЧреА, рдПрдХ рд╡реНрдпреБрддреНрдкрдиреНрди рд╡рд░реНрдЧ рд╕реЗ рдпрд╣ "a" | "b" рдФрд░ рдЕрдВрджрд░ рд╕реЗ рдпрд╣ "a" | "b" | "c" ред рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣рд╛рдВ 'рдореЙрдбрд▓' рдХреЛ рд╕реБрдВрджрд░ рдврдВрдЧ рд╕реЗ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдПрдХ рдкреНрд░рдХрд╛рд░ рдЖрдорддреМрд░ рдкрд░ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд░реВрдк рд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╕рдмрдХреБрдЫ рд╕рдВрднрд╡ рд╣реИ? рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореЗрд░реЗ рдкрд╛рд╕ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкрд░рд┐рдгрд╛рдореЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рдирд╣реАрдВ рд╣реИ)ред

6 рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдирд╛рдо рдмрджрд▓рдирд╛ рдереЛрдбрд╝рд╛ рдЕрдЬреАрдм рд▓рдЧреЗрдЧрд╛ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЪреВрдВрдХрд┐ рдпрд╣ рдПрдХ рджреГрд╢реНрдп рд╕рдВрджрд░реНрдн рдореЗрдВ рдирд╣реАрдВ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП someInstance.member ) рдпрд╣ рдорд╛рдирд╡реАрдп рдЧрд▓рддрд┐рдпреЛрдВ рдХреЗ рдЦрд┐рд▓рд╛рдл рднреА рд░рдХреНрд╖рд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред


рдПрдЬ рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рд╕реНрдерд┐рддрд┐ рдкреГрд╖реНрда рд╢рдмреНрджрд╛рд╡рд▓реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ:

  • рд╕рдорд░реНрдерд┐рдд
  • рдкреВрд░реНрд╡рд╛рд╡рд▓реЛрдХрди рдмрд┐рд▓реНрдб
  • рд╡рд┐рдХрд╛рд╕ рдореЗрдВ
  • рд╡рд┐рдЪрд╛рд░рд╛рдзреАрди
  • рдкрджрд╛рд╡рдирдд
  • рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдирд┐рдпреЛрдЬрд┐рдд рдирд╣реАрдВ

рдЙрд╕ рдкрд░ рдЖрдзрд╛рд░рд┐рдд:

  • рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ 'рдЕрдирд┐рдпреЛрдЬрд┐рдд' (рд╡реАрдПрд╕ рдХреЛрдб рдЧрд┐рдЯрд╣рдм рдореЗрдВ рдПрдХ рдореАрд▓ рдХрд╛ рдкрддреНрдерд░ рдХреЗ рд░реВрдк рдореЗрдВ рднреА рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛) 'рдЕрд╕реНрд╡реАрдХреГрдд' рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫрд╛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди (рдФрд░ рдЕрдзрд┐рдХ рдЕрдиреБрдХреВрд▓) рд╢рдмреНрдж рд╣реЛрдЧрд╛: рдпрджрд┐ рд╕рдорд╕реНрдпрд╛ рдмрдВрдж рд╣реЛ рдЬрд╛рддреА рд╣реИ рддреЛ рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реЛрдЧрд╛ рдХрд┐ рдпрд╣ 'рд╢рд╛рдпрдж рдХрднреА рдирд╣реАрдВ рд╣реЛрдЧрд╛', рдЕрдЧрд░ рдЦреБрд▓рд╛, 'рд╢рд╛рдпрдж рдПрдХ рджрд┐рди, рдХреМрди рдЬрд╛рдиреЗ'ред
  • 'рд╡рд┐рдЪрд╛рд░рд╛рдзреАрди' 'рдЪрд░реНрдЪрд╛ рдореЗрдВ' рдХреА рдЬрдЧрд╣ рд▓реЗ рд╕рдХрддрд╛ рд╣реИ (рдЬреЛ 'рдЪрд░реНрдЪрд╛' рдЯреИрдЧ рдХреЗ рд╕рд╛рде рдХреБрдЫ рднреНрд░рдорд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╣реИ)ред
  • рд╢рд╛рдпрдж 'рдкреНрд░рддрд┐рдмрджреНрдз' рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП 'рдирд┐рдпреЛрдЬрд┐рдд' рдФрд░ 'рд╡рд┐рдХрд╛рд╕ рдореЗрдВ'ред
  • 'рдбреБрдкреНрд▓рд┐рдХреЗрдЯ' рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрднреА-рдХрднреА рд╕реБрдЭрд╛рд╡реЛрдВ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдПрдХ рдЕрд▓рдЧ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЛ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рджреА рдЬрд╛рддреА рд╣реИред рдпреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ 'рдбреБрдкреНрд▓рд┐рдХреЗрдЯ' рдирд╣реАрдВ рд╣реИрдВ, 'рдорд░реНрдЬ' рдЬреИрд╕рд╛ рдХреБрдЫ рдмреЗрд╣рддрд░ рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИ (рдПрдХ рдмреЗрд╣рддрд░ рд╢рдмреНрдж рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдореИрдВ рдЕрднреА рдХреБрдЫ рднреА рдирд╣реАрдВ рд╕реЛрдЪ рд╕рдХрддрд╛, рдФрд░ рд╕рдордп рдЪрд╛рд╣рд┐рдП)ред _[рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рд╢рд╛рдпрдж 'рдЕрднрд┐рд╕рд░рдг' рдЬреИрд╕рд╛ рдХреБрдЫ? 'рдорд░реНрдЬ' рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЧрд┐рдЯ 'рдорд░реНрдЬ']_ рдХреЗ рд╕рд╛рде рднреНрд░рдорд┐рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
  • рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ 'рдЯреВ рдХреЙрдореНрдкреНрд▓реЗрдХреНрд╕' -> 'рдиреЙрдЯ рд╡рд░реНрдерд╡рд░реНрде' рд╢рд╛рдпрджред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрдирдореЗрдВ рд╕реЗ рдХреБрдЫ рд╡рд┐рдХрд▓реНрдк рдЗрд╕ рддрдереНрдп рдХреЛ рднреА рдмреЗрд╣рддрд░ рдврдВрдЧ рд╕реЗ рджрд░реНрд╢рд╛рддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ 'рд╕рдореБрджрд╛рдп' рдирд┐рд░реНрджреЗрд╢рд┐рдд рдкрд░рд┐рдпреЛрдЬрдирд╛ рдирд╣реАрдВ рд╣реИ (рдЬреИрд╕реЗ Node.js)ред 'рдЪрд░реНрдЪрд╛ рдореЗрдВ' рдЬреИрд╕реЗ рд╢рдмреНрдж рдРрд╕рд╛ рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдбрд┐рдЬрд╝рд╛рдЗрди рдЯреАрдо рдХреЗ рдмрдЬрд╛рдп 'рд╕рдореБрджрд╛рдп' рдкрд░ рдЪрд░реНрдЪрд╛ рдореЗрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ (рдХрдо рд╕реЗ рдХрдо рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рдРрд╕рд╛ рд╣реА рд╕реЛрдЪрд╛ рдерд╛)ред 'рдЕрд╕реНрд╡реАрдХрд╛рд░' рдереЛрдбрд╝рд╛ рдЪрд░рдо рд▓рдЧрддрд╛ рд╣реИ (рдХрднреА рдирд╣реАрдВ рдХрд╣рдирд╛ рдХрднреА рдирд╣реАрдВ ..)ред рдореЗрд░реЗ рд▓рд┐рдП рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдлреАрдЪрд░ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рдереЛрдбрд╝рд╛ рд╕рд╛ рд╡рд┐рд╢реЗрд╖рддрд╛ рджреЗрддрд╛ рд╣реИ рдЬреИрд╕реЗ рд╡реЗ 'рдорд╛рдВрдЧ' рдпрд╛ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ 'рдкрд░реАрдХреНрд╖рдг' рднреА рдереЗред рдХрднреА-рдХрднреА рд╡реЗ рд╕рд┐рд░реНрдл 'рд╡рд┐рдЪрд╛рд░', рд╡рд┐рдЪрд╛рд░, рдпрд╛ рдЬрд░реВрд░рддреЛрдВ рдХреА рдкреНрд░рд╛рдердорд┐рдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐, рдЬрд╛рдВрдЪ рдХреЗ рд▓рд┐рдП рдмрд┐рдВрджреБ рдЖрджрд┐ рд╣реЛрддреЗ рд╣реИрдВред рдХрднреА-рдХрднреА рд╡реЗ рдХреЗрд╡рд▓ 'рдЪрд░рдгреЛрдВ' рдпрд╛ рдмреЗрд╣рддрд░ рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рд╕реВрдЪрдирд╛ рдХреЗ рд╕реНрд░реЛрдд рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

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

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

@RyanCavanaugh

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

рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рдКрдкрд░ рджрд┐рдП рдЧрдП рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ ред рдореЗрд░рд╛ рд╡рд░реНрддрдорд╛рди рд╕рдорд╛рдзрд╛рди ES6 name рд╕рдВрдкрддреНрддрд┐ рдХреЛ рдлрд╝рдВрдХреНрд╢рди рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдХреЗ рд▓рд┐рдП рдкреЙрд▓реАрдлрд╝рд┐рд▓ рдХрд░рдирд╛ рд╣реИ , рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рд▓рдХреНрд╖реНрдп рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рд╕рднреА рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдФрд░ рдЗрд╕рдХреЗ рд╕рднреА рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдореЗрдВ:

(V8 рдХреЗ рд╕рдВрд╕реНрдХрд░рдг 5.0 рдХреЛ ES6 рдХреЛ рд▓рдХреНрд╖рд┐рдд рдХрд░рддреЗ рд╕рдордп рдЗрд╕ рдкреЙрд▓реАрдлрд╝рд┐рд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ (рдХреНрд░реЛрдо рдореЗрдВ 50 .name рд╡рд░реНрдЧ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ) рд╣рд╛рд▓рд╛рдВрдХрд┐ рдиреЛрдб 6.0 рдореЗрдВ рдХреБрдЫ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдЕрднреА рднреА рдПрдХ рдзреНрд╡рдЬ рдХреЗ рдкреАрдЫреЗ рд╣реИ ):

function polyfillMethodNameProperties(obj: any) {
    while (obj != null && obj !== Function.prototype && obj !== Object.prototype) {
        for (let propName of Object.getOwnPropertyNames(obj)) {
            let member = obj[propName];

            // Note: the latest Edge preview would resolve the name to 'prototype.[name]' 
            // so it might be better to force the polyfill in any case even if the 
            // feature is supported by removing '&& !member.name'
            if (typeof member === "function" && !member.name)
                Object.defineProperty(member, "name", {
                    enumerable: false,
                    configurable: true,
                    writable: false,
                    value: propName
                });
        }

        obj = Object.getPrototypeOf(obj);
    }
}

class LocalDBWorkerController<V> extends LocalDBBase<V> {
        constructor() {
            polyfillMethodNameProperties(this);
        }

        initializeWorkerDB(options: BrowserDBOptions): Promise<void> {
            return this.executeInWorker(this.initializeWorkerDB.name, [options]);
        }

        getEntry(key: string): Promise<DBEntry<V>> {
            return this.executeInWorker(this.getEntry.name, [key]);
        }

        getEntries(keys: string[]): Promise<EntryArray<V>> {
            return this.executeInWorker(this.getEntries.name, [keys]);
        }

        getAllEntries(): Promise<EntryArray<V>> {
            return this.executeInWorker(this.getAllEntries.name);
        }

        // ...
}

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


object рдкреНрд░рдХрд╛рд░ рд╡рд╛рд▓реЗ рд╕рджрд╕реНрдпреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ, рд▓реЗрдХрд┐рди рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рджреГрд╖реНрдЯрд┐рдХреЛрдг рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рд▓реЗрдХрд┐рди string , number , boolean рдЬреИрд╕реЗ рдЖрджрд┐рдо рдкреНрд░рдХрд╛рд░ рд╡рд╛рд▓реЗ рд╕рджрд╕реНрдп рдирд╣реАрдВ рд╣реИрдВред null рдпрд╛ undefined рдХреНрдпреЛрдВрдХрд┐ рдЙрдирдХреА рддреБрд▓рдирд╛ рд╕рдВрджрд░реНрдн рджреНрд╡рд╛рд░рд╛ рдирд╣реАрдВ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ), рдФрд░ рд╕рджрд╕реНрдпреЛрдВ рдХреЗ рдкреБрди: рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХреЗ рд▓рд┐рдП рднреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдореИрдВрдиреЗ рдпрд╣рд╛рдВ рдЬрд┐рд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИ, рд╡рд╣ ES6 Map рдСрдмреНрдЬреЗрдХреНрдЯ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ, рдпрджрд┐ рдЙрдкрд▓рдмреНрдз рд╣реЛ, рддреЛ рдЧреБрдгреЛрдВ рдХреА рд╕реВрдЪреА рдХреЛ рдХреИрд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП:

let propertyNameCache: Map<any, string[]>;

function getAllPropertyNames(obj: any): string[] {

    let scanAllPropertyNames = (): string[] => {
        let propertyNames: string[] = [];

        while (obj != null) {
            Array.prototype.push.apply(propertyNames, Object.getOwnPropertyNames(obj));
            obj = Object.getPrototypeOf(obj);
        }

        return propertyNames;
    }

    if (typeof Map === "function") {
        if (propertyNameCache === undefined)
            propertyNameCache = new Map<any, string[]>();

        let names = propertyNameCache.get(obj);

        if (names === undefined) {
            names = scanAllPropertyNames();
            propertyNameCache.set(obj, names);
        }

        return names;
    }
    else {
        return scanAllPropertyNames();
    }
}

function memberNameof(container: any, member: any): string {
    if (container == null || (typeof container !== "function" && typeof container !== "object"))
        throw new TypeError("memberNameof only works with non-null object or function containers");

    if (member == null || (typeof member !== "function" && typeof member !== "object"))
        throw new TypeError("memberNameof only works with non-null object or function values");

    for (let propName of getAllPropertyNames(container))
        if (container[propName] === member)
            return propName;

    throw new Error("A member with the given value was not found in the container object or any of its prototypes");
}

рдЙрдкрдпреЛрдЧ рдЙрджрд╛рд╣рд░рдг:

class Base {
    dcba = {};
}

class Example extends Base {
    abcd = {};
}

let example = new Example();
console.log(memberNameof(example, example.abcd)); // prints "abcd"
console.log(memberNameof(example, example.dcba)); // prints "dcba"

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

@RyanCavanaugh рд╡реИрдХрд▓реНрдкрд┐рдХ рд▓реЗрдмрд▓ рд╕реБрдЭрд╛рд╡реЛрдВ рдкрд░ рдХрд╛рдо 95% рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдореИрдВрдиреЗ рд▓рдЧрднрдЧ рд╕рднреА рдореМрдЬреВрджрд╛ рд▓реЗрдмрд▓реЛрдВ рдХреЛ рдХрд╡рд░ рдХрд┐рдпрд╛ рд╣реИ (рдЗрд╕рдореЗрдВ рдХрдИ рдШрдВрдЯреЗ рд▓рдЧреЗ рд╣реИрдВ) - рд╕рдмрд╕реЗ рдХрдард┐рди рд▓реЗрдмрд▓ Declined рд▓реЗрдмрд▓ рд╣реА рдирд┐рдХрд▓рд╛ :) рдЗрд╕рд▓рд┐рдП рдЗрд╕рдореЗрдВ рдХреБрдЫ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рдкреНрддрд╛рд╣ рдпрд╛ рдорд╣реАрдиреЗ рднреА рд▓рдЧ рд╕рдХрддреЗ рд╣реИрдВред

<memberof MyType>"SomeMember"

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

рд╕реА # рдореЗрдВ рдЖрдк рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ var рд╕рдВрдкрддреНрддрд┐рдирд╛рдо = nameof(MyType.SomeMember)

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рджреЛрдиреЛрдВ рдирд╛рдо рдФрд░ рд╕рджрд╕реНрдп рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред рд╕рджрд╕реНрдп рдкреНрд░рдХрд╛рд░ рдПрдиреЛрдЯреЗрд╢рди рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реИ, рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╕рджрд╕реНрдпреЛрдВ рдХреЗ рдирд╛рдо, рдЪрд░, рдлрд╝рдВрдХреНрд╢рди рдкреИрд░рд╛рдореАрдЯрд░, рдХрдХреНрд╖рд╛рдПрдВ, рдЗрдВрдЯрд░рдлреЗрд╕, рдиреЗрдорд╕реНрдкреЗрд╕ рдЗрддреНрдпрд╛рджрд┐ рдХреЗ рдирд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╛рдо ...

рддреЛ рдореБрдЭреЗ рд╕рдордЭ рдирд╣реАрдВ рдЖрдпрд╛ - рдХреНрдпрд╛ рдХреЛрдИ рдирд╛рдо рдХрд╛ рдСрдкрд░реЗрдЯрд░ рд╣реЛрдЧрд╛ рдпрд╛ рдирд╣реАрдВ? рдХреНрдпреЛрдВрдХрд┐ рдЯрд┐рдХрдЯ рдмрдВрдж рд╣реИ рд▓реЗрдХрд┐рди рдХрдореЗрдВрдЯ рдЖрддреЗ рд░рд╣рддреЗ рд╣реИрдВ :)

рдЬрдм рдореИрдВрдиреЗ рдЗрд╕рдХреА рдЦреЛрдЬ рдХреА рддреЛ рдореИрдВ рдпрд╣рд╛рдВ рдкрд╣реБрдВрдЪрд╛: TypeScript CallerMemberName

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

рдХреНрдпрд╛ рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдЕрд▓рдЧ рдореБрджреНрджрд╛ рд╣реИ, рдпрд╛ рдЗрд╕реЗ рдРрд╕рд╛ рд╣реА рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ?

@DaveEmmerson рдпрд╣ рдПрдХ рдЕрд▓рдЧ рд╡рд┐рд╖рдп рд╣реИред CallerMemberName рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рд░рди-рдЯрд╛рдЗрдо рдкрд░ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдПрдХ рдЪрд░ рдирд╛рдо рдХреЗ _compile-time_ рдмрд░реНрди-рдЗрди рдХреЗ рд▓рд┐рдП рд╣реИ, рдЬреЛ рд░рди-рдЯрд╛рдЗрдо рдкрд░ рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реИред

@styfle рдЕрдЧрд░ рдЖрдк рдЙрд╕ рдзрд╛рдЧреЗ рдХреЛ рдкрдврд╝рддреЗ рд╣реИрдВ рддреЛ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд▓рдЧрд╛рддрд╛рд░ рд░рдирдЯрд╛рдЗрдо рдкрд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдореИрдВ C# рдореЗрдВ CallerMemberName рдЬреИрд╕реЗ рд╕рдВрдХрд▓рди рд╕рдордп рдФрд░ рдирд╛рдо рдХреА рддрд░рд╣ рдмрд╛рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдореИрдВ рдЙрдиреНрд╣реЗрдВ рдПрдХ рд╕рдорд╛рди рддрдВрддреНрд░ рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦрддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдЧрд░ рдпрд╣ рдореБрджреНрджрд╛ рдЕрдкрдиреЗ рдЕрдВрдд рддрдХ рдкрд╣реБрдВрдЪ рдЧрдпрд╛ рд╣реИ рддреЛ рдЗрд╕рдХрд╛ рдПрдХ рд╕рдорд╛рди рдирд┐рд╖реНрдХрд░реНрд╖ рд╣реЛрдЧрд╛ред

рдмрд╕ рдПрдХ рдЦреНрдпрд╛рд▓ рдерд╛... :)

рдореБрдЭреЗ рдпрд╣ рдЕрдирд┐рдЪреНрдЫрд╛ рднреА рдирд╣реАрдВ рдЖрддреА

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

рдореИрдВрдиреЗ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдПрдХ рдмреЗрдмреЗрд▓ рдкреНрд▓рдЧрдЗрди рдХреЗ рд╕рд╛рде рд╣рд▓ рдХрд┐рдпрд╛: https://github.com/enoshixi/babel-plugin-nameof

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

рдХреНрдпрд╛ рдЙрд╕ рдмреЗрдмреЗрд▓ рдкреНрд▓рдЧрдЗрди рдХреЛ TS рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдПрдХ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИ?

рдореЗрд░рд╛ рдЙрдкрдпреЛрдЧ-рдорд╛рдорд▓рд╛ рдПрдХ рдлреЙрд░реНрдо рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдпрд╛ рд╣реИред рдореИрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЬреИрд╕реЗ рд░рд┐рдлреИрдХреНрдЯрд░рд┐рдВрдЧ-рд╕рдВрдЧрдд рдФрд░ рд╕рдВрдХрд▓рди-рд╕рдордп-рдЬрд╛рдВрдЪ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ:

// Press F2 to rename properties:
let myObj = { firstName: "John", enableTLAFeature: true, uglyPropName: "" }; 
let myForm = new Form( [ 
  new TextBox  ( myObj, nameof( myObj.firstName ), { required: true, maxLength: 20 } ), 
  new Checkbox ( myObj, nameof( myObj.enableTLAFeature ) ),
  new TextBox  ( myObj, nameof( myObj.uglyPropName ), { label: "Better Label" } )
] );

рдШрдЯрдХ рдирд┐рд░реНрдорд╛рддрд╛ рд╡рд╕реНрддреБ, рд╕рдВрдкрддреНрддрд┐ рдХрд╛ рдирд╛рдо (рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд░реВрдк рдореЗрдВ), рдФрд░ рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╡рд┐рдХрд▓реНрдк рд╡рд╕реНрддреБ рд▓реЗрддреЗ рд╣реИрдВред

рд╡реЗ рдлреЙрд░реНрдо рдШрдЯрдХ рд╕рдВрдкрддреНрддрд┐ рдХреЛ рдкрдврд╝рдиреЗ рдФрд░ рд▓рд┐рдЦрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдВрдЧреЗ (obj [propName] рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ) рдФрд░ рд╡рд┐рдХрд▓реНрдк рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдХреЛрдИ рднреА рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд┐рдП рдЬрд╛рдиреЗ рдкрд░ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдбрд┐рд╕реНрдкреНрд▓реЗ рд▓реЗрдмрд▓ рдЙрддреНрдкрдиреНрди рдХрд░рддреЗ рд╣реИрдВ (рдкреНрд░рддреНрдпреЗрдХ рдШрдЯрдХ рдореЗрдВ рд▓реЗрдмрд▓ рдХрд╛ рдкреНрд░рддрд┐рдкрд╛рджрди рд╢рд╛рдорд┐рд▓ рд╣реЛрддрд╛ рд╣реИ)ред рдореИрдВ рд╕рдВрдкрддреНрддрд┐ рдХреЗ рдирд╛рдо рдХреЛ рдПрдХ рд╕рд╣рд╛рдпрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдПрдХ рдлреЙрд░реНрдо рд▓реЗрдмрд▓ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред рдлрд╝рдВрдХреНрд╢рди рдкрд╣рд▓реЗ рдЕрдХреНрд╖рд░ рдХреЛ рдЕрдкрд░ рдХреЗрд╕ рдореЗрдВ рдХрдирд╡рд░реНрдЯ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рд▓реЛрдЕрд░ рдХреЗрд╕ рд▓реЗрдЯрд░ рдХреЗ рдмрд╛рдж рдПрдХ рд╕реНрдкреЗрд╕ рдбрд╛рд▓рддрд╛ рд╣реИ рдЬрдм рдЕрдкрд░ рдХреЗрд╕ рд▓реЗрдЯрд░ рдХреЗ рдмрд╛рдж рдФрд░ рдХрд┐рд╕реА рднреА рдЕрдкрд░ рдХреЗрд╕ рд▓реЗрдЯрд░ рд╕реЗ рдкрд╣рд▓реЗ рд▓реЛрдЕрд░ рдХреЗрд╕ рд▓реЗрдЯрд░ рдХреЗ рдмрд╛рдж рд╣реЛрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, "рдлрд░реНрд╕реНрдЯрдирд╛рдо" "рдлрд░реНрд╕реНрдЯ рдиреЗрдо" рдмрди рдЬрд╛рддрд╛ рд╣реИ рдФрд░ "enableTLAFeature" "рд╕рдХреНрд╖рдо рдЯреАрдПрд▓рдП рдлреАрдЪрд░" рдмрди рдЬрд╛рддрд╛ рд╣реИред (рдпрджрд┐ рд╣рдореЗрдВ рдПрдХ рдмреЗрд╣рддрд░ рд▓реЗрдмрд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЗрд╕реЗ рд╡рд┐рдХрд▓реНрдк рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред)

рдиреЛрдЯ: рдиреЗрд╕реНрдЯреЗрдб рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдиреЗрд╕реНрдЯреЗрдб рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдкрд╣рд▓реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдореЗрдВ рдкрд╛рд╕ рдХрд░рддрд╛ рд╣реВрдВ, рдЬреИрд╕реЗ myObj.address рдФрд░ рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ nameof(myObj.address.city) рдХреЛ рдХрдВрдкрд╛рдЗрд▓-рдЯрд╛рдЗрдо рдкрд░ "city" рдореЗрдВ рдХрдирд╡рд░реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ (I рдореИрдВ рдШрдЯрдХреЛрдВ рдХреЗ рднреАрддрд░ рд╕рдВрдкрддреНрддрд┐ рдкрде рдиреЗрд╡рд┐рдЧреЗрд╢рди рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдЬрдЯрд┐рд▓ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╕рдорд░реНрдерди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ)ред рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде, myObj, рдкрддрд╛ рдФрд░ рд╢рд╣рд░ рдХрд╛ рдирд╛рдо рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдЙрдкрд░реЛрдХреНрдд рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рдЖрд╕рд╛рди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП (рдмрд╕ рдЕрдВрддрд┐рдо рдкреНрд░рддреАрдХ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░реЗрдВ рдФрд░ рдЙрд╕рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдЙрджреНрдзрд░рдг рдбрд╛рд▓реЗрдВ)ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдПрдХ рдиреБрдХрд╕рд╛рди рдпрд╣ рд╣реИ рдХрд┐ рдореЗрд░реЗ рдкрд╛рд╕ рдЧреБрдгреЛрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░рдХрд╛рд░ рдХреА рд╕реБрд░рдХреНрд╖рд╛ рдирд╣реАрдВ рд╣реЛрдЧреА, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рдХрд┐ myObj.enableTLAFeature рдПрдХ рдмреВрд▓рд┐рдпрди рд╣реИред рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдХреИрд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдП, рд▓реЗрдХрд┐рди рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреЙрд▓ рд╕рд╛рдЗрдЯ рдХреЛ рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рд╕рдВрдкрддреНрддрд┐ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВ (рд▓реЗрдмрд▓ рдХреЛ рдкрдврд╝рдиреЗ, рд▓рд┐рдЦрдиреЗ рдФрд░ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рдкреНрд░рдпреЛрдЬрдиреЛрдВ рдХреЗ рд▓рд┐рдП)ред рдпрджрд┐ рдХреЗрд╡рд▓ myObj.enableTLAFeature (рдмреВрд▓рд┐рдпрди рдХреЗ рд░реВрдк рдореЗрдВ рдФрд░ рдСрдкрд░реЗрдЯрд░ рдХреЗ рдирд╛рдо рдХреЗ рдмрд┐рдирд╛) рдкрд╛рд╕ рдХрд░рдирд╛ рд╕рдВрднрд╡ рдерд╛ рдФрд░ рдлрд┐рд░ рдШрдЯрдХ рдХрдиреНрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЗ рднреАрддрд░ callsitenameof рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ ("enableTLAFeature" рд▓реМрдЯрд╛ рд░рд╣рд╛ рд╣реИ рдФрд░ рдХрдиреНрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдкреИрд░рд╛рдореАрдЯрд░ рдирд╛рдо рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ рдЬреИрд╕реЗ "рдкреНрд░реЛрдкрдирд╛рдо"), рддреЛ рдпрд╣ рд╢рд╛рдирджрд╛рд░ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдпрд╣ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛ рдпрд╛ рдирд╣реАрдВред

рдРрд╕рд╛ рдХреБрдЫ рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

nameof<Foo> рдкреНрд░рдХрдЯ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП (рд╕рднреА рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдФрд░ рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП) "Foo" рдЗрд╕ рддрд░рд╣ рд╕рдВрдХрд▓рдХ/рдПрдорд┐рдЯрд░ рдмрд╕ рдЗрд╕реЗ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЛрдЪ рд╕рдХрддрд╛ рд╣реИред

рд▓реЗрдХрд┐рди nameof<T> рдЬреЛ рдЯреНрд░реИрдХ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ T рдХреНрдпрд╛ рд╣реИ, DI рдХрдВрдЯреЗрдирд░реЛрдВ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

registerConstant<T>(instance:T){
   this.container[nameof<T>] = instance;
}

рддреЛ рдЖрдк рдЖрдИрдУрд╕реА рдХреЗ рд▓рд┐рдП рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

рдмрдВрдзрди:
ioc.registerConstant<IFoo>(new Foo());

рдЗрдВрдЬреЗрдХреНрд╢рди рд▓рдЧрд╛рдирд╛:

constructor(@inject(nameof<IFoo> foo:IFoo){... }

рдореИрдВрдиреЗ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЫреЛрдЯрд╛ рдкреНрд░рдпреЛрдЧрд╛рддреНрдордХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдмрдирд╛рдпрд╛: https://github.com/dsherret/ts-nameof

рдпрд╣ рдЕрднреА рднреА рдПрдХ рдХрд╛рд░реНрдп рдкреНрд░рдЧрддрд┐ рдкрд░ рд╣реИред рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдпрджрд┐ рдЖрдк рдХрд┐рд╕реА рдХреЛ рднреА рд╕реБрдЭрд╛рд╡ рджреЗрддреЗ рд╣реИред

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

@MeirionHughes : рдпрд╣ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдХреИрд╕реЗ рдЕрдиреБрд╡рд╛рдж рдХрд░реЗрдЧрд╛?
рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рдЗрд╕ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ рд╡рд┐рдХрд▓реНрдк рд╕реЗ рдмрд╣реБрдд рдмреЗрд╣рддрд░ рд╣реИ:
ioc.registerConstant(nameof(IFoo), new Foo());

рдХрд┐рд╕реА рд╕рдВрдкрддреНрддрд┐ рдпрд╛ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдирд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ (рдЪрд░реНрдЪрд╛ рдХрд╛ рдореВрд▓ рд╡рд┐рд╖рдп) рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдирд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдЬреИрд╕рд╛ рдирд╣реАрдВ рд╣реИ, рдЗрд╕ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:

  • nameof<[]> - рдЗрд╕рдХрд╛ рдирд╛рдо рдХреНрдпрд╛ рд╣реИ?
  • nameof<{ coolStuff: MyType & MyOtherType & MyFavoritType | undefined | null | SomethingCompleteltyDifferent<Dictionary<string, Promise<Optional<PleaseStop>>[]>>; }>
  • nameof<string | number> рдмрдирд╛рдо nameof<number | string>

рд╕рд╛рде рдЪрд▓рдиреЗ рджреЛ

  • nameof<string> рдмрдирд╛рдо nameof<"string">

рдпрд╣ рднреА рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ:

  • type N = number; nameof<number | N | number>

рд░реБрдХреЛ рд░реБрдХреЛ, рдпрд╣рд╛рдБ рдФрд░ рд╣реИ:

function helloEarthings<a, b, c extends a<b>>(one: number, two? = new class { hi = 'how are you?'  }, ...blah: MyMegaControl<typeof someOtherValueIJustMadeUp>[]) {
}
nameof<typeof helloEarhlings>
  • рдЧреБрдгреЛрдВ рдХреЗ рдирд╛рдо рдХрд╛ рдХреНрд░рдо:
nameof<{
    shouldWeGoLexical: 'hm'
    orAlphabetical: 'hm'
}>

@ рдПрд▓реЗрдХреНрд╕реА-рдмрд╛рдпрдХреЛрд╡ рдЙрди рд╕рднреА рдХрд╛ рдЙрддреНрддрд░ рд╕рдЪрдореБрдЪ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рдХрд╛рд░ рд╣реИ; рдХреНрдпрд╛ рдХрд┐рд╕реА рдХрд╛рдо рдХрд╛ рд╣реИ рдпрд╣ рдПрдХ рдЕрд▓рдЧ рдорд╛рдорд▓рд╛ рд╣реИ - рдпрд╣ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдкреНрд░рдХрд╛рд░ рдЬреЗрдПрд╕ рдореЗрдВ рдПрдХ рдореВрд░реНрдд рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред

@MeirionHughes рдЖрдк рд╕рдордЭрддреЗ рд╣реИрдВ рдХрд┐ рдПрдХ рдкреНрд░рдХрд╛рд░ рдЬреИрд╕рд╛ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ (рдПрдПрд╕рдЯреА рдореЗрдВ) рд╡реИрд╕рд╛ рдирд╣реАрдВ рд╣реИ рдЬреИрд╕рд╛ рдЗрд╕реЗ рдкрдврд╝рд╛ рдЧрдпрд╛ рдерд╛, рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рджреНрд╡рд╛рд░рд╛ рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХреА рдЧрдИ рдереА, рд╣реИ рдирд╛?

рдЙрджрд╛рд╣рд░рдг:

const myVariable = 'hey';
type A = typeof myVariable
type B = 'hey';

nameof<A> === nameof<B> // <-- ???
nameof<typeof myVariable> === nameof<A> // <-- ???
nameof<'hey'> === nameOf<A> === nameof<typeof myVariable> // <-- ???

@ рдПрд▓реЗрдХреНрд╕реА-рдмрд╛рдпрдХреЛрд╡: рдирд╛рдореЛрдлрд╝ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЕрдирд╛рдо рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЖрдк рдХрд┐рд╕реА рдРрд╕реА рдЪреАрдЬ рдХрд╛ рдирд╛рдо рдирд╣реАрдВ рд▓реЗ рд╕рдХрддреЗ рдЬрд┐рд╕рдХрд╛ рдХреЛрдИ рдирд╛рдо рдирд╣реАрдВ рд╣реИред

  • nameof(Array) -> "рд╕рд░рдгреА"
  • nameof([]) -> рд╕рдВрдХрд▓рдХ рддреНрд░реБрдЯрд┐
  • let arr = []; nameof(arr) -> "рдЧрд┐рд░рдлреНрддрд╛рд░реА"
  • nameof(string) -> "рд╕реНрдЯреНрд░рд┐рдВрдЧ"
  • nameof(String) -> "рд╕реНрдЯреНрд░рд┐рдВрдЧ"
  • nameof("string") -> рд╕рдВрдХрд▓рдХ рддреНрд░реБрдЯрд┐
  • type N = number; nameof(N) -> "рдПрди"
  • nameof(number | N | number) -> рд╕рдВрдХрд▓рдХ рддреНрд░реБрдЯрд┐
  • nameof({ coolStuff: MyType }) -> рд╕рдВрдХрд▓рдХ рддреНрд░реБрдЯрд┐

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП:

  • nameof(Array.length) -> "рд▓рдВрдмрд╛рдИ"
  • let arr = []; nameof(arr.length) -> "рд▓рдВрдмрд╛рдИ"
  • interface IPerson { firstName: string }; nameof(IPerson.firstName) -> "рдлрд░реНрд╕реНрдЯрдирд╛рдо";
  • let arr: Array<IPerson> nameof(arr[0].firstName) -> "рдлрд░реНрд╕реНрдЯрдирд╛рдо"

рдпрд╣ рд╕рдм рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕реА # рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЬреАрд╡рди рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдпрд╣ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдореИрдВ JSX рд╕рдореНрдорд╛рди рдореЗрдВ рд╕рдВрдШрд░реНрд╖ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП nameof() рдиреЛрдЯреЗрд╢рди рдХреЛ nameof<> рд╕реЗ рдЕрдзрд┐рдХ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВред рдЯреАрдПрд╕рдПрдХреНрд╕ред рдпрд╣ рд╢рд╛рдпрдж рд╕рдмрд╕реЗ рдЖрдо рдкрд░рд┐рджреГрд╢реНрдп рд╣реЛрдЧрд╛:

<input name={nameof(this.state.firstName)} />

@Liero , рд╕реА # рдХреЗ рд╕рд╛рде рд╕рдорд╛рдирддрд╛ рдХрд╛ рдкрд╛рд▓рди рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ рдХреНрдпреЛрдВрдХрд┐, рд╡реЗ 2 рдЕрд▓рдЧ-рдЕрд▓рдЧ рднрд╛рд╖рд╛рдПрдВ рд╣реИрдВ: рд╕реА # рдореЗрдВ рдпреВрдирд┐рдпрди рдФрд░ рдЪреМрд░рд╛рд╣реЗ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдЧреИрд░-рд╕реНрдерд╛рдиреАрдп рдЕрдЬреНрдЮрд╛рдд рдкреНрд░рдХрд╛рд░ рдирд╣реАрдВ рд╣реИрдВ, рдЯреАрдПрд╕ рдХреЗ рд▓рд┐рдП рдпрд╣ рд╕рдм рд░реЛрдЯреА рдФрд░ рдордХреНрдЦрди рд╣реИ

рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЕрдВрддрд┐рдо рдирд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдпреЛрдЧреНрдпрддрд╛ рдХреНрдпрд╛ рд╣реИ рдЬрд┐рд╕ рдкрд░ рдПрдХ рдкреНрд░рдХрд╛рд░ рдкрдВрдЬреАрдХреГрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЯреАрдПрд╕ рдореЗрдВ рдХреЗрд╡рд▓ 40% рдорд╛рдорд▓реЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рдЗрд╕ рддрд░рд╣ рдХреЗ рдкреНрд░рд╢реНрди рд╡рд┐рднрд┐рдиреНрди рдЕрдЬреНрдЮрд╛рдд рдкреНрд░рдХрд╛рд░ рдХреЗ рднрд╛рд╡реЛрдВ рдХреЗ рдХрд╛рд░рдг рднреА рд╕рдордЭ рдореЗрдВ рдЖрддреЗ рд╣реИрдВ

рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд:

  • interface A { x: number; }
  • interface B extends A {}
  • type C = B;
  • type D = A;
  • type E = C | D

рдЯреАрдПрд╕ рдореЗрдВ рд╕рднреА 100% рдПрдХ рд╣реА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╣реИрдВ (рд╕рдВрд░рдЪрдирд╛рддреНрдордХ рдЯрд╛рдЗрдкрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж), рдореБрдЭреЗ рдЙрдиреНрд╣реЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдирд╛рдореЛрдВ (рдЖрдкрдХреЗ рдЕрдиреБрд╕рд╛рд░) рдХреЗ рддрд╣рдд рджреЗрдЦрдиреЗ рд╕реЗ рдХреИрд╕реЗ рдлрд╛рдпрджрд╛ рд╣реЛрдЧрд╛?

@ рдЕрд▓реЗрдХреНрд╕реА-рдмрд╛рдпрдХреЛрд╡
nameof() рдкреНрд░рдХрд╛рд░ рдкрд░ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдкреЙрдЗрдВрдЯрд░реНрд╕ рдкрд░ рдЕрдзрд┐рдХрддрд░ рдпрджрд┐ рди рдХреЗрд╡рд▓ред рд╣рдореЗрдВ рдЙрд╕ рд╕реВрдЪрдХ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреА рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рд╣реИ, рдореБрдЭреЗ рдмрд╕ рдЗрд╕рдХрд╛ рдирд╛рдо рдЪрд╛рд╣рд┐рдПред

const a: { what: string;}
const b: { what: number;}
const c: { what: any;}
const d: { what: undefined;}
const e: { what: never;}
const f: { what: {};}
const g: { what: typeof a;}
const h: { what: typeof b | typeof c;}
const i: { what: Whatever | You | Need | Ever;}

nameof(a.what) == 'what';
nameof(b.what) == 'what';
nameof(c.what) == 'what';
nameof(d.what) == 'what';
nameof(e.what) == 'what';
nameof(f.what) == 'what';
nameof(g.what) == 'what';
nameof(h.what) == 'what';
nameof(i.what) == 'what';

// they're all the same, regardless of the type

рдЕрдм, рдпрджрд┐ рдЖрдк nameof() рдПрдХ рдкреНрд░рдХрд╛рд░ рдкреВрдЫрдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдореИрдВ @Liero рд╕реЗ рд╕рд╣рдордд

рдореБрдЭреЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ nameof рдХрд╛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдореВрд▓реНрдп рд░рди рдЯрд╛рдЗрдо рдкрд░ рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдореЗрдВ рдирд╣реАрдВ рд╣реИ, рдмрд▓реНрдХрд┐ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЕрдХреНрд╖рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдкреНрд░рдХрд╛рд░ рдХреА рд╕реБрд░рдХреНрд╖рд╛ рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдореИрдВ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдПрдХ рдмреЗрдмреЗрд▓ рдкреНрд▓рдЧрдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдЬреЛ nameof рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд░рд╣рд╛ рд╣реИ; рдпрд╣рд╛рдБ рдореЗрд░реЗ рд▓рд┐рдП рдПрдХ рдмрд╣реБрдд рд╣реА рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрдкрдпреЛрдЧ рдХрд╛ рдорд╛рдорд▓рд╛ рд╣реИ (React рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЗрд╕рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реВрдБ рдЗрд╕рд▓рд┐рдП рдпрд╣ рдореЗрд░реЗ рджрд┐рдорд╛рдЧ рдореЗрдВ рддрд╛рдЬрд╝рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрд╡рдзрд╛рд░рдгрд╛ рдХрд╣реАрдВ рдФрд░ рд▓рд╛рдЧреВ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ):

interface FooBar {
  foo: string;
  bar: string;
}

interface Props {
  value: FooBar;
  onChange(value: FooBar) => void;
}

const FooBarControl = (props: Props) => {
  const handleChange = (event: React.FormEvent, name: string) => {
    const { value } = event.currentTarget as HTMLInputElement;
    const newValue = Object.assign({}, props.value, { [name]: value });
    props.onChange(newValue);
  };

  return (
    <div>
      <input value={props.foo} onChange={e => handleChange(e, nameof(props.foo))}/>
      <input value={props.bar} onChange={e => handleChange(e, nameof(props.bar))}/>
    </div>
  );
};

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

@ рдПрд▓реЗрдХреНрд╕реА-рдмрд╛рдпрдХреЛрд╡: рдирд╛рдореЛрдлрд╝ рдСрдкрд░реЗрдЯрд░ рд╕реЗ рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рди рдХрд░реЗрдВред рдпрд╣ рдПрдХ рднрдпрд╛рдирдХ рдЧрд▓рддреА рд╣реЛрдЧреАред рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ type N = number; nameof(N) рдореЗрдВ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рди рд╣реЛрдВ, рд▓реЗрдХрд┐рди рд╕реНрдкрд╖реНрдЯрддрд╛ рдФрд░ рд╕реНрдерд┐рд░рддрд╛ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдПрдХрджрдо рд╕рд╣реА рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред if(true){} рднреА рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЙрдкрдпреЛрдЧ рдХрд╛ рдорд╛рдорд▓рд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдк рдЗрд╕реЗ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред

@fredgalvao рдЖрдк рдЧреБрдгреЛрдВ рдХреЗ рдирд╛рдореЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд░рдЦрддреА рд╣реИ рдФрд░ рдореИрдВ рдЙрд╕ рдкрд░ рдЖрдкрдХреЗ рд╕рд╛рде рд╣реВрдВ

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

2 рдЕрд▓рдЧ-рдЕрд▓рдЧ рдбреЛрдореЗрди рд╣реИрдВ рдЬрд┐рдирд╕реЗ TS рдбреАрд▓ рдХрд░рддрд╛ рд╣реИ:

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

рдЕрднреА

  • рдореВрд▓реНрдпреЛрдВ рдХреЗ рдирд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╕рд╣реА рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЙрдирдХрд╛ рдорддрд▓рдм рдЬреЗрдПрд╕ рдореЗрдВ рдЪреАрдЬреЗрдВ рд╣реИрдВ
  • рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдирд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдкрд░рд┐рдгрд╛рдореА JS рдореЗрдВ рдРрд╕рд╛ рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдирд╕реЗ рдХреЛрдИ рд▓реЗрдирд╛-рджреЗрдирд╛ рд╣реЛ

рдХреЛ рдЫреЛрдбрд╝рдХрд░... рдХрдХреНрд╖рд╛рдПрдВ!

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

рдЧреБрдгреЛрдВ, рдХрд╛рд░реНрдпреЛрдВ, рдЪрд░ рдЬреИрд╕реЗ рд╕рднреА рддреБрдЪреНрдЫ рдореВрд▓реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрдХреНрд╖рд╛рдПрдВ nameof рдСрдкрд░реЗрдЯрд░ рдХреЗ рдЕрдзреАрди рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП

@ рдПрд▓реЗрдХреНрд╕реА-рдмрд╛рдпрдХреЛрд╡: рдпрд╣ рдЪрд░реНрдЪрд╛ рдХрд╛ рд╡рд┐рд╖рдп рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдХрдХреНрд╖рд╛ рдХреЗ рдирд╛рдо рдХреЗ рд╕рд╛рде рдирд╛рдо рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд╛ рдорд╛рдорд▓рд╛ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИ:

describe(nameof(Person)) {
   it(nameof(Person.sayHello) + `() should say "Hello!"`, function() {
      expect(new Person().sayHello()).toBe("Hello!");
   });
}

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

рдПрдлрд╡рд╛рдИрдЖрдИ, рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╕реА # рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:

class A {}
nameof(A)
"A"
using B = A;
nameof(B)
"B"

рдХреЛрдИ рдмрд╛рдд рдирд╣реАрдВ рдХреНрдпрд╛ рдХрднреАред

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

@Liero рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдХреЛрдИ рд╕рд╡рд╛рд▓ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХрдХреНрд╖рд╛рдУрдВ рдХреЛ nameof рд▓рд┐рдП рдПрдХ рд╡рд┐рд╖рдп рдмрдирд╛рдпрд╛ рдЬрд╛рдП, рдХреНрдпреЛрдВрдХрд┐ рдХрдХреНрд╖рд╛рдПрдВ рдореВрд▓реНрдп рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ рд╡рд╣рд╛рдВ рд░рд╣рдиреЗ рджреЗрдирд╛ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд╣реИ, рдореБрдЭреЗ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рджрд┐рдЦрддреА рд╣реИ

@ YipYipX4 рдореИрдВрдиреЗ рдЖрдкрдХреЛ рд╕реБрдирд╛ рд╣реИ, рд╕рдВрдкрддреНрддрд┐рдпреЛрдВ рдХрд╛ рдЬрдиреНрдо nameof , рдЗрд╕рд▓рд┐рдП рдЪрд┐рдВрддрд╛ рди рдХрд░реЗрдВ, рд╡реЗ рдирд╛рдо рдпреЛрдЧреНрдп рд╣реЛрдВрдЧреЗ

рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдирд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдкрд░рд┐рдгрд╛рдореА JS рдореЗрдВ рдРрд╕рд╛ рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдирд╕реЗ рдХреЛрдИ рд▓реЗрдирд╛-рджреЗрдирд╛ рд╣реЛ

рдЬреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдмрд┐рдВрджреБ рд╣реИ; рдЗрдВрдЯрд░рдлреЗрд╕ рдореЗрдВ рд░рди-рдЯрд╛рдЗрдо рдЙрдкрд╕реНрдерд┐рддрд┐ рдмрд┐рд▓реНрдХреБрд▓ рдирд╣реАрдВ рд╣реИ ... рдЬреЛ рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реИ, рдЦрд╛рд╕рдХрд░ рдпрджрд┐ рдЖрдк рдкреНрд░рддрд┐рдмрд┐рдВрдм рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдирд┐рдпрдВрддреНрд░рдг рдореЗрдВ рдЙрд▓рдЯрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред

рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ рдХрд┐ рдХреИрд╕реЗ рдЗрдирд╡рд░реНрд╕рд┐рдлрд╛рдИ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХрд░ рд░рд╣рд╛ рд╣реИ

рдореВрд▓ рд░реВрдк рд╕реЗ рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ interface IFoo рд╣реИ рддреЛ рдЖрдкрдХреЛ рдХрд╣реАрдВ рднреА "IFoo" рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рддрд╛рдХрд┐ рдЬрдм рдЖрдк рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ рддреЛ рдЖрдкрдХреЗ рдкрд╛рд╕ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдореВрд▓реНрдп рд╣реЛред рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдирд╛рдо рд░рдЦрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рдирд╛рддреЗ (nameof рдЬреИрд╕реА рдХрд┐рд╕реА рдЪреАрдЬрд╝ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЙрддреНрд╕рд░реНрдЬрд┐рдд рд╣реЛрдирд╛ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ рдХрд┐ рдЕрдкрд╡рд░реНрддрди рдЙрди рдкреНрд░рддреАрдХреЛрдВ рдХреЛ рдирд╣реАрдВ рддреЛрдбрд╝рддрд╛ рд╣реИред

рддреЛ рдЙрд▓рдЯрд╛ рдЙрджрд╛рд╣рд░рдг рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЖрдк рдпрд╣ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

public constructor(
  @inject(nameof(Katana)) katana: Katana,
  @inject(nameof(Shuriken)) shuriken: Shuriken
)

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

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

  • рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╡рд╕реНрддреБ рдХреЗ рд▓рд┐рдП рдПрдХ рд░рдирдЯрд╛рдЗрдо рдЕрдкреЗрдХреНрд╖рд╛ рдФрд░
  • рдХреЛрдб рдХрд╛ рдПрдХ рдЯреБрдХрдбрд╝рд╛ рдЬреЛ рдЕрдкреЗрдХреНрд╖рд┐рдд рд╡рд╕реНрддреБ рдкреНрд░рджрд╛рди рдХрд░рдХреЗ рдЗрд╕ рдЕрдкреЗрдХреНрд╖рд╛ рдХреЛ рдкреВрд░рд╛ рдХрд░рддрд╛ рд╣реИ

рдЯреАрдПрд╕ рдореЗрдВ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдерд╛ рдЬреИрд╕рд╛ рдХрд┐ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдпрд╣ рд╡рд╣ рдирд╣реАрдВ рд╣реИ рдЬреЛ рд╡реЗ рдХрд░рддреЗ рд╣реИрдВ, рдЙрдирдХреЗ рдкрд╛рд╕ рд░рдирдЯрд╛рдЗрдо рдореЗрдВ 0 рд╡реНрдпрд╡рд╕рд╛рдп рд╣реИ

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

рдЕрдкрдиреЗ рдЗрдВрдЬреЗрдХреНрд╢рди рдврд╛рдВрдЪреЗ рдкрд░ рд╡рд╛рдкрд╕ рдпрд╣ рдареАрдХ рд╡реИрд╕реЗ рд╣реА рдХрд╛рдо рдХрд░реЗрдЧрд╛ рдпрджрд┐ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдЙрди рд╕реНрдерд╛рдиреЛрдВ рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╛рджреЗ рддрд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рдерд╛ рдЬреЛ рдЙрд╕ рдкрд░ рдирд┐рд░реНрднрд░ рд╣реИрдВ:

@injectable('one-thing')
class A {}
@injectable('another-thing')
class B {}
class C {
   constructor(
     @inject('one-thing') katana: Katana,
     @inject('another-thing') shuriken: Shuriken
   ) {}
}

@ рдПрд▓реЗрдХреНрд╕реА-рдмрд╛рдпрдХреЛрд╡ рдпрд╣рд╛рдВ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд╛ рдорд╛рдорд▓рд╛ рд╣реИ ред

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

@dsherret

рдореИрдВрдиреЗ рдЗрд╕реЗ рдкрд╣рд▓реЗ рд╣реА рджреЗрдЦ рд▓рд┐рдпрд╛ рд╣реИ, рдзрдиреНрдпрд╡рд╛рдж, TS рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдирд╛рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рд╣рд▓ рдирд╣реАрдВ рд╣реЛрдЧреА , рдЗрд╕ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:

@injectable() 
class Broom extends Broom { sweep(): void {} }

@injectable()
class Katana extends Katana { cut(): void {} }

class Ninja{
    constructor(
        @inject(nameof(Broom)) katana: Katana // <-- did i get my sword yet?
    ) { }
}

рдкреНрд░рд╢рди:

  • рдЗрд╕ рддрд░рд╣ рдХреА рдмреБрд░реА рдЪреАрдЬреЛрдВ рдХреЛ рд╣реЛрдиреЗ рд╕реЗ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП nameof рдХреНрдпрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИ?
  • рдЕрдЧрд░ рдпрд╣ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣ рдХреИрд╕реЗ рд╕рд╛рджреЗ рддрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕реЗ рдмреЗрд╣рддрд░ рд╣реИ "broom" рдХреЗ рдмрдЬрд╛рдп рдХреА рддрд░рд╣ nameof(Broom)?

@ рдПрд▓реЗрдХреНрд╕реА-рдмрд╛рдпрдХреЛрд╡ рдпрд╣ рдЖрдкрдХреЛ "рдЭрд╛рдбрд╝реВ" рдХреЗ рдмрдЬрд╛рдп "рдЭрд╛рдбрд╝реВ" рдХрд░рдиреЗ рд╕реЗ рд░реЛрдХреЗрдЧрд╛;)

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

@dsherret рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рдореИрдВ рдХрд╣реВрдВ рдХрд┐ рдпрд╣ рдкрд░реЗрд╢рд╛рдиреА рдХреЗ рд▓рд╛рдпрдХ рдирд╣реАрдВ рд╣реИ, рдЖрдЗрдП рдЗрд╕реЗ рдереЛрдбрд╝рд╛ рдФрд░ рдЖрдЧреЗ рд▓реЗ рдЬрд╛рдПрдВ, рдЗрд╕рд▓рд┐рдП nameof рдПрдХ рдирдИ рд╕реБрд╡рд┐рдзрд╛ рд╣реИ рдЬреЛ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд▓реЗ рд╕рдХрддреА рд╣реИ, рдореЗрд░реЗ ORM рдврд╛рдВрдЪреЗ рдореЗрдВ рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реИ interface IColumn<TValue> { } , рдЕрдм рдореБрдЭреЗ nameof(Column<number>) рдХрд░рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ рдпрд╣ рдореБрдЭреЗ рдХреНрдпрд╛ рджреЗрдЧрд╛? (рд╕рдВрдХреЗрдд, рдЖрдЬ рдореЗрд░реА рдкрд╣рд▓реА рдЯрд┐рдкреНрдкрдгреА рджреЗрдЦреЗрдВ)

@ рдПрд▓реЗрдХреНрд╕реА-рдмрд╛рдпрдХреЛрд╡ рдореИрдВ рдХрд╣реВрдВрдЧрд╛ рдХрд┐ рдкреНрд░рдХрд╛рд░ рдХреЗ рддрд░реНрдХреЛрдВ рдХреЛ рдмрд╛рд╣рд░ рд░рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП- nameof(Column<number>) "Column" рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЕрдЧрд░ рдХреЛрдИ рдЯрд╛рдЗрдк arg рдЪрд╛рд╣рддрд╛ рдерд╛ рддреЛ рд╡реЗ рдХрд░ рд╕рдХрддреЗ рдереЗ: nameof(number); ред рдореИрдВрдиреЗ рдпрд╣рд╛рдВ рдпрд╣реА рдХрд┐рдпрд╛ред рдпрджрд┐ рдРрд╕рд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЯрд╛рдЗрдк args рд╡рд╛рд▓реЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдирд╛рдо рдЖрд╕рд╛рдиреА рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ ...

рд╕реА#:

     nameof(A.B.C.D);  => "D"  // namespace A.B.C.D 
     nameof(A.B.C.D.IX); => "IX"  // interface IX in namespace A.B.C.D
     nameof(variableName); => "variableName";
     nameof(A.B.C.D.IX<int>); => "IX"  // interface IX<T> in namespace A.B.C.D;
     nameof(instance.Name); => "Name" // property Name of object instance

рдЯрд╛рдЗрдкрдкреНрд░рддрд┐:

     nameof(A.B.C.D); => "D"  // module A.B.C.D
     nameof(A.B.C.D.IX); => "IX" // interface IX in module A.B.C.D
     nameof(variableName) => "variableName";
     nameof(A.B.C.D.IX<number>); => "IX" // interface IX<T> of module A.B.C.D
     nameof(instance.Name); => "Name" // property name of object instance

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

@ рдПрд▓реЗрдХреНрд╕реА-рдмрд╛рдпрдХреЛрд╡ рдореИрдВ рдЖрдкрд╕реЗ рд╕рд╣рдордд рд╣реВрдВ рдХрд┐ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП nameof() рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЧрдбрд╝рдмрдбрд╝ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд╣рдореЗрдВ рдПрдХ рд╕рдВрддреЛрд╖рдЬрдирдХ рд╕рдорд╛рдзрд╛рди/рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд╣рд╛рдВ рдЬрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ 99% рдкрд░рд┐рджреГрд╢реНрдп рд╢рд╛рдорд┐рд▓ рд╣реИрдВред

рд╕рд╛рдорд╛рдиреНрдп рдЪреАрдЬрд╝реЗрдВ

  • рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЬрд╛рдирддреЗ рд╣реИрдВ рдФрд░ рд╕рд╣рдордд рд╣реИрдВ рдХрд┐ рдЧреБрдг/рдлрд╝реАрд▓реНрдб/рдЪрд░ 100% (рдпрд╛ рд╣реЛрдиреЗ рдХреА рдЙрдореНрдореАрдж) рд╢рд╛рдорд┐рд▓ рд╣реИрдВред
  • рд╣рдо рдХрдХреНрд╖рд╛рдУрдВ рдкрд░ nameof() рдХреЛ рд╕реАрдорд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдпрд╣ рд╕рдмрд╕реЗ рддрддреНрдХрд╛рд▓ рдбрд╛рдЙрди-рдж-рдЯреНрд░реА рдкрд░рд┐рднрд╛рд╖рд┐рдд рдиреЛ-рдЯрд╛рдЗрдк-рдкреИрд░рд╛рдореАрдЯрд░ рдирд╛рдо ( Class<TypeParam<What<Is<Going | On>>>> -> "Class" ) рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХреЗред рдореЗрд░рд╛ рдорддрд▓рдм рд╣реИ, рдЕрдЧрд░ рдЖрдк рдЗрд╕реЗ рдкрд╣рдЪрд╛рдирдиреЗ рдпреЛрдЧреНрдп рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдмрд╕ рдЗрд╕реЗ рдЙрдкрдирд╛рдо рджреЗрдВ:
type ClassFromHell = Class<TypeParam<What<Is<Going | On<I | DONT | EVEN>>>>>;

рдЕрднреВрддрдкреВрд░реНрд╡ рдмрд╛рдд

  • рд╣рдо nameof() рдХреЛ рдХрдВрдкрд╛рдЗрд▓-рдЯрд╛рдЗрдк-рдУрдирд▓реА рдЯрд╛рдЗрдк рдПрдХреНрд╕рдкреНрд░реЗрд╢рди (рдЗрдВрдЯрд░рдлреЗрд╕, рдПрдмреНрд╕реНрдЯреНрд░реИрдХреНрдЯ рдХреНрд▓рд╛рд╕реЗрд╕, рдЗрдирд▓рд╛рдЗрди рдбреЗрдлрд┐рдирд┐рд╢рди, рдЯрд╛рдЗрдк рдПрд▓рд┐рдпрд╛рд╕, рдореЙрдбреНрдпреВрд▓ рдбреЗрдлрд┐рдирд┐рд╢рди, рдЖрджрд┐) рдкрд░ рд╕реАрдорд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдКрдкрд░ рдХреА рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдореИрдВрдиреЗ рдЬреЛ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛, рдЙрд╕рдХреЗ рд╕рдорд╛рди рд╕рд░рд▓ рдФрд░ рд╕реАрдорд┐рдд рддрд░реАрдХреЗ рд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред : рдмрд╕ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЗрдирд▓рд╛рдЗрди рдХреЛ рдЖрдЙрдЯрдкреБрдЯ рдХрд░реЗрдВ рдЬрд╣рд╛рдВ рдЗрд╕реЗ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред

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

рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ nameof() рдХреЛ рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреА рдкреНрд░рддреНрдпреЗрдХ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рджреЗрдЦ рд╕рдХрддрд╛, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕реЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЪрд┐рддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рдирд╣реАрдВ рдХрд╣реВрдВрдЧрд╛ред рд▓реЗрдХрд┐рди рдЕрдиреНрдп 99% рдорд╛рдорд▓реЛрдВ рдХреЛ рдЙрд╕ 1% рд╕рдорд╕реНрдпрд╛рдЧреНрд░рд╕реНрдд рд╣реЛрдиреЗ рдХреЗ рдХрд╛рд░рдг рдкрдХрдбрд╝рдирд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рд▓рдЧрддрд╛ рд╣реИред рд╣рдо рдЙрд╕ рдЪреАрдЬрд╝ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХреНрдорд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реЛрдЪрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдХрд┐рд╕реА рдорд╕реМрджреЗ рдпрд╛ рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдХрд╛ рд╕рдЦреНрддреА рд╕реЗ рдкрд╛рд▓рди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдЗрд╕ рддрд░рд╣ рд╣рдо рдЗрд╕ _faulty_ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдореЗрд░реЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рд╕реЗ рд╣реА 10^10*awesome рд╣реИред

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

рдЕрдм рдЬрдм рд╡рд┐рдЪрд╛рд░ рд╕рд░рд▓ рдФрд░ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдФрд░ рдЗрд╕рдХрд╛ рддрддреНрдХрд╛рд▓ рд▓рд╛рдн рд╕рднреА рдХреЗ рд▓рд┐рдП рд╕реНрдкрд╖реНрдЯ рд╣реИ, рдпрд╣ рдПрдХ рдХрд╣рд╛рдиреА рд╣реИ

рддреЛ рдХреЛрдИ рдирд╣реАрдВ рдХрд╣реЗрдЧрд╛? рдареАрдХ рд╣реИ, рдЕрдЧрд░ рд╣рдо рдПрдХ рд╡рд┐рд╢реЗрд╖ interface рдорд╛рдорд▓реЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЬреЛ рдХреЗрд╡рд▓ рдкреНрд░рдХрд╛рд░ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдмрд┐рдирд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдФрд░ рд╣рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирд╣реАрдВ рдЬрд╛рдирддреЗ рдХрд┐ рдЕрдиреНрдп рд╕рднреА рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЕрд╡рдзрд╛рд░рдгрд╛ рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИ, рдЕрдХреЗрд▓реЗ рд░рд╣рдиреЗ рджреЗрдВ рд╕рд╣рдЬ рдЬреНрдЮрд╛рди рдпреБрдХреНрдд, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реИ ...

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

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

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

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

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

рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ nameof рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд▓рд┐рдП рд╣рд▓ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реИ, рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝рдирд╛ рд╣реИ, рддрд╛рдХрд┐:

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

рдереЛрдбрд╝реА рд╕реА рдЕрд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд╕рд╛рде рдЗрд╕реЗ рдЖрдЬ рдЬреИрд╕реЗ рд╣реА рд╕рд╛рджреЗ TS рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

type Wrapper<Type> = string & { '': [Type] };
function toWrapperFor<Type>(name: string) : Wrapper<Type> { return <any>name; }
const associations = {
    one: toWrapperFor<string>('one'),
    another: toWrapperFor<MyMegaControl>('another')
};

// ... later in code

class MyClass<Type>{
    constructor(private wrapper: Wrapper<Type>) {}
    take(value: Type): void { /*...*/ }
    toString(): string { return this.wrapper; }
}

const oneInstance = new MyClass(associations.one); // MyClass<string>
oneInstance.toString(); // 'one'
const anotherInstance = new MyClass(associations.another); // MyClass<MyMegaControl>
anotherInstance.toString(); // 'another'

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

рдХреБрдЫ рдХрд╛рд░рдгреЛрдВ рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП:

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

рдпрд╣реА рдХрд╛рд░рдг рд╣реИрдВ рдХрд┐ рдореИрдВ рдЗрд╕ рд╕рдордп рд╕реЛрдЪ рд╕рдХрддрд╛ рд╣реВрдВред рдпреЗ рдЬрд╝реЛрд░рджрд╛рд░ рдпрд╛ рдЕрд╕рдорд░реНрдерд┐рдд рдХрдерди рдирд╣реАрдВ рд╣реИрдВред

рдореИрдВ рдЙрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдХрд╣реВрдВрдЧрд╛ рдХрд┐ рдХреЗрд╡рд▓ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдФрд░ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЙрдкрдирд╛рдореЛрдВ рдХреА рдЕрдиреБрдорддрд┐ рджреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдП-рдХреЛрдИ рд╕рдВрдШ/рдкреНрд░рддрд┐рдЪреНрдЫреЗрджрди/рд╡рд╕реНрддреБ/рд╕реНрдЯреНрд░рд┐рдВрдЧ/рдЖрджрд┐ рдирд╣реАрдВред рдкреНрд░рдХрд╛рд░ред рд╢рд╛рдпрдж рдХреАрд╡рд░реНрдб (рдЬреИрд╕реЗ number ) рдХреА рднреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдПред

рдлрд┐рд░ рд╕реЗ, рдкрд╣рд┐рдпрд╛ рдХреЛ рдлрд┐рд░ рд╕реЗ рди рд▓рдЧрд╛рдПрдВред рд╕реА # рдЙрджрд╛рд╣рд░рдг:

class A<T> { }
nameof(A<string>)
"A"

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

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

2014 рдХреЗ рдмрд╛рдж рд╕реЗ рдЦреБрд▓рд╛ рдпрд╣ рдореБрджреНрджрд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд╣рд╛рд╡рдд рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИ: рдмреЗрд╣рддрд░ рдХрд╛ рджреБрд╢реНрдорди рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣реИ

--рдЖрд░

AngularJS рдЙрджрд╛рд╣рд░рдг, DI рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдирд╛:

angular.module("news", ["ngRoute"])
    .controller("NewsIndexController", App.News.NewsIndexController) // nameof

рдФрд░ рд╕рдВрджрд░реНрдн рд╕реЗрд╡рд╛рдПрдВ:

    .config(($routeProvider: ng.route.IRouteProvider) => {
        $routeProvider
            .when("/news", {
                controller: "NewsIndexController", // nameof
                templateUrl: "modules/news/views/index.html",
                controllerAs: "vm",
            })
    })

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

рдЗрд╕ рдереНрд░реЗрдб рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдХрдИ рдкрд░рд┐рджреГрд╢реНрдпреЛрдВ рдХреЛ https://github.com/Microsoft/TypeScript/pull/11929 рдореЗрдВ рдкреЗрд╢ рдХрд┐рдП рдЧрдП keyof рдСрдкрд░реЗрдЯрд░ рджреНрд╡рд╛рд░рд╛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП

keyof рдмрд┐рд▓реНрдХреБрд▓ рдмрдврд╝рд┐рдпрд╛ рд╣реИ! рд▓реЗрдХрд┐рди рдЕрднреА рднреА рдирд╛рдо рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЪрд╛рд╣рд┐рдП, рдЬрдм рдбрд╛рдЯрд╛рдмреЗрд╕рд┐рдВрдЧ: <input name={nameof(this.state.firstName)} />

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

  • рдЧреБрдг рдФрд░ рд╕рджрд╕реНрдп рдЬреИрд╕реЗ @Liero рдиреЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛
  • рдирд╛рдо рдЯрд╛рдЗрдк рдХрд░реЗрдВ, рдХрдореЗрдВрдЯ рджреЗрдЦреЗрдВ
  • рдорд╛рдкрджрдВрдбреЛрдВ

@mhegazy

keyof рдЕрдЪреНрдЫрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдХрд╛рдлреА рдирд╣реАрдВ рд╣реИред nameof рддрдм рднреА _рдмреЗрд╣рдж_ рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ рдЬрдм рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдСрд░реЗрд▓рд┐рдпрд╛ рдореЗрдВ рдкрд░рд┐рдХрд▓рд┐рдд рдЧреБрдгреЛрдВ рдХреА рдирд┐рд░реНрднрд░рддрд╛ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рдирд╛:

@computedFrom(nameof this.foo.bar)
// should compile to: @computedFrom("this.foo.bar")

рдпрд╛ рдЕрдорд╛рдиреНрдп рдлрд╝рдВрдХреНрд╢рди рддрд░реНрдХреЛрдВ рдХреЗ рд▓рд┐рдП рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢реЛрдВ рдореЗрдВ:

throw new Error(`The value of ${nameof options.foo} must be positive`)
// should compile to: throw new Error(`The value of ${"options.foo"} must be positive`)

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

рдореИрдВ рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдКрдкрд░ рдХреА рдХреБрдЫ рдкреЛрд╕реНрдЯ рдЗрд╕рдХреЗ рд╡рд┐рднрд┐рдиреНрди рд░реВрдкреЛрдВ рдФрд░ рдЬреЗрдирд░рд┐рдХ рдЖрджрд┐ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдЪрд┐рдВрддрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рддреА рд╣реИрдВред рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдпрд╣ рдпрдерд╛рд╕рдВрднрд╡ рд╕рд░рд▓ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП - рдмрд╕ рдореБрдЭреЗ _exactly_ рд╡рд╣ рджреЗрдВ рдЬреЛ рдореИрдВрдиреЗ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд┐рдЦрд╛ рдерд╛ред рддреЛ nameof Foo<Bar> рдХреЛ рдареАрдХ рдЙрд╕реА рдХреЗ рд▓рд┐рдП рд╕рдВрдХрд▓рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП - "Foo<Bar>" ред рдпрджрд┐ рдЬреЗрдирд░рд┐рдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рддреЛ рдЙрдиреНрд╣реЗрдВ рдмрд╛рдж рдореЗрдВ рд░реЗрдЧреЗрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣рдЯрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирд╣реАрдВ рджреЗрдЦрддрд╛ рдХрд┐ рдЗрд╕реЗ рдЗрддрдирд╛ рдЬрдЯрд┐рд▓ рдХреНрдпреЛрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

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

@ рдереЙрдорд╕-рдбрд╛рд░реНрд▓рд┐рдВрдЧ рдЕрдЧрд░ рдпрд╣ рд╕реА # рдкрд░рд┐рднрд╛рд╖рд╛ рдХреА рддрд░рд╣ рдХреБрдЫ рднреА рдерд╛, рддреЛ nameof foo.bar "foo" , "foo.bar" ред

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

// computed-from.ts
export function computedFrom<K1 extends string, K2 extends string, K3 extends string>
  (prop1: K1, prop2: K2, prop3: K3): 
    (target: {[P in K1 | K2 | K3]}, key: string | number | symbol) => void;

export function computedFrom<K1 extends string, K2 extends string>
  (prop1: K1, prop2: K2): (target: {[P in K1 | K2]}, key: string | number | symbol) => void;

  export function computedFrom<K extends string>
    (prop: K): (target: {[P in K]}, key: string | number | symbol) => void;

рдФрд░ рдлрд┐рд░ рдЗрд╕рдХрд╛ рд╕реЗрд╡рди рдЗрд╕ рддрд░рд╣ рдХрд░реЗрдВ

// welcome.ts
import { computedFrom } from './computed-from';

export class Welcome {
  firstName: string;

  lastName: string;

  @computedFrom('firstName', 'lastName') get fullName() {
    return `${this.firstName} ${this.lastName}`;
  }
}

рдпреЛрдЧреНрдп рдирд╛рдо рдЬреИрд╕реЗ "foo.bar" рднреА рд╕рдВрднрд╡ рд╣реИрдВред

@aluanhaddad

"foo.bar" рдЬреИрд╕реЗ рдпреЛрдЧреНрдп рдирд╛рдо рднреА рд╕рдВрднрд╡ рд╣реИрдВред

рдпрд╣ рдХреБрдЫ рдРрд╕рд╛ рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рдХрд┐рд╕реА рддрд░рд╣ рдпрд╛рдж рдХрд┐рдпрд╛, рд╡рд┐рд╕реНрддреГрдд рдХрд░рдиреЗ рдХреА рдкрд░рд╡рд╛рд╣ рд╣реИ?

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

рдареАрдХ рд╣реИ, рддреЛ рдирд╛рдо рдХрд╛ рдкрд░рд┐рдЪрдп рджреЗрдиреЗ рдХреЗ рдмрдЬрд╛рдп рдЖрдк рд╕рднреА рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдЬреИрд╕реЗ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдФрд░ рдЖрджрд┐ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрддреЗ рд╣реИрдВ?

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

@fredgalvao рдпрд╣ #11997 рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИ

@RyanCavanaugh рдпрджрд┐ рдирдИ keyof рд╕реБрд╡рд┐рдзрд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ nameof рд▓рд┐рдП рдЗрд╕ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдХреЛ рд╣рд▓ рдХрд░рддреА рд╣реИ, рддреЛ рдХреНрдпрд╛ рдЖрдк рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ ... рдЕрдзрд┐рдорд╛рдирддрдГ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкреНрд▓реЗрдЧреНрд░рд╛рдЙрдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдпрд╣ рд╕рд╛рдмрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ? рдзрдиреНрдпрд╡рд╛рдж!

рд╕реНрдХреНрд░реИрдЪ рдХрд░реЗрдВ - рдореИрдВрдиреЗ рдЗрд╕реЗ рд╕реНрд╡рдпрдВ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рдФрд░ рдпрд╣ рд▓рдЧрднрдЧ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

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

var str1: keyof User;
var str2: keyof User;
var str3: keyof User;

str1 = "name"; // successful compile
console.log(str1);

str2 = "Age"; // compiler error due to typo
console.log(str2);

str3 = "age"; // successful compile
console.log(str3);

рдЦреЗрд▓ рдХрд╛ рдореИрджрд╛рди рд╕реНрд░реЛрдд

рдЬрдм рдореИрдВ рдмрдирд╛рдо рдХреЛрдб рдореЗрдВ Rename Symbol (F2) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реВрдВ, рддреЛ рдпрд╣ рдореЗрд░реА рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХрд╛ рдирд╛рдо nameof(mySymbol) рд╕реБрд╡рд┐рдзрд╛ рд╕реЗ рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реВрдВред

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

function log(name: string, age: number) {
    console.log(nameof(age), ' is ' , age);
}

рддреЛ keyof рд╣рдореЗрдВ рдЙрд╕ рддрд░рд╣ рд╕реЗ 80% рдорд┐рд▓рддрд╛ рд╣реИ рдЬреИрд╕рд╛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди nameof рдЕрднреА рднреА рдмреЗрд╣рддрд░ рд╣реИред

рдЕрджреНрдпрддрди

рдореИрдВрдиреЗ рдпрд╣рд╛рдВ рджреЛрдиреЛрдВ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЛрдВ рдХреЛ рдХрд╡рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрд▓реБрдЖрдирд╣рджреНрджрд╛рдж рдХрд╛ рдЙрджрд╛рд╣рд░рдг рдЬреЛрдбрд╝рд╛: рдЦреЗрд▓ рдХрд╛ рдореИрджрд╛рди рд╕реНрд░реЛрдд

рдлрд╝рдВрдХреНрд╢рди рдкреИрд░рд╛рдореАрдЯрд░ рдирд╛рдо рд╡рд╢ рдореЗрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрдард┐рди рдЬрд╛рдирд╡рд░ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рд░рдирдЯрд╛рдЗрдо рдкрд░ рд╡рд╣ рдирд╛рдо рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХреБрдЫ рдФрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ рдЬрд┐рд╕реЗ 99% рдкреЛрд╕реНрдЯ-рдкреНрд░реЛрд╕реЗрд╕рд░ рджреНрд╡рд╛рд░рд╛ рдЫреЛрдЯрд╛/рдмрджрд╕реВрд░рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рд╣реИред

рдореЗрд░рд╛ рдЙрдкрдпреЛрдЧ-рдорд╛рдорд▓рд╛ рд╕реЙрдХреЗрдЯ рдХреЗ рд▓рд┐рдП рд╣реИред

рд╕реЙрдХреЗрдЯ.рдЖрдИрдУ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рд╕реЙрдХреЗрдЯ рдПрдорд┐рдЯрд░/рд░рд┐рд╕реАрд╡рд░ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЬреБрдбрд╝реЗ рд╣реБрдП рд╣реИрдВред

рддреЛ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдореИрдВ рдпрд╣ рд▓рд┐рдЦ рд░рд╣рд╛ рд╣реВрдБ:
(рдЬрд╣рд╛рдВ showX() рдХреНрд▓рд╛рдЗрдВрдЯ рдФрд░ рд╕рд░реНрд╡рд░ рд╕рд╛рдЗрдб рджреЛрдиреЛрдВ рдЗрдВрдЯрд░рдлреЗрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИрдВ)

public showLobby(): void {
    this.server.emit("showLobby");
 }

рдореИрдВ рдХреНрдпрд╛ рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ:

public showLobby(): void {
    this.server.emit(nameof(this.showLobby));
 }

(рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ this.showLobby.name рд▓рд┐рдЦ рд╕рдХрддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рд╕рдВрдХрд▓рди рд╕рдордп рд╕реНрдЯреНрд░рд┐рдВрдЧ рд░рдЦрдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛)

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

рдЬрдм рдореИрдВ рдмрдирд╛рдо рдХреЛрдб рдореЗрдВ рдирд╛рдо рдмрджрд▓реЗрдВ рдкреНрд░рддреАрдХ (F2) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реВрдВ, рддреЛ рдпрд╣ рдореЗрд░реА рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХрд╛ рдирд╛рдо рдирд╣реАрдВ рдмрджрд▓рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдореИрдВ nameof(mySymbol) рд╕реБрд╡рд┐рдзрд╛ рд╕реЗ рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реВрдВред

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

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

function log<K extends keyof User>(name: K, value: User[K]) {
  console.log(name, ' is ', value);
}

const user: User = {
  name: 'Jill',
  age: 50
};

log(str1, user[str1]); // OK
log(str3, user[str3]); // OK
log(str3, user[str1]); // Error
log('age', user.name); // Error

рдЧрд╣рд░рд╛ рд╕рд╣рд╕рдВрдмрджреНрдз f- рд╕реАрдорд╛ред

@aluanhaddad рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЖрдкрдХрд╛ log рдЙрджрд╛рд╣рд░рдг рдареАрдХ рдЙрд╕реА рддрд░рд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЬреИрд╕рд╛ рдЖрдк рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВред рдореЗрд░реА рд╕рдордЭ рдпрд╣ рд╣реИ рдХрд┐ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдмрд┐рд▓реНрдХреБрд▓ рдареАрдХ рд╣реЛрдЧрд╛:

function log<K extends keyof User>(name: K, value: User[K]) { }

const user: User = {
  firstName: 'John',
  lastName: 'Doe'
};

log('firstName', user.lastName);  // OK, unfortunately

рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ K рдХрд╛ рдЕрдиреБрдорд╛рди 'firstName' рдФрд░ рдЗрд╕рд▓рд┐рдП, U[K] рдХрд╛ рдЕрдиреБрдорд╛рди string , рдЬреЛ lastName рд╕рдВрддреБрд╖реНрдЯ рдХрд░рддрд╛ рд╣реИред
рдЖрдкрдХрд╛ рдЙрджрд╛рд╣рд░рдг рдХреЗрд╡рд▓ рдЗрд╕рд▓рд┐рдП рдЕрдЪреНрдЫрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рд╕рдВрдкрддреНрддрд┐ рдХрд╛ рдПрдХ рдЕрд▓рдЧ рдкреНрд░рдХрд╛рд░ рдерд╛ред

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

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

рдореЗрд░реЗ рд▓рд┐рдП рдФрд░ рднреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЯреВрд▓ рд╣реИ _Find all Reference_, рдЬреЛ рдмрд╕ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рд╕реНрдерд╛рдирд╛рдкрдиреНрди рдПрдХ рд╕рд╛рджрд╛ рдкрд╛рда рд╣реИ _Find_, рд▓реЗрдХрд┐рди (рдП) рдЖрдкрдХреЛ рдХрднреА рднреА _Find Reference_ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдиреЗ рдХреА рдЖрджрдд рдбрд╛рд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬреЛ рд╢рд░реНрдо рдХреА рдмрд╛рдд рд╣реИ рдФрд░ (рдмреА) рд╕рд╛рдорд╛рдиреНрдп рдирд╛рдореЛрдВ рдХреЗ рд▓рд┐рдП, _Find_ рдмреЗрд╣рдж рд╢реЛрд░ рд╣реИ рдФрд░ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдЭреВрдареЗ рд╕рдХрд╛рд░рд╛рддреНрдордХ рдХреЛ рдмрджрд▓ рджреЗрддрд╛ рд╣реИред

#11997 рдХреЗ рд▓рд┐рдП рд╡реЛрдЯ рдХрд░реЗрдВ!

@RyanCavanaugh : рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп.js рдХреЗ рд╕рд╛рде keyof рдХреИрд╕реЗ рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИ? рдЖрдк рд╕рднреА рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд╡рд░реНрдЧреЛрдВ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред nameof рдЙрд╕рдореЗрдВ рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЬрд╣рд╛рдБ рддрдХ Angular2 рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд╕рд╛рде рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд▓рд┐рдП рдпрд╣ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп.js рдХреЗ рд╕рд╛рде рднреА рдЬрд╛рддрд╛ рд╣реИ, nameof рдЖрд╡рд╢реНрдпрдХ рд╣реИ ред

@RyanCavanaugh : рд╢рд╛рдпрдж рдлрд┐рд░ рд╕реЗ рдЦреЛрд▓рдиреЗ рдХрд╛ рд╕рдордп? рд╣рдордиреЗ рдкрд░реНрдпрд╛рдкреНрдд рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдПрдХрддреНрд░ рдХрд┐рдП рд╣реИрдВ рдЬрд╣рд╛рдВ keyof рдорджрдж рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдзрдиреНрдпрд╡рд╛рдж

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

рд╢рд╛рдпрдж рдЙрддреНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рд╕реБрд░рдХреНрд╖рд┐рдд рдирд╣реАрдВ рд╣реИред

var replace = require('gulp-string-replace');

gulp.task("nameof", function () {
    var regexReplace = function (match) {
        // nameof(foo.bar) => foo.bar
        var propName = match.slice(7, -1).trim();
        // foo.bar => bar (also works if no . present)
        var endElement = propName.split(/[.]+/).pop();
        return '"' + endElement + '"';
    };

    return gulp.src("./src/**/*.ts")
        .pipe(replace(/nameof\s*\([^\)]*\)/, regexReplace))
        .pipe(gulp.dest("./nameof"));
});

@CoenraadS рдпрджрд┐ рдЖрдк рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЧрд▓реНрдк рдХрд╛рд░реНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рддреЛ рдЖрдкрдХреЛ ts-nameof рдореЗрдВ рд░реБрдЪрд┐ рд╣реЛ рд╕рдХрддреА рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЕрдзрд┐рдХрд╛рдВрд╢ рдХрд╛рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрд┐рдпрд╛ рдЬрд╛ рдЪреБрдХрд╛ рд╣реИ (рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рдЗрд╕ рдзрд╛рдЧреЗ рдореЗрдВ рдЗрд╕рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдерд╛)ред рдореИрдВ рдкрд┐рдЫрд▓реЗ рдХреБрдЫ рд╕рдордп рд╕реЗ рдЯрд╛рдЗрдкрдкреНрд░рддрд┐ рдореЗрдВ nameof рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред

рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрддрд╛, рдЕрдЧрд░ рдХрд┐рд╕реА рдиреЗ ts-nameof, gulp рдЯрд╛рд╕реНрдХ рдХрд┐рдпрд╛ - ts рдЯреАрдо рдХреЗ рд▓рд┐рдП рдРрд╕реА рд╕рдорд╕реНрдпрд╛ рдХреНрдпреЛрдВ рд╣реИ!

@ vytautas-pranskunas- keyof рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЗрд╕ рдзрд╛рдЧреЗ рдореЗрдВ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдореИрдВрдиреЗ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдореЗрдВ рдЪрд╛рдмрд┐рдпреЛрдВ рдХреЗ рд╕рд╣реА рдЙрдкрдпреЛрдЧ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдРрд╕рд╛ рдХрд┐рдпрд╛:

export interface IAppState {
    isConnectedToServer: boolean
}

const checkKey = <T>(key: keyof T) => key;

export const reducer: Reducer<IAppState> = (state = initialState, action: KnownAction) => {
    switch (action.type){
        case 'CONNECTED_TO_SERVER':
            return state.set(checkKey<IAppState>('isConnectedToServer'), true)
        case 'DISCONNECTED_FROM_SERVER':
            return state.set(checkKey<IAppState>('isConnectedToServer12345'), false) //Compile time error :)

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

@paulinfrancis рд╣рд╛рдБ рдРрд╕рд╛ рд╣реА рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рдореБрдЦреНрдп рдкреНрд░рд╢реНрди рдЕрдиреБрддреНрддрд░рд┐рдд рд░рд╣рддрд╛ рд╣реИ: рдРрд╕рд╛ рд╕реНрдкрд╖реНрдЯ рд╡реНрдпрд╡рд╣рд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдореБрджрд╛рдп рдХреЛ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╣рд╛рдпрдХ рдХрд╛рд░реНрдп рдФрд░ рд╣реИрдХ рдХреНрдпреЛрдВ рдХрд░рдиреЗ рдЪрд╛рд╣рд┐рдП рдФрд░ ts рдЯреАрдо рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╕реЗ рдордирд╛ рдХреНрдпреЛрдВ рдХрд░рддреА рд╣реИ?

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

рд╣рд░ 3-4 рдорд╣реАрдиреЗ рдореЗрдВ рдореИрдВ рдЗрд╕ рдзрд╛рдЧреЗ рдкрд░ рд╡рд╛рдкрд╕ рдЖрддрд╛ рд╣реВрдВ рдФрд░ nameof() рдСрдкрд░реЗрдЯрд░ рдХреЛ рд╢рд╛рдорд┐рд▓ рди рдХрд░рдиреЗ рдХреА рдЬрд┐рдж рд╕реЗ рдПрдХ рдмрд╛рд░ рдлрд┐рд░ рдирд┐рд░рд╛рд╢ рд╣реЛ рдЬрд╛рддрд╛ рд╣реВрдВред рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмрд╣реБрдд рд╕реЗ рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрдбрд╝реА рдкрд░реЗрд╢рд╛рдиреА рд╣реИ, рдФрд░ рдЗрд╕реЗ рдХрд┐рд╕реА рдЕрдиреНрдп рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рдХрд░рдирд╛ рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд╣реИред

рд╣рд░ рдХреЛрдИ рдЗрд╕ рдмрд╛рдд рд╕реЗ рд╕рд╣рдордд рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдХрдореЛрдмреЗрд╢ рдареАрдХ рдЙрд╕реА рддрд░рд╣ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреИрд╕реЗ C# рдХрд░рддрд╛ рд╣реИред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдПрдХ рд╡рд┐рд░реЛрдз рдХрд╛ рдЖрдпреЛрдЬрди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП - рд░реЗрдбрдордВрдб рдФрд░ рдзрд░рдирд╛ рдПрдордПрд╕ рдореБрдЦреНрдпрд╛рд▓рдп рддрдХ рдбреНрд░рд╛рдЗрд╡ рдХрд░реЗрдВ ... рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдЧрдВрднреАрд░рддрд╛ рд╕реЗ рд╡рд┐рдЪрд╛рд░реЛрдВ рд╕реЗ рдмрд╛рд╣рд░ рд╣реВрдВред

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

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

@gcnew рдХреНрдпрд╛ рдЖрд╕рд╛рди рд╣реИ? nameof([put valid identifier here]) -> рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрд╕ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХрд╛ рдЕрдВрддрд┐рдо рднрд╛рдЧред рдореЗрд░рд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдЧреМрд░рд╡рд╢рд╛рд▓реА рдореИрдХреНрд░реЛ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдХрд╛рдо рдкрд░ рд╣рдо рдмрд╕ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдЬреЛрдбрд╝рдиреЗ рд╡рд╛рд▓реЗ рд╣реИрдВ nameof(thing:any) рдЬреЛ рдареАрдХ рдЙрд╕реА рддрд░рд╣ рд╕реЗ рдмрджрд▓ рдЬрд╛рддрд╛ рд╣реИ рдЬреИрд╕рд╛ @frodegil рдиреЗ рд░реЗрдЧреЗрдХреНрд╕ рдпрд╛ рдЬреЛ рдХреБрдЫ рднреА рдкреЛрд╕реНрдЯ-рдХрдВрдкрд╛рдЗрд▓ рдкрд░ рдКрдкрд░ рд╕реБрдЭрд╛рдпрд╛ рдерд╛ред рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рдХреБрдЫ рдХрд┐рдирд╛рд░реЗ рдХреЗ рдорд╛рдорд▓реЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рддрдХрдиреАрдХреА рд░реВрдк рд╕реЗ рдХреБрдЫ рдФрд░ рд╡рд┐рдЪрд╛рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдореВрд▓ рд░реВрдк рд╕реЗ рдЗрд╕ рдзрд╛рдЧреЗ рдореЗрдВ рд╡реНрдпрдХреНрдд рд╕рднреА рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓реЛрдВ рдХреЛ рдХрд╡рд░ рдХрд░ рд░рд╣рд╛ рд╣реИред рдЬрд╛рджреВ рдХреЗ рддрд╛рд░ рдФрд░ рдкреНрд░рддрд┐рдмрд┐рдВрдм рдХреА рдХрдореА рд╕реЗ рддреНрд░рд╕реНрдд рднрд╛рд╖рд╛ рдореЗрдВ рдЗрд╕реЗ nameof() рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдХреЗрд╡рд▓ рд╕рдордЭ рдХреА рдПрдХ рдЕрдирдВрддрддрд╛ рд╣реЛрдЧреА - рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рд╣рдореЗрдВ keyof() ред рд╣рдереЗрд▓реАред рдЪреЗрд╣рд░рд╛ред

@gleno keyof рдПрдХ рдмрд╣реБрдд рд╣реА рдЙрдкрдпреЛрдЧреА рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдЬрд┐рди рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИ рд╡реЗ nameof рд╕реЗ рдЬреЛ рд▓реЛрдЧ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЙрд╕рд╕реЗ рдЕрд▓рдЧ рд╣реИрдВ, рдПрдХ рдФрд░ рдХрд╣рд╛рдиреА рд╣реИред

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

@gcnew рдореЗрд░реА рд╕рдордЭ рд╣реИ рдХрд┐ рдкрд░рд┐рд╡рд░реНрддрди рдореМрдЬреВрджрд╛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╕реЗ рд╣реИрдВ -> рдореМрдЬреВрджрд╛ рд╕рд┐рдВрдЯреИрдХреНрд╕, nameof рдирдпрд╛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╣реИ рдЗрд╕рд▓рд┐рдП рдпрд╣ рдЧрд╛рдпрдм рд╣реИ, рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдореИрдВ рдЧрд▓рдд рд╣реВрдВ

@ рдПрд▓реЗрдХреНрд╕реА-рдмрд╛рдпрдХреЛрд╡ рд╣рд╛рдВ, рдореБрдЭреЗ рднреА рдРрд╕рд╛ рд╣реА рд▓рдЧрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐ рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдХреЛрдИ рдлрд╝рдВрдХреНрд╢рди рдШреЛрд╖рдгрд╛ рд╣реИ рдЬреИрд╕реЗ:

declare function nameof(x: any): string;

рдФрд░ рдПрдХ рдкрд░рд┐рд╡рд░реНрддрди рдЬреЛ рд╕рднреА рд╡реИрд╢реНрд╡рд┐рдХ nameof рдЗрдирд╡реЛрдХреЗрд╢рди рдХреЛ рдЗрд╕рдХреЗ рддрд░реНрдХ рдХреЗ рд╕рд╛рде рдмрджрд▓ рджреЗрддрд╛ рд╣реИ, рдЗрд╕реЗ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдРрд╕рд╛ рд╕рдорд╛рдзрд╛рди рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдЬрд╣рд╛рдВ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЕрдХреНрд╖рд░ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХреА рдЬрд╛рддреА рд╣реИред рдлрд┐рд░ рднреА рдпрд╣ рдПрдХ рдЕрдЪреНрдЫрд╛ рдкрд╣рд▓рд╛ рдХрджрдо рд╣реИ рдФрд░ рдЬрд┐рддрдиреЗ рдЕрдзрд┐рдХ рдХрдВрдкрд╛рдЗрд▓рд░ рдПрдкреАрдЖрдИ рдЙрдкрд▓рдмреНрдз рд╣реЛрдВрдЧреЗ рдЙрддрдирд╛ рд╣реА рдЗрд╕реЗ рдмреЗрд╣рддрд░ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

@gcnew : рдпрджрд┐ рдпрд╣ рдирд╛рдо рдХреЗ рдкрд░рд┐рджреГрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рд╕рдорд╛рдзрд╛рди рд╣реЛрдиреЗ рд╡рд╛рд▓рд╛ рд╣реИ, рддреЛ рдХреГрдкрдпрд╛ рдЗрд╕реЗ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдореЗрдВ рд▓рд┐рдЦреЗрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдпрд╣рд╛рдВ: https://www.typescriptlang.org/docs/handbook/gulp.html

@gcnew рдпрджрд┐ рдЖрдк рд░реЛрд╕рд▓рд┐рди рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рд╡рд┐рд╕реНрддрд╛рд░ рдмрд┐рдВрджреБ рдбрд╛рдпрдЧреНрдиреЛрд╕реНрдЯрд┐рдХреНрд╕, рдлрд┐рдХреНрд╕ рдФрд░ рд░рд┐рдлреИрдХреНрдЯрд░рд┐рдВрдЧ рд╣реИрдВ рдЬреЛ рд╡рд┐рдХрд╛рд╕ рдХреЗ рджреМрд░рд╛рди рд╕рд╣рд╛рдпрддрд╛ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЙрдирдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдЬреЛрдЦрд┐рдо рдирд╣реАрдВ рд╣реИред рдЖрдЦрд┐рд░реА рдЪреАрдЬ рдЬреЛ рдореИрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рд╡рд╣ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдкреИрдХреЗрдЬ рдЬреЛрдбрд╝рдирд╛ рд╣реИ рдЬреЛ рдмрд┐рд▓реНрдб рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХреЗ рд╣реИрдХреНрд╕ рдХреЗ рд╕рд╛рде рдХрд░рддрд╛
рдФрд░ рдлрд┐рд░ "рд╣рдо рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ 2.x рдореЗрдВ рдЕрдкрдЧреНрд░реЗрдб рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ" рдЬреИрд╕реА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ "рдирд╛рдо рдХрд╛ рдкреИрдХреЗрдЬ" 0.1.2 рдЕрднреА рддрдХ рдЗрд╕рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП 1) рд╣рдореЗрдВ рдЗрдВрддрдЬрд╛рд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдпрд╛ 2) рдирд╛рдо рдХреЗ рд╕рднреА рдЙрдкрдпреЛрдЧреЛрдВ рдХреЛ рд╣рдЯрд╛ рджреЗрдВ рд╣рдорд╛рд░реЗ рдХреЛрдб рдФрд░ рдЗрд╕реЗ рдвреАрд▓рд╛; рдпрд╛ 3) рдЗрд╕реЗ рд╕реНрд╡рдпрдВ рдкреБрди: рд▓рд╛рдЧреВ рдХрд░реЗрдВ рдФрд░ рдЗрд╕реЗ рд╣рдореЗрд╢рд╛ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдП рд░рдЦреЗрдВ" рдХреБрдЫ рдорд╣реАрдиреЛрдВ рдореЗрдВред

@ рдкреАрдЯрд░-рдЬреБрд╣рд╛рдЬрд╝ рдЬреЛ рдЖрдкрдХреЛ рдЗрд╕реЗ npm рд╕реЗ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рддрд╛ рд╣реИ? рдЗрд╕реЗ рд╕реНрд╡рдпрдВ рдмрдирд╛рдПрдВ рдФрд░ рдЕрдкрдиреА 24/7 рдЧреНрд░рд╛рд╣рдХ рд╕реЗрд╡рд╛ рдмрдиреЗрдВ

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

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

рдпрд╣ рд╣рдореЗрдВ рджреЛ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рд╕рд╛рде рдЫреЛрдбрд╝ рджреЗрддрд╛ рд╣реИ:

  • рдПрдХ рдИрд╕реАрдПрдордПрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкреНрд░рд╕реНрддрд╛рд╡ рдмрдирд╛рдПрдВ рдФрд░ рдЖрд╢рд╛ рдХрд░реЗрдВ рдХрд┐ рдпрд╣ рдХрд░реНрд╖рдг рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдЧрд╛
  • рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ Transfroms API рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдФрд░ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕рдиреНрдирд┐рдХрдЯрди рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ

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

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

14 рдлрд░рд╡рд░реА, 2017 19:19 рдХреЛ, "рдорд╛рд░рд┐рди рдорд╛рд░рд┐рдиреЛрд╡" рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди @github.com рдиреЗ рд▓рд┐рдЦрд╛:

@ рдкреАрдЯрд░-рдЬреБрд╣рд╛рд╕ https://github.com/Peter-Juhasz рдореИрдВ рдЖрдкрдХреЗ рд▓рд┐рдП рдорд╣рд╕реВрд╕ рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рдореИрдВ рдХрд░рддрд╛ рд╣реВрдВ
рд╕рд╣рдордд рд╣реИрдВ рдХрд┐ nameof рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ рдФрд░ рд╕реБрд░рдХреНрд╖рд╛ рдЬреЛрдбрд╝ рджреЗрдЧрд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╣реИ
рдИрд╕реАрдПрдордПрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЙрдбрд▓рд┐рдВрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ, рдПрдХ рдирдИ рдмреЗрд╣рддрд░ рднрд╛рд╖рд╛ рдирд╣реАрдВ рдмрдирд╛рдирд╛ред рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ
рдЬреИрд╕реЗ рдХреАрдУрдлрд╝ рд╡рд┐рд╢реБрджреНрдз рд░реВрдк рд╕реЗ рд╕реНрддрд░ рдХрд╛ рд╕реНрддрд░ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╡реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ
рдХреНрд░рд┐рдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ред рдФрд░ рдЙрдирдХреЗ рд▓рд┐рдП рднреА рдЯреАрдо рдХреА рдУрд░ рд╕реЗ рд╡рд┐рд░реЛрдз рд╣реИ
рдПрдХ рдХреАрд╡рд░реНрдб рдЖрд╡рдВрдЯрд┐рдд рдХрд░реЗрдВред рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд, nameof рд╕рдЦреНрддреА рд╕реЗ рдПрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╕реНрддрд░ рд╣реИ
рдирд┐рд░реНрдорд╛рдгред рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЯреАрдо рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрднреА рдЖрд╢реНрд╡рд╕реНрдд рд╣реЛрдЧреА,
рдЬрдм рддрдХ рдХрд┐ рдпрд╣ рдИрд╕реАрдПрдордПрд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реНрдкреЗрдХ рдореЗрдВ рди рд╣реЛред рдореБрдЭреЗ рдЦреБрдж рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИ
рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЗ рдирд╛рдо рдкрд░ рдореИрд▓рд╛ рдвреЛрдирд╛ред

рдпрд╣ рд╣рдореЗрдВ рджреЛ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рд╕рд╛рде рдЫреЛрдбрд╝ рджреЗрддрд╛ рд╣реИ:

  • рдПрдХ рдИрд╕реАрдПрдордПрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкреНрд░рд╕реНрддрд╛рд╡ рдмрдирд╛рдПрдВ рдФрд░ рдЖрд╢рд╛ рдХрд░реЗрдВ рдХрд┐ рдпрд╣ рдХрд░реНрд╖рдг рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдЧрд╛
  • рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ Transfroms API рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдФрд░ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕рдиреНрдирд┐рдХрдЯрди рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ

рдкрд╣рд▓реЗ рд╡рд┐рдХрд▓реНрдк рдореЗрдВ рд╡рд░реНрд╖реЛрдВ рд▓рдЧреЗрдВрдЧреЗ (рдпрджрд┐ рдпрд╣ рдХрднреА рд╕реНрд╡реАрдХреГрдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ), рджреВрд╕рд░рд╛
рдкрд░реНрдпрд╛рдкреНрдд рд╕рднреНрдп рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдореБрдЭреЗ TS API рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдЕрдиреБрднрд╡ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди
рдореИрдВ рдЙрдирд╕реЗ рд╕реНрдерд┐рд░ рдФрд░ рдкрд┐рдЫрдбрд╝реЗ-рд╕рдВрдЧрдд рд╣реЛрдиреЗ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реВрдВ, рдЗрд╕ рдкреНрд░рдХрд╛рд░ nameofрдкреИрдХреЗрдЬ рднреА рд╕реНрдерд┐рд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдиреЗ рдЗрд╕ рдереНрд░реЗрдб рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реА рд╣реИред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рд╕реАрдзреЗ рдЙрддреНрддрд░ рджреЗрдВ, рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/Microsoft/TypeScript/issues/1579#issuecomment-279790055 ,
рдпрд╛ рдереНрд░реЗрдб рдХреЛ рдореНрдпреВрдЯ рдХрд░реЗрдВ
https://github.com/notifications/unsubscribe-auth/ABOZ9c-85P3x5AMakVDuxlNkH56me3POks5rcfAYgaJpZM4DNVgi
.

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

рдЕрдЧрд░ рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реИ рддреЛ рдореБрдЭреЗ рд╕рдореНрдорд╛рдирд┐рдд рдХрд░реЗрдВ, рд╣рдо рдПрдХ рдкреНрд░рд╕реНрддрд╛рд╡ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╕рдмрд╕реЗ рдЦрд░рд╛рдм рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдкреНрд░реА-рдкреНрд░реЛрд╕реЗрд╕рд░ред
(рд╕рдордп рдФрд░ рдкреНрд░реЗрд░рдгрд╛ рдХреА рдЕрдиреБрдорддрд┐)

--рдЖрд░

@gcnew :
1. nameof ES рдпреБрдХреНрддрд┐ рдореЗрдВ рдХрднреА рдирд╣реАрдВ рд╣реЛрдЧрд╛ ред рдореИрдВ рдРрд╕рд╛ рдХрд╣рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЖрд╢реНрд╡рд╕реНрдд рд╣реВрдВ, рдХреНрдпреЛрдВрдХрд┐ рдПрдХреНрдорд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдирд╛рдо рдХрд╛ рдЬреНрдпрд╛рджрд╛ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИред рдпрд╣рд╛рдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ: рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдЧрддрд┐рд╢реАрд▓ рдЯрд╛рдЗрдкрд┐рдВрдЧ рдХреЗ рдХрд╛рд░рдг, nameof(myObject.MyProperty) рдмрд┐рд▓реНрдХреБрд▓ "myProperty" рдЬреИрд╕рд╛ рд╣реА рд╣реИред рджреЛрдиреЛрдВ рдореВрд▓ рд░реВрдк рд╕реЗ "рдЬрд╛рджреВ рддрд╛рд░" рд╣реИрдВред рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рд╡рд░реНрдмреЛрдЬрд╝ рдиреЗрдордСрдлрд╝ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдХрд╛рд░рдг рдирд╣реАрдВ рд╣реИред рдпрд╛ рдЖрдк рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ nameof рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рд▓рд╛рдн рджреЗрдЦрддреЗ рд╣реИрдВ?

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

  1. рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдореВрд▓ рдЙрджреНрджреЗрд╢реНрдп рд╕реНрдерд┐рд░ рдЯрд╛рдЗрдкрд┐рдВрдЧ рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рдФрд░ рдмреЗрд╣рддрд░ рд░рд┐рдлреИрдХреНрдЯрд░рд┐рдВрдЧ рдЯреВрд▓ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдирд╛ рд╣реИред рдбреЗрдЯрд╛ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдкрд░рд┐рджреГрд╢реНрдпреЛрдВ рдореЗрдВ рд╕рдВрдкрддреНрддрд┐ рдХреЗ рдирд╛рдореЛрдВ рдХреА рдмрд╣реБрдд рдмрд╛рд░ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдФрд░

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

@Liero рдЖрдк рдХрднреА рдирд╣реАрдВ рдЬрд╛рди рд╕рдХрддреЗ рдХрд┐ рднрд╡рд┐рд╖реНрдп рдХреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВ рд╡реИрдз рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдпрд╛ рдирд╣реАрдВред рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдИрд╕реАрдПрдордП рджреНрд╡рд╛рд░рд╛ рд╕реАрдзреЗ рддреМрд░ рдкрд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рдпрд╣рд╛рдВ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд┐рдП рдЧрдП рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдПрдкреАрдЖрдИ рдореЗрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдПрдХ рд╡реИрд╢реНрд╡рд┐рдХ рдлрд╝рдВрдХреНрд╢рди nameof(node: Node): string | undefined рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ рдЬреЛ DOM рдиреЛрдб рдХреА name рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рдкрдврд╝рддрд╛ рд╣реИред рдХреНрдпрд╛ рдЗрд╕ рддрд░рд╣ рдХреЗ рд╕рдорд╛рд░реЛрд╣ рдХреЛ рдХрднреА рдорд╛рдирдХреАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛? рд╢рд╛рдпрдж рдирд╣реАрдВ _рдпрд╣ рдПрдХ_ рд▓реЗрдХрд┐рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдпрд╛ Symbol s рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реЛред рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ nameof рдХреЛ рдПрдХ рдХреАрд╡рд░реНрдб рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдзрд╛рд░ рдирд╣реАрдВ рд▓рд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╕реНрдерд╛рдиреАрдп рдЪрд░ рдирд╛рдореЛрдВ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рдХреЛрдб рд╣реИрдВ рдФрд░ рднрд╡рд┐рд╖реНрдп рдХреЗ рдПрдкреАрдЖрдИ рднреА рдЗрд╕рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдИрд╕реАрдПрдордПрд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рд╕реЗ рдЕрд▓рдЧ рд╣реЛрдиреЗ рдкрд░ рдпрд╣ рдПрдХ рджреБрд░реНрднрд╛рдЧреНрдпрдкреВрд░реНрдг рдмреНрд░реЗрдХрд┐рдВрдЧ рдкрд░рд┐рд╡рд░реНрддрди рд╣реЛрдЧрд╛ред

рд╕рдорд╛рдзрд╛рди рдпрд╛ рддреЛ nameof рдХреЛ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реНрддрд░ рддрдХ рдЙрдард╛рдирд╛ рд╣реИ, рдпрд╛ nameof рдХреЛ рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рдкреНрд░реА/рдкреЛрд╕реНрдЯ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдЪрд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╣реИ, рдЬреЛ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рднрд╛рд╖рд╛ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдирд╣реАрдВ рд╣реИред

рдПрдХ рдкреНрд░рдХрд╛рд░-рд╕реНрддрд░, рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдорд┐рдЯрд╛рдиреЗ рдпреЛрдЧреНрдп nameof рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:

declare const options: {
    easing?: string,
    duration: number
};

if (!options.easing) {
    throw new Error(<nameof options.easing> 'easing');
}

рд╕реНрддрд░

nameof(path.to.identifier) рд╕рдВрдХрд▓рди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕реЗ рдХрднреА рдирд╣реАрдВ рдмрдЪреЗрдЧрд╛ред рдЕрдВрддрд┐рдо рд╕рдВрдХрд▓рд┐рдд рдХреЛрдб рдореЗрдВ nameof рджреЗрдЦрдирд╛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╣реИ рдФрд░ рдмрд┐рд▓реНрдХреБрд▓ рд╡реИрд╕рд╛ рдирд╣реАрдВ рд╣реИ рдЬреИрд╕рд╛ рд╣рд░ рдХреЛрдИ рдЪрд╛рд╣рддрд╛ рд╣реИред рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдЧрд╛рдпрдм рд╣реЛ рдЬрд╛рдП, рдФрд░ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рдкреАрдЫреЗ рдЫреЛрдбрд╝ рджреЗрдВ "identifier" , рдЬреЛ nameof рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдПрдХ рд╕рдВрдХрд▓рди/рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реНрддрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдареАрдХ рд╡рд╣реА рдмрдирд╛рддрд╛ рд╣реИ рдЬреЛ рдЗрд╕реЗ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдХреЗ рдмреАрдЪ рдПрдХрдорд╛рддреНрд░ рдЕрдВрддрд░:

type AliasToUnion = A | B;
рддрдерд╛
nameof(object.property)

рдкрд░рд┐рдгрд╛рдо рд╣реИ: рдПрдХ рдПрдХ рдЦрд╛рд▓реА рд╕реНрдЯреНрд░рд┐рдВрдЧ рджреЗрддрд╛ рд╣реИ рдФрд░ рджреВрд╕рд░рд╛ рдПрдХ рдЧреИрд░-рд░рд┐рдХреНрдд рд╕реНрдЯреНрд░рд┐рдВрдЧ рджреЗрддрд╛ рд╣реИред рджреЛрдиреЛрдВ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реНрддрд░ рдХреА рд╕рдВрд░рдЪрдирд╛рдПрдВ рд╣реИрдВ, рдФрд░ рд╕рдВрдХрд▓рди рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рджреЛрдиреЛрдВ рдХрд╛ рдЦреЛрд▓ рдЧрд╛рдпрдм рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред

рдЯрдХреНрдХрд░

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

рдЗрдЪреНрдЫрд╛

рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдЕрдЧрд░ рд╣рдо рдХреАрд╡рд░реНрдб рдХреЗ рд░рд╛рд╕реНрддреЗ рдкрд░ рдирд╣реАрдВ рдЬрд╛рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╣реИ рдХрд┐ рдореБрдЭреЗ рдЕрднреА рднреА рдРрд╕рд╛ рдХреНрдпреЛрдВ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдмреЗрд╣рддрд░ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдХрд╛рдо рд╣реИ (рдЪрд╛рд╣реЗ рд╡рд╣ рдПрдХ рдкрд░рд┐рд╡рд░реНрддрди рд╣реЛ, рдПрдХ рд╕рдВрдХрд▓рди рд╕реНрддрд░ рдХрд╛ рдХрд╛рд░реНрдп рд╣реЛ, рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рд╕рдВрд░рдЪрдирд╛, рдПрдХ рдПрдХреНрдорд╛ рдкреНрд░рд╕реНрддрд╛рд╡, рдЖрджрд┐) :

рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдореВрд▓ рдЙрджреНрджреЗрд╢реНрдп рд╕реНрдерд┐рд░ рдЯрд╛рдЗрдкрд┐рдВрдЧ рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рдФрд░ рдмреЗрд╣рддрд░ рд░рд┐рдлреИрдХреНрдЯрд░рд┐рдВрдЧ рдЯреВрд▓ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдирд╛ рд╣реИред рдбреЗрдЯрд╛ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдкрд░рд┐рджреГрд╢реНрдпреЛрдВ рдореЗрдВ рд╕рдВрдкрддреНрддрд┐ рдХреЗ рдирд╛рдореЛрдВ рдХреА рдмрд╣реБрдд рдмрд╛рд░ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдФрд░ рдЯрд╛рдЗрдк рд╕реБрд░рдХреНрд╖рд┐рдд рддрд░реАрдХреЗ рд╕реЗ рдРрд╕рд╛ рдХрд░рдирд╛ рдареАрдХ рд╡реИрд╕рд╛ рд╣реА рд╣реИ рдЬреИрд╕рд╛ рдЖрдк рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реЗ рдЙрдореНрдореАрдж рдХрд░рддреЗ рд╣реИрдВред

рд╕реБрдЭрд╛рд╡

<nameof options.easing> 'easing'

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд▓рдЧрднрдЧ рдРрд╕рд╛ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдЙрд╕ рдЬрд╛рджреБрдИ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рджреЛрдмрд╛рд░рд╛ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдХреЗрд╡рд▓ рдПрдХ рд╣реА рдЕрдВрддрд░ рдХреЗ рд╕рд╛рде рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╕рдВрдХрд▓рдХ рд╣рдореЗрдВ рдмрддрд╛рдПрдЧрд╛ рдХрд┐ рдЗрд╕рдХрд╛ рдорд╛рди рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдирд╛рдо рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ . рдпрд╣ рдПрдХ рд╣реИ refactor->compile->see_error->go_back_and_properly_refactor рдПрдХ рдХреЗ рдмрдЬрд╛рдп рдкреНрд░рд╡рд╛рд╣ refactor_properly рдПрдХред рдЗрд╕рдХреЗ рд╕рд╛рде, рдореИрдВ рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рдмрдЬрд╛рдп рдЕрдзрд┐рдХ рдкреВрд░реНрдг рд╕рдВрд╕реНрдХрд░рдг рдкрд░ рдЬреЛрд░ рджреЗрдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред рдЕрдм, @gcnew , рдЕрдЧрд░ рд╣рдо <> рдПрдХ рдРрд╕реА рд╕рдВрд░рдЪрдирд╛ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕реЗ рдбрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рдореВрд▓реНрдп рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рддреЛ рдпрд╣ рдмрд╣реБрдд рдмрдврд╝рд┐рдпрд╛ рд╣реЛрдЧрд╛ (рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд╣рдо рдПрдЯреАрдПрдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ)ред

рджреЛрд╕реНрддреЛрдВ, nameof рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдЬрдмрдХрд┐ 90% рд╕рдХреНрд╖рдо рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рд╣реИ рдЬреЛ рдХреЗрд╡рд▓ рдереЛрдбрд╝рд╛ рдЕрддрд┐рд░рд┐рдХреНрдд рдЯрд╛рдЗрдкрд┐рдВрдЧ рд▓реЗрддрд╛ рд╣реИ:

type NamesOf<T> = { [P in keyof T]: P }
interface Data {
    name: string;
    value: number;
}
const propertyNames: NamesOf<Data> = {
    name: 'name,' // <-- not a magic string anymore, CAN ONLY BE `name`
    value: 'value' // <-- not a magic string anymore, CAN ONLY BE `value`
}

image

@gcnew :

рдПрдХ рд╡реИрд╢реНрд╡рд┐рдХ рдлрд╝рдВрдХреНрд╢рди рдирд╛рдо рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ (рдиреЛрдб: рдиреЛрдб): рд╕реНрдЯреНрд░рд┐рдВрдЧ | рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд

рдореМрдЬреВрджрд╛ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдлрд╛рдЗрд▓реЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧ - рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВред рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рд╕рдВрдШрд░реНрд╖реЛрдВ рд╕реЗ рдмрдЪрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

var _nameof = window.nameof; //problem solved

рдмреАрдЯреАрдбрдмреНрд▓реВ, рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╢рд╛рдпрдж nameOf . рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛

@fredgalvao : рдЖрдкрдХрд╛ рд╕реБрдЭрд╛рд╡: <nameof options.easing> рдкрд╣рд▓реЗ рд╕реЗ рд╣реА JSX, рд╕рдореНрдорд╛рди TSX рдХреЗ рд╕рд╛рде рд╕рдВрдШрд░реНрд╖ рдХрд░рддрд╛ рд╣реИ

@Liero рд╡рд╣ рдореЗрд░рд╛ рд╕реБрдЭрд╛рд╡ рдирд╣реАрдВ рдерд╛, рдореИрдВ рд╕рд┐рд░реНрдл @gcnew рдХреЗ рд╕реБрдЭрд╛рд╡ рдкрд░ рдЯрд┐рдкреНрдкрдгреА рдХрд░ рд░рд╣рд╛ рдерд╛ред

рдареАрдХ рд╣реИ, рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рдЯрд╛рдЗрдкрд╕рд╛рдЗрдб рдиреЗрдордСрдлрд╝ рдСрдкрд░реЗрдЯрд░ рдерд╛?

рдХреБрдЫ рдРрд╕рд╛ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛:

const obj = {x:1};
function abc(thing:nameof(obj.x)){ }

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

function abc(thing:"x"){ }

рдпрд╣ nameof(accessor)->string рдЬрд┐рддрдирд╛ рд╕рд╛рдл рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрд╛рдлреА рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдореИрдВ nameOf рдХреЛ рдХреЗрд╡рд▓ рдПрдХ рд╕рдВрдХрд▓рди-рд╕рдордп рдХреАрд╡рд░реНрдб рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирддрд╛ рд╣реВрдВ, рдФрд░ рдЗрд╕рдХрд╛ рдХреЛрдИ рд░рдирдЯрд╛рдЗрдо рдпрд╛ рд╡реИрд╢реНрд╡рд┐рдХ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рджреЗрдЦ рд╕рдХрддрд╛ (рдХрднреА рдирд╣реАрдВ рдХрд╣реЗрдВ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИ, рдЖрдИрдПрдордУ - рдЗрд╕реЗ TSNameOf , рдФрд░ рдпрд╣ рд╣реИ рдФрд░ рднреА рдЕрд╕рдВрднрд╡)

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

nameOf TS рдореЗрдВ рдареАрдХ рдЙрд╕реА рддрд░рд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреИрд╕реЗ C# рдореЗрдВ nameOf

рд╕реА # (v5) рдЪрд╢реНрдорд╛:

рдирд╛рдо рдХрд╛ рд╡реНрдпрдВрдЬрдХ рдПрдХ рд╕реНрдерд┐рд░рд╛рдВрдХ рд╣реИред рд╕рднреА рдорд╛рдорд▓реЛрдВ рдореЗрдВ, nameof(...) рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдХрд▓рди-рд╕рдордп рдкрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рддрд░реНрдХ рдХрд╛ рд░рдирдЯрд╛рдЗрдо рдкрд░ рдореВрд▓реНрдпрд╛рдВрдХрди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕реЗ рдЕрдЧрдореНрдп рдХреЛрдб рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ (рд╣рд╛рд▓рд╛рдБрдХрд┐ рдпрд╣ "рдкрд╣реБрдБрдЪ рдпреЛрдЧреНрдп рдХреЛрдб" рдЪреЗрддрд╛рд╡рдиреА рдХрд╛ рдЙрддреНрд╕рд░реНрдЬрди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ)ред

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

рдЬрд▓реНрджреА рдХрд░реЗрдВ, TS рдХреЗ рдЕрдкреНрд░рдЪрд▓рд┐рдд рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдХрдВрдкрд╛рдЗрд▓-рдЯрд╛рдЗрдо nameOf рдХреАрд╡рд░реНрдб рд╢рд╛рдорд┐рд▓ рдХрд░реЗрдВ :)

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреА рддрд░рд╣ рдПрдХ рдХрд╕реНрдЯрдо nameOf рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛?

declare const options: {
    easing: string,
    duration: number,
};

function nameOf<T, K extends keyof T>(_: T, key: K) {
    return key;
}

nameOf(options, 'easing'); // 'easing'
nameOf({ options }, 'options'); // options

рдкреБрдирд╢реНрдЪ: keyof рд░рд┐рдлреИрдХреНрдЯрд░рд┐рдВрдЧ рдХреЛ https://github.com/Microsoft/TypeScript/issues/1997 рджреНрд╡рд╛рд░рд╛ рдЯреНрд░реИрдХ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ

рдореЗрд░реЗ рдкрд╛рд╕ рдкрд░рд┐рд╡рд░реНрддрди рдПрдкреАрдЖрдИ (#13940) рдХреЗ рд╕рд╛рде рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд nameof рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИ рдЬреЛ рдореИрдВрдиреЗ рдЖрдЬ рд╕реБрдмрд╣ рдЬрд▓реНрджреА рдХрд┐рдпрд╛ (рджреЗрдЦреЗрдВ ts-nameof рдХреА рдпрд╣ рд╢рд╛рдЦрд╛ - рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдпрд╣ рдлрд╝рд╛рдЗрд▓ рдФрд░ рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреА рдЧрдИ)ред

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

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЕрдм рдмреЗрдмреЗрд▓ рдФрд░ рдЯрд╛рдЗрдкрдкреНрд░рддрд┐ рд╕рдВрдХрд▓рдХ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред

рдореЗрд░реЗ рджреЛ рд╕реЗрдВрдЯ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдЗрдирд╡рд░реНрд╕рд┐рдлрд╛рдИ рдХреЗ рд╕рд╛рде рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдореЗрдВ рддрд╛рд░реЛрдВ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдирд╛рдо рджреЗрдЦрдирд╛ рдкрд╕рдВрдж рдХрд░реВрдВрдЧрд╛ред

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

рдореБрдЭреЗ рдпрд╣ рднреА рджреЗрдЦрдирд╛ рдЕрдЪреНрдЫрд╛ рд▓рдЧреЗрдЧрд╛ред рдореИрдВ рдХреБрдЫ ASP.NET AJAX рд╡рд┐рд░рд╛рд╕рдд рдХреЛрдб рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рд╕рд╛рдорд╛рди рд╕реЗ рдирд┐рдкрдЯрдирд╛ рд╣реИ рдЬреИрд╕реЗ:

DerivedClass.registerClass( "DerivedClass", BaseClass );

рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдРрд╕рд╛ рдХрд░рдирд╛ рд╡рд╛рдХрдИ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛:

DerivedClass.registerClass( nameof( DerivedClass ), BaseClass );

рд╡рд░реНрддрдорд╛рди рдореЗрдВ, DerivedClass рдирд╛рдо рдмрджрд▓рдиреЗ рд╕реЗ рдХреЛрдб рдЯреВрдЯ рдЬрд╛рдПрдЧрд╛ред

nameof() Immutable.js Record рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред

рдпрд╣ рдХреЛрдб

class MyRecord extends Record({value: ""}) {
  readonly value: string;

  withValue(newValue: string) {
    return this.set("value", newValue) as this;
  }
}

рдХреА рддрд░рд╣ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ

class MyRecord extends Record({value: ""}) {
  readonly value: string;

  withValue(newValue: string) {
    return this.set(nameof(this.value), newValue) as this;
  }
}

, рдЬреЛ рдирд╛рдо рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИред

рд╡рд░реНрдЧ рдпрд╛ рдЪрд░ рдХреЗ рдирд╛рдо рдХреЗ рд▓рд┐рдП рд╕рдВрднрд╛рд╡рд┐рдд рд╕рдорд╛рдзрд╛рди:

function nameof<T, P extends keyof T>(descriptor: {[P in keyof T]?: T[P]; }): P
{
    for(var key in descriptor) {
        if(descriptor.hasOwnProperty(key)) {
            return key as P;
        }
    }
}

class Test { }
var test= ""

var x = nameof({ Test })  // x: "Test" = "Test"
var y = nameof({ test })  // y: "test" = "test"

@jankaspar рдХреНрдпрд╛ рдЖрдкрдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде Test.foo рд╣реЛрдирд╛ рд╕рдВрднрд╡ рд╣реИ рдЬрд╣рд╛рдВ рдЯреЗрд╕реНрдЯ-рдХреНрд▓рд╛рд╕, рдлреВ-рдХреНрд▓рд╛рд╕ рдкреНрд░реЙрдкрд░реНрдЯреА?

@vytautas-pranskunas-
рдирд╣реАрдВ, рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрдк рдореИрдк рдХрд┐рдП рдЧрдП рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╕рдордЭрддреЗ рд╣реИрдВред рдХреБрдЫ рдЗрд╕ рддрд░рд╣:

class Test {
    foo: string
}

function propertyName<T>(name: keyof T){ 
    return name;
}
propertyName<Test>("foo") 
propertyName<Test>("bar")  // error

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпрд╣ рд╕рд╣реА рдирд╣реАрдВ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЬреИрд╕реА рдЪреАрдЬреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рд╣реИ рдФрд░ рдпрд╣ рд╡рд┐рдлрд▓ рд╣реЛ рдЧрдпрд╛ рдХреНрдпреЛрдВрдХрд┐ рдЗрдВрдЯрд░рдлреЗрд╕ рдмрд╣реБрдд рдЬрдЯрд┐рд▓ рдереЗ, рдФрд░ рд╕рдВрдХрд▓рдХ, рдмрдЬрд╛рдп рдкреИрджрд╛ рдХрд░рдиреЗ рдХреА "field1" | "field2" рдХреЗ рд▓рд┐рдП keyof T , рдЬреИрд╕реЗ рдЙрддреНрдкрдиреНрди рдХреБрдЫ any , рдФрд░ рдХреБрдЫ рднреА рд╕рдВрдХрд▓рд┐рдд рд╣реЛрдЧрд╛ред

рд╢реБрдХреНрд░рд┐рдпрд╛!
рд░реАрдбрд▓ рджреНрд╡рд╛рд░рд╛ рд╕реНрдкрд╛рд░реНрдХ

рдХрдХреНрд╖рд╛рдУрдВ рдФрд░ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд╕рд╛рде рдЗрд╕реЗ рдХреИрд╕реЗ рдХрд░реЗрдВ рдЗрд╕ рдкрд░ рдХреЛрдИ рд╕рд╣рдорддрд┐ рд╣реИ? рдореИрдВ рджреЗрдЦрддрд╛ рд╣реВрдВ рдХрд┐ рдореИрдВ рд╕рд┐рд░реНрдл keyof рдХреИрд╕реЗ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рд▓реЗрдХрд┐рди рдореВрд▓ рд░реВрдк рд╕реЗ рдореИрдВ nameof(type) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рддрд╛рдХрд┐ рдпрд╣ рд▓реЙрдЧрд┐рдВрдЧ рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛ рджреЗ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, LogManager.getLogger(nameof(MyClass))

@niemyjski рдпрд╣ рдорд╛рдирдХ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд╕рд╛рде рдЙрдкрд▓рдмреНрдз рд╣реИред

class MyClass {
   hello(n) { return 'hello ' + n; }
}
console.log(MyClass.name);

рдлрдВрдХреНрд╢рди рджреЗрдЦреЗрдВредрдирд╛рдо

@styfle рдХреЛрдб рдХреЛ

@dpogue рдЕрдзрд┐рдХрд╛рдВрд╢ рдорд┐рдиреАрдлрд╛рдпрд░ рдирд╛рдо рдореИрдВрдЧрд▓рд┐рдВрдЧ рдХреЛ рдЕрдХреНрд╖рдо рдХрд░рдиреЗ рдХрд╛ рд╡рд┐рдХрд▓реНрдк рджреЗрддреЗ рд╣реИрдВ (рд╡рд┐рд╢реНрд╡ рд╕реНрддрд░ рдкрд░, рдпрд╛ рдПрдиреЛрдЯреЗрдЯреЗрдб рдлрд╝рдВрдХреНрд╢рдВрд╕/рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рд▓рд┐рдП); рдЬреЛ рд╕рдВрддреБрд╖реНрдЯ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ?

рдХреБрдЫ рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдпрд╣ рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ nameof(MyClass) != MyClass.name (рдЫреЛрдЯрд╛ рдорд╛рдорд▓реЗ рдореЗрдВ)

рд╕рд╛рде рд╣реА, #8 рдФрд░ #16037 рдкрд░ рдирдЬрд╝рд░ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╕рдВрдмрдВрдзрд┐рдд рдЪрд░реНрдЪрд╛рдПрдВ рд╣реЛ рд╕рдХрддреА рд╣реИрдВ

рд╣рд╛рдБ, рд╣рдореЗрдВ рдХреБрдЫ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рдЪрд╛рд╣рд┐рдП...

рдзрдиреНрдпрд╡рд╛рдж
-рдмреНрд▓реЗрдХ рдиреАрдореАрдЬреНрд╕реНрдХреА

рдмреБрдзрд╡рд╛рд░, 19 рдЬреБрд▓рд╛рдИ, 2017 рдХреЛ рдкреВрд░реНрд╡рд╛рд╣реНрди 11:47 рдмрдЬреЗ, рдЗрдпрд╛рди рдореИрдХрд▓рд┐рдпреЛрдб рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди @github.com
рд▓рд┐рдЦрд╛ рдерд╛:

@dpogue https://github.com/dpogue рдЕрдзрд┐рдХрд╛рдВрд╢ рдорд┐рдиреАрдлрд╛рдпрд░ рдПрдХ рд╡рд┐рдХрд▓реНрдк рджреЗрддреЗ рд╣реИрдВ
рдирд╛рдо рдореИрдВрдЧрд▓рд┐рдВрдЧ рдЕрдХреНрд╖рдо рдХрд░реЗрдВ (рд╡рд┐рд╢реНрд╡ рд╕реНрддрд░ рдкрд░, рдпрд╛ рдПрдиреЛрдЯреЗрдЯреЗрдб рдлрд╝рдВрдХреНрд╢рдВрд╕/рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рд▓рд┐рдП); рд╡рд╣
рд╕рдВрддреБрд╖реНрдЯ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ?

рд╕рд╛рде рд╣реА, #8 https://github.com/Microsoft/TypeScript/issues/8 рдФрд░ #16037
https://github.com/Microsoft/TypeScript/issues/16037 рдореЗрдВ рдХреБрдЫ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ
рдирдЬрд░ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдмрдВрдзрд┐рдд рдЪрд░реНрдЪрд╛

-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рд╕реАрдзреЗ рдЙрддреНрддрд░ рджреЗрдВ, рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/Microsoft/TypeScript/issues/1579#issuecomment-316447179 ,
рдпрд╛ рдереНрд░реЗрдб рдХреЛ рдореНрдпреВрдЯ рдХрд░реЗрдВ
https://github.com/notifications/unsubscribe-auth/AA-So1aBKzLHIsS4-wYSeZmtNOf55B9Rks5sPjMYgaJpZM4DNVgi
.

@nevir рдФрд░ @dpogue рдпрд╣ рд╕рдорд╛рдзрд╛рди рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдЖрдк рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рджреНрд╡рд╛рд░рд╛ рд╣рд▓ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рди рдХрд┐ рдбреАрдЖрдИ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ рдареЛрд╕ рдкреНрд░рдХрд╛рд░ - рдпрд╛рдиреА рд░рдирдЯрд╛рдЗрдо рдкрд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдирд╛рдо рдЙрдкрд▓рдмреНрдзрддрд╛ рдХреЗ рд▓рд┐рдП рд╣рд▓ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рдореБрдЭреЗ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдорд┐рд▓реА рд╣реИ рдХреНрдпреЛрдВрдХрд┐ keyof рдпреЛрдЧреНрдп рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛рдУрдВ рдХреЛ рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИред

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

export function computedFrom<K1 extends string, K2 extends string>
  (prop1: K1, prop2: K2): (target: {[P in K1 | K2]}, key: string | number | symbol) => void;

  export function computedFrom<K extends string>
    (prop: K): (target: {[P in K]}, key: string | number | symbol) => void;

рдЕрдм рдЕрдкрдиреА рдХреНрд╖рдорддрд╛рдУрдВ рдХреЛ рд╡реНрдпрдХреНрдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ред

рдЗрддрдиреЗ рд╕рдордп рдХреЗ рдмрд╛рдж рднреА, TS рдХреЗ рдкрд╛рд╕ рдЕрднреА рднреА MAGIC STRINGS рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП (рдЬреИрд╕реЗ nameof ) рдХреЛрдИ рддрдВрддреНрд░ рдирд╣реАрдВ рд╣реИ?

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

+1

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

рддреЛ рдХреНрдпрд╛ рдХрд╣рд╛рдиреА рд╣реИ рджреЛрд╕реНрддреЛрдВ, рдХреНрдпрд╛ рдРрд╕рд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ?

рдЬреИрд╕рд╛ рдХрд┐ @jakkaj рдиреЗ рдкрд╣рд▓реЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдерд╛, рдпрд╣ inversify рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рд╢рд╛рдирджрд╛рд░ рд╡рд┐рд╢реЗрд╖рддрд╛

рдпрд╣рд╛рдВ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдЬрдм рдЖрдк рдЗрдВрдЯрд░рдлреЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдЖрдкрдХреЛ _currently_ рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реЛрддрд╛ рд╣реИ:

interface Weapon {
    hit(): string;
}

// Define an object that contains all of the type 
// symbols so that we only use magic strings once.
let TYPES = {
    Weapon: Symbol("Weapon")  // Magic String! Oh No!
};

@injectable()
class Ninja {
    constructor(@inject(TYPES.Weapon) weapon: Weapon) { }
}

nameof рдСрдкрд░реЗрдЯрд░ рдХреЗ рд╕рд╛рде, рдЖрдк рдХрдо рд╕реЗ рдХрдо рдЬрд╛рджреВ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЖрдк рдЙрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реЗ рднреА рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреНрд░рддреАрдХ рд╣реИрдВ:

interface Weapon {
    hit(): string;
}

@injectable()
class Ninja {
    constructor(@inject(Symbol(nameof(Weapon))) weapon: Weapon) { }
}

рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдпрд╣ рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЗрдВрдЬреЗрдХреНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдк рдЗрд╕рдХреЗ рд▓рд┐рдП рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рднреА рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ:

@injectable()
class Ninja {
    constructor(@inject(nameof(Weapon)) weapon: Weapon) { }
}

@reduckted

рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдЖрдкрдХреЛ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИ рдЗрд╕рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдпрд╣рд╛рдВ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

interface Weapon {
    hit(): string;
}

// Define an object that contains all of the type 
// symbols so that we only use magic strings once.
let TYPES = {
    Weapon: Symbol("Weapon")  // Magic String! Oh No!
};

@injectable()
class Ninja {
    constructor(@inject(TYPES.Weapon) weapon: Weapon) { }
}

рджрд░рдЕрд╕рд▓, рдпрд╣ рдХреЛрдИ рдЬрд╛рджреВ рдХреА рдбреЛрд░реА рдирд╣реАрдВ рд╣реИред рдЖрдк рдареАрдХ рд╡реИрд╕реЗ рд╣реА рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ

const types = { // this should be frozen in real code.
  Weapon: Symbol()
};

рдФрд░ рдирд┐рд╣рд┐рддрд╛рд░реНрде рд╕рдорд╛рди рд╣реЛрдВрдЧреЗ (рд╕рднреА рдЙрдкрднреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХреЛрдб рдХреЛ Weapon types рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рд╕рдВрдкрддреНрддрд┐ рдХрд╛ рд╕рдВрджрд░реНрдн рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП)ред

рдирд╛рдо рдХреЗ рдСрдкрд░реЗрдЯрд░ рдХреЗ рд╕рд╛рде, рдЖрдк рдХрдо рд╕реЗ рдХрдо рдЬрд╛рджреВ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЖрдк рдЙрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реЗ рднреА рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреНрд░рддреАрдХ рд╣реИрдВ:

interface Weapon {
    hit(): string;
}

@injectable()
class Ninja {
    constructor(@inject(Symbol(nameof(Weapon))) weapon: Weapon) { }
}

рдпрд╣ рд╕рдВрднрд╡рддрдГ рд╡рд╛рдВрдЫрд┐рдд рдкреНрд░рднрд╛рд╡ рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рд╣рд░ рдмрд╛рд░ Symbol рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдпрд╣ рдПрдХ рдирдпрд╛ рдЕрджреНрд╡рд┐рддреАрдп рдореВрд▓реНрдп рдмрдирд╛рддрд╛ рд╣реИ

Symbol("x") === Symbol("x") // false

рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдпрд╣ рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЗрдВрдЬреЗрдХреНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдк рдЗрд╕рдХреЗ рд▓рд┐рдП рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рднреА рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ:

@injectable()
class Ninja {
    constructor(@inject(nameof(Weapon)) weapon: Weapon) { }
}

рдпрджрд┐ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ C# рдХреЗ nameof рдСрдкрд░реЗрдЯрд░ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реИ, рддреЛ рдЗрд╕рдХрд╛ рдкрд░рд┐рдгрд╛рдо @inject("Weapon") , рдЬреЛ рдЫрд┐рдкреА рд╣реБрдИ рд╡реИрд╢реНрд╡рд┐рдХ рдирд┐рд░реНрднрд░рддрд╛ рдФрд░ рдЯреЛрдХрди рдЯрдХрд░рд╛рд╡ рдХрд╛ рдкрд░рд┐рдЪрдп рджреЗрдЧрд╛ред

рдХреБрдЫ рдЗрд╕ рддрд░рд╣

interface Weapon {
    hit(): string;
}
const Weapon = Symbol();
export default Weapon;

рдмреЗрд╣рддрд░ рд▓рдЧрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рддрдм рд╕реЗ рдпрд╣ рдЕрднреА рднреА рдЖрджрд░реНрд╢ рдирд╣реАрдВ рд╣реИред рд╕рдорд╕реНрдпрд╛ рд╡рд┐рд▓рдп рдХреА рдШреЛрд╖рдгрд╛ рдХреЛ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдирд╛рдореЛрдВ рдХреЛ рд╕рд┐рдВрдХ рдореЗрдВ рд░рдЦ рд░рд╣реА рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдореВрд▓реНрдпреЛрдВ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдирд╣реАрдВ рд╣реИред

nameof рдЪрд╛рд╣рдиреЗ рдХреЗ рдФрд░ рднреА рдХрдИ рдХрд╛рд░рдг рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ DI рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╣реИред

@aluanhaddad

рдпрд╣ рд╕рдВрднрд╡рддрдГ рд╡рд╛рдВрдЫрд┐рдд рдкреНрд░рднрд╛рд╡ рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рд╣рд░ рдмрд╛рд░ рдЬрдм рдкреНрд░рддреАрдХ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рдпрд╣ рдПрдХ рдирдпрд╛ рдЕрдиреВрдард╛ рдореВрд▓реНрдп рдмрдирд╛рддрд╛ рд╣реИ

рдЖрд╣ рд╣рд╛рдБ, рдпрд╣ рд╕рдЪ рд╣реИред Symbol.for рдЗрд╕реЗ рдареАрдХ рдХрд░ рджреЗрдЧрд╛ , рд▓реЗрдХрд┐рди рдЬреИрд╕рд╛

рдЗрд╕рдХрд╛ рдкрд░рд┐рдгрд╛рдо @inject("Weapon") , рдЬреЛ рдЫрд┐рдкреА рд╣реБрдИ рд╡реИрд╢реНрд╡рд┐рдХ рдирд┐рд░реНрднрд░рддрд╛ рдФрд░ рдЯреЛрдХрди рдЯрдХрд░рд╛рд╡ рдХрд╛ рдкрд░рд┐рдЪрдп рджреЗрдЧрд╛ред

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

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

+1

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

function nameOf<T>(obj: T) {
  let name: string | undefined;

  const makeCopy = (obj: any): any => {
    const copy = {};
    for (const key in obj) {
      Object.defineProperty(copy, key, {
        get() {
          name = key;
          const value = obj[key];
          if (value && typeof value === "object") {
            return makeCopy(value);
          }
          return value;
        }
      });
    }
    return copy;
  };

  return (accessor: { (x: T): any }): string | undefined => {
    name = undefined;
    accessor(makeCopy(obj));
    return name;
  };
}

function pathOf<T>(obj: T) {
  let path: string[] = [];

  const makeCopy = (obj: any): any => {
    const copy = {};
    for (const key in obj) {
      Object.defineProperty(copy, key, {
        get() {
          path.push(key);
          const value = obj[key];
          if (value && typeof value === "object") {
            return makeCopy(value);
          }
          return value;
        }
      });
    }
    return copy;
  };

  return (accessor: { (x: T): any }): string[] => {
    path = [];
    accessor(makeCopy(obj));
    return path;
  };
}

рдЙрджрд╛рд╣рд░рдг рдЙрдкрдпреЛрдЧ:
screen shot 2018-02-26 at 15 59 00

рдЬрдм рдпрд╣ рдЯрд╛рдЗрдк-рд▓реЗрд╡рд▓ рдкрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рддреЛ рдпрд╣ рдПрдХреНрд╕рдкреНрд░реЗрд╢рди-рд▓реЗрд╡рд▓ рдСрдкрд░реЗрдЯрд░ рдХреНрдпреЛрдВ рд╣реИ?

рдЗрд╕ рдХрджрд░:

type Meme = {}
type S = nameof Meme // NameOf<Meme> perhaps better?

const wrong: S = "wrong" // Type '"wrong"' is not assignable to type '"Meme"'.
const ok: S = "Meme"

@goodmind рдкреГрдереНрд╡реА рдкрд░ рдЖрдк "рдореЗрдореЗ" (рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рд░реВрдк рд╕реЗ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ) рдХрд╛ рдирд╛рдо рдПрдХ рдкреНрд░рдХрд╛рд░ рд╕реЗ рдХреНрдпреЛрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ? рдЗрд╕рдХрд╛ рдХреЛрдИ рдЕрд░реНрде рдирд╣реА рдмрди рд░рд╣рд╛ рд╣реИред рдХреНрдпрд╛ рдЖрдкрдХрд╛ рдорддрд▓рдм "typeof" рд╕реЗ рдерд╛?

const Why_does_TypeScript_not_have_this_yet: Explanation = { provided: false, reason: null };
console.log(`${nameof(Why_does_TypeScript_not_have_this_yet)}?`);
console.log(Why_does_TypeScript_not_have_this_yet);

if (!Why_does_TypeScript_not_have_this_yet.provided && (new Date()).getFullYear() >= 2018)
    this.me.sad = true;

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

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ... рдпрджрд┐ #14419 ("рдХрд╕реНрдЯрдо рдЯреНрд░рд╛рдВрд╕рдлреЙрд░реНрдорд░ рдХреЗ рд▓рд┐рдП рдкреНрд▓рдЧрдЗрди рд╕рдорд░реНрдерди") рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рддреЛ рд╣рдо nameof рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдПрдХ рдорд╛рдирдХ nameof рд╕реЗ рдЕрдзрд┐рдХ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ # 14419 рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рд╣рдо рдкрд░рд┐рд╡рд░реНрддрди рдкреНрд▓рдЧрдЗрди (рдЙрджрд╛рд╣рд░рдг рдХреЗ nameof рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдХреНрд╖рдо рд╣реЛ рдЬрд╛рдПрдЧрд╛ рдпрд╣рд╛рдБ tsconfig.json рдореЗрдВ):

{
  "compilerOptions": {
    "customTransformers": {
      "before": ["node_modules/ts-nameof"]
    }
  }
}

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

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

_р▓а

рдпрд╣рд╛рдВ рдПрдХ рд░рдирдЯрд╛рдЗрдо рд╕рдВрд╕реНрдХрд░рдг рд╣реИ рдЬреЛ рдореЗрд░реА рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:

/** Returns the name of a namespace or variable reference at runtime. */
function nameof(selector: () => any, fullname = false) {
    var s = '' + selector;
    var m = s.match(/return\s+([A-Z$_.]+)/i)
        || s.match(/.*?(?:=>|function.*?{)\s*([A-Z$_.]+)/i);
    var name = m && m[1] || "";
    return fullname ? name : name.split('.').reverse()[0];
}

рдЕрдЧрд░ рдиреЗрдорд╕реНрдкреЗрд╕ рдПрдмреАрд╕реА рд╣реИ рдФрд░ 'рд╕реА' рд╕реНрдХреЛрдк рдХреЗ рдЕрдВрджрд░ рд╣реИ:
рдЙрдкрдпреЛрдЧ: nameof(()=>A.B.C) // (рд░рд┐рдЯрд░реНрди "рд╕реА")
рдЙрдкрдпреЛрдЧ: nameof(()=>A.B.C, true) // ("рдПрдмреАрд╕реА" рд▓реМрдЯрд╛рддрд╛ рд╣реИ)

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

+1
рдЙрд╕ рдлреАрдЪрд░ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рдмрд╣реБрдд рдорджрджрдЧрд╛рд░ рд╣реЛрдЧрд╛ред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдХреЗрд╕ рдХрд╛ рдкреНрд░рдпреЛрдЧ рдХрд░реЗрдВ:

ngOnChanges(changes: SimpleChanges) {
    let itemPropName: keyof MapComponent<T> = "items";
    if (changes[itemPropName])
      this.setItems();

    let centerCoordsPropName: keyof MapComponent<T> = "centerCoords";
    if (changes[centerCoordsPropName])
      this.goToCoordinates();
  }

@ рдЗрдВрдЬреЗрдХреНрд╢рди рдпреЛрдЧреНрдп ()
рд╡рд░реНрдЧ рдирд┐рдВрдЬрд╛ {
рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░(@рдЗрдВрдЬреЗрдХреНрдЯ (рдирд╛рдо (рд╣рдерд┐рдпрд╛рд░)) рд╣рдерд┐рдпрд╛рд░: рд╣рдерд┐рдпрд╛рд░) { }
}

рдареАрдХ рд╡рд╣реА рдЬреЛ рдореИрдВ рдЪрд╛рд╣рддрд╛ рд╣реВрдБ

@rayncc рдХреЛ рдпрд╣рд╛рдВ nameof рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдпрджрд┐ рдЖрдк рдПрдХ рдРрд╕реЗ рдврд╛рдВрдЪреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдбреЗрдХреЛрд░реЗрдЯрд░ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ IOC, рдХреЛрдгреАрдп 2+, рдпрд╛ @fluffy-spoon/inverse ред

@ffMathy

рдореИрдВ рдЕрд╕рд╣рдордд рд╣реВрдВ, nameof рдЗрдВрдЯрд░рдлреЗрд╕ рдЗрдВрдЬреЗрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛, рдЬреЛ рдХреЗрд╡рд▓ рдирд╛рдо рдореЗрдВ рдореМрдЬреВрдж рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЬреЗрдПрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдирд╣реАрдВред рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдЖрдк @Inject(MyInterface) рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ, рдмрд▓реНрдХрд┐ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдЖрдкрдХреЛ @Inject('MyInterface') ред рдпрджрд┐ nameof рдХрдо рд╕реЗ рдХрдо рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╣реЛрддрд╛, рддреЛ рд╣рдо @Inject(nameof MyInterface) , рдЬреЛ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ (рдЬреЛ рдЯрд╛рдЗрдкреЛ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╡рдг рд╣реЛрддрд╛ рд╣реИ) рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рдл рд╣реЛрдЧрд╛, рдФрд░ рдЗрд╕рд╕реЗ рднреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рд░рд┐рдлреИрдХреНрдЯрд░ рдХреЗ рд╕рд╛рде рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред

╨б# рдореЗрдВ nameof рдХреНрдпреЛрдВ рди рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдПрдХ рдЬреИрд╕реЗ рдлреАрдЪрд░ рдЬреЛрдбрд╝реЗ рдЬрд╛рдПрдВ? рдпрд╣ рдмрд╣реБрдд рдорджрджрдЧрд╛рд░ рд╣реЛрдЧрд╛ред рдЕрдЧрд░ рдХреЛрдб рдордЬрдмреВрддреА рдореЗрдВ рд╕реБрдзрд╛рд░ рд╣реЛрдЧрд╛ред рдпрд╛рдиреА if (protoPropertyIsSet(msg, "expiration_utc_time")) рдмрдЬрд╛рдп рд╣рдо рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ
if (protoPropertyIsSet(msg, nameof(msg.expiration_utc_time))) ред

@stasberkov C# рдЙрдирдХреЗ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рдкреВрд░реНрдг рдирд┐рдпрдВрддреНрд░рдг рдореЗрдВ рд╣реИ, рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ JS рдФрд░ рднрд╡рд┐рд╖реНрдп рдХреЗ рдХрд┐рд╕реА рднреА JS рд╡рд┐рдХрд╛рд╕ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдЯрд┐рдк-рдЯреЛ рдХрд░рдирд╛ рд╣реИред Enums рдХреЛ рдЫреЛрдбрд╝рдХрд░, рдЯрд╛рдЗрдк рдПрдиреЛрдЯреЗрд╢рди рдФрд░ рдЯрд╛рдЗрдк рдПрд╕реЗрд╕рд░ рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рд▓реЗрд╡рд▓ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рдкреНрд░рдореБрдЦ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд╣реИрдВред рдХрд┐рд╕реА рднреА рдирдП рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╕реНрддрд░ рдХреЗ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдореЗрдВ JS рд╕реЗ рдЕрд▓рдЧ рд╣реЛрдиреЗ рдФрд░ TS рдХреЛ JS рдХреЗ рд╕рд╛рде рдХрд┐рд╕реА рд╕реНрддрд░ рдкрд░ рдЕрд╕рдВрдЧрдд рдмрдирд╛рдиреЗ рдХрд╛ рдЦрддрд░рд╛ рд╣реЛрддрд╛ рд╣реИред рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ nameof рдЬреЛрдбрд╝рдирд╛ рдХреЛрдИ рдЖрд╕рд╛рди рдирд┐рд░реНрдгрдп рдирд╣реАрдВ рд╣реИред рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдорд╛рдореВрд▓реА рд╣реИ, рд▓реЗрдХрд┐рди рд▓рдВрдмреА рдЕрд╡рдзрд┐ рдХреЗ рдирд┐рд╣рд┐рддрд╛рд░реНрде рд╡рд╛рдкрд╕ рдХрд╛рдЯ рд╕рдХрддреЗ рд╣реИрдВред

@stasberkov C# рдЙрдирдХреЗ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рдкреВрд░реНрдг рдирд┐рдпрдВрддреНрд░рдг рдореЗрдВ рд╣реИ, рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ JS рдФрд░ рднрд╡рд┐рд╖реНрдп рдХреЗ рдХрд┐рд╕реА рднреА JS рд╡рд┐рдХрд╛рд╕ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдЯрд┐рдк-рдЯреЛ рдХрд░рдирд╛ рд╣реИред Enums рдХреЛ рдЫреЛрдбрд╝рдХрд░, рдЯрд╛рдЗрдк рдПрдиреЛрдЯреЗрд╢рди рдФрд░ рдЯрд╛рдЗрдк рдПрд╕реЗрд╕рд░ рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рд▓реЗрд╡рд▓ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рдкреНрд░рдореБрдЦ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд╣реИрдВред рдХрд┐рд╕реА рднреА рдирдП рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╕реНрддрд░ рдХреЗ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдореЗрдВ JS рд╕реЗ рдЕрд▓рдЧ рд╣реЛрдиреЗ рдФрд░ TS рдХреЛ JS рдХреЗ рд╕рд╛рде рдХрд┐рд╕реА рд╕реНрддрд░ рдкрд░ рдЕрд╕рдВрдЧрдд рдмрдирд╛рдиреЗ рдХрд╛ рдЦрддрд░рд╛ рд╣реЛрддрд╛ рд╣реИред рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ nameof рдЬреЛрдбрд╝рдирд╛ рдХреЛрдИ рдЖрд╕рд╛рди рдирд┐рд░реНрдгрдп рдирд╣реАрдВ рд╣реИред рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдорд╛рдореВрд▓реА рд╣реИ, рд▓реЗрдХрд┐рди рд▓рдВрдмреА рдЕрд╡рдзрд┐ рдХреЗ рдирд┐рд╣рд┐рддрд╛рд░реНрде рд╡рд╛рдкрд╕ рдХрд╛рдЯ рд╕рдХрддреЗ рд╣реИрдВред

рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ nameof(XXX) рдХреЛ рдПрдХ рд╕реНрдерд┐рд░ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЬреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ JS рдХреЗ рд╕рд╛рде рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдВрдЧрдд рд╣реИ

@rayncc рдЙрд╕рдХрд╛ рдХреНрдпрд╛ рдорддрд▓рдм рдерд╛: рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдЬреЗрдПрд╕ рдмрд╛рдж рдореЗрдВ nameof рдСрдкрд░реЗрдЯрд░ рдореЗрдВ рдЬреЛрдбрд╝рддрд╛ рд╣реИ рдЬреЛ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ nameof рдСрдкрд░реЗрдЯрд░ рд╕реЗ рдЕрд▓рдЧ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддрд╛ рд╣реИ?

рдлрд┐рд░ рдПрдХ рд╕рдВрдШрд░реНрд╖ рд╣реЛрдЧрд╛, рдЬрд┐рд╕реЗ рдХрд┐рд╕реА рддрд░рд╣ рд╕реБрд▓рдЭрд╛рдирд╛ рд╣реЛрдЧрд╛ (рдФрд░ рдЙрд╕рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдЖрд╕рд╛рди рдЬрд╡рд╛рдм рдирд╣реАрдВ рд╣реИрдВ)ред

рджреВрд╕рд░реА рдУрд░, nameof JS рдореЗрдВ рдЖрд░рдХреНрд╖рд┐рдд рд╢рдмреНрдж рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП TC39 рдХреЗ рдЗрд╕реЗ рдПрдХ рдСрдкрд░реЗрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХрд╛рдлреА рдХрдо рд╣реИред рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдЬреЛрдбрд╝рдирд╛ рдХрд╛рдлреА рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИред

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

рдЗрд╕рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕рд╛рд░реЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдиреЗрдЯрд┐рд╡рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреА InformPropertyChange( nameof(property) ) рд╡рд┐рдзрд┐ред BTW, рдЙрдиреНрд╣реЛрдВрдиреЗ рдкрд╣рд▓реЗ рдбреЗрдХреЛрд░реЗрдЯрд░ рд╕рд╛рдорд╛рди рдХреЗ рд╕рд╛рде рдРрд╕рд╛ рдХрд┐рдпрд╛ рд╣реИред рдЗрд╕рдХрд╛ рд╕рдорд╛рдзрд╛рди рдпрд╣ рдерд╛ рдХрд┐ рдЗрд╕реЗ 'рдкреНрд░рдпреЛрдЧрд╛рддреНрдордХ' рд╕рдВрдХрд▓рдХ рдзреНрд╡рдЬ рдХреЗ рдкреАрдЫреЗ рдЫрд┐рдкрд╛ рджрд┐рдпрд╛ рдЬрд╛рдПред

@markusmauch рдпреЛрдЧреНрдп, рджреЗрдЦреЛ рдпрд╣ рдЙрдирдХреЗ рд▓рд┐рдП рдХреИрд╕реЗ рд╕рдорд╛рдкреНрдд рд╣реБрдЖ

рд╕рдЬреНрдЬрд╛рдХрд╛рд░ рдЕрдиреБрд╕рд░рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫрд╛ рдЙрджрд╛рд╣рд░рдг рдирд╣реАрдВ рд╣реИ

рджреВрд╕рд░реА рдУрд░, JS рдореЗрдВ nameof рдПрдХ рдЖрд░рдХреНрд╖рд┐рдд рд╢рдмреНрдж рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП TC39 рдХреЗ рдЗрд╕реЗ рдПрдХ рдСрдкрд░реЗрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХрд╛рдлреА рдХрдо рд╣реИред

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

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

рдЬрдмрдХрд┐ nameof рдСрдкрд░реЗрдЯрд░ рдЬрд┐рддрдирд╛ рд╕реБрдВрджрд░ рдирд╣реАрдВ рд╣реИ, рд╣рдо keyof рдХрд╛ рдЙрдкрдпреЛрдЧ рдлрд╝рдВрдХреНрд╢рди IMO рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреБрдЫ рдРрд╕рд╛ рд╣реА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

function nameof<T>(k: keyof T) : keyof T {
    return k
}
class Person {
    static defaultName: string;
    name!: string;
    studies!: {
        highSchool: string
        unversity: string
    }
}
let foo : { bar: { baz : { x: number }}}
let k1 = nameof<Person>("name")
let k2 = nameof<Person['studies']>("unversity")
let k3 = nameof<typeof Person>("defaultName")
let k4 = nameof<typeof foo['bar']['baz']>("x")

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

@dragomirtitian рднрд▓реЗ рд╣реА {рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реБрд░рдХреНрд╖рд┐рдд рджреГрд╖реНрдЯрд┐рдХреЛрдг рдореЗрдВ рдирд╛рдо рд╕реЗ рд╕рджрд╕реНрдпреЛрдВ рддрдХ рдкрд╣реБрдВрдЪ} рд╕рдорд╕реНрдпрд╛ (рдЬреЛ рдХрдорд╛рд▓ рд╣реИ) рдХреЛ рдкреВрд░рд╛ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рд╕рдВрдХрд▓рдХ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рд░рд┐рдлреИрдХреНрдЯрд░рд┐рдВрдЧ рдкрд░ рдорджрдж рдирд╣реАрдВ рдХрд░реЗрдЧрд╛, рди рд╣реА рдпрд╣ рдЖрдИрдбреАрдИ рдХреЛ рдХрд┐рд╕реА рд╕рджрд╕реНрдп рдХреЗ рд╕рдВрджрд░реНрднреЛрдВ рдХреЛ рджреЗрдЦрдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛ рдкрд╛рда рдЦреЛрдЬ рдХрд┐рдП рдмрд┐рдирд╛ред

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

@dragomirtitian рдЗрд╕ рдореБрджреНрджреЗ рдХреЗ рднреАрддрд░ рдзреНрд╡рд╕реНрдд рдкрджреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХреА рдЧрдИ рд╣реИред

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

рднреВрддрдкреВрд░реНрд╡ред рдирд┐рд░реНрднрд░рддрд╛ рдЗрдВрдЬреЗрдХреНрд╢рди рдврд╛рдВрдЪреЗ ( @inject(nameof(Something)) ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рдЕрдЪреНрдЫрд╛ рддрд░реНрдХ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдлреЗрдВрдХрдирд╛ ...

function add(a: number, b: number) {
    throwArgumentErrorIfNaN(a, nameof(a));
    throwArgumentErrorIfNaN(b, nameof(b));

    return a + b;
}

..., рдкрд░реАрдХреНрд╖рдг рд╡рд┐рд╡рд░рдг рдирд╛рдореЛрдВ рдореЗрдВ...

import { CustomCollection } from "some-library";

describe(nameof(CustomCollection), () => {
    describe(nameof<CustomCollection>(c => c.add), () => {
    });
});

..., рд▓реЙрдЧ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рд▓рд┐рдЦрддреЗ рд╕рдордп ( logger.log(nameof(ClassName), LogLevel.Info, "Some log message.") ), рдФрд░ рд╢рд╛рдпрдж рдЕрдзрд┐рдХред

nameof рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдХреБрдЫ рд▓рд╛рдн рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореЗрд░реА рд░рд╛рдп рдореЗрдВ рдЗрд╕реЗ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рджреНрд╡рд╛рд░рд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕реБрдЭрд╛рд╡ рдЗрд╕ рджрд┐рд╢рд╛рдирд┐рд░реНрджреЗрд╢ рдХреЛ рдкреВрд░рд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ:

  • рдпрд╣ рднрд╛рд╡реЛрдВ рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╡рд┐рднрд┐рдиреНрди JS рдХреЛ рдЙрддреНрд╕рд░реНрдЬрд┐рдд рдХрд┐рдП рдмрд┐рдирд╛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдореЗрд░рд╛ рдмреБрд░рд╛, рдЗрд╕ рдЧреИрд░-рд▓рдХреНрд╖реНрдп рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪ рд░рд╣рд╛ рдерд╛:

> * рдкреНрд░реЛрдЧреНрд░рд╛рдо рдореЗрдВ рд░рди-рдЯрд╛рдЗрдо рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рдирдХрд╛рд░реА рдЬреЛрдбрд╝реЗрдВ рдпрд╛ рдЙрд╕ рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░реЗрдВ, рдпрд╛ рдЯрд╛рдЗрдк рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдХреЛрдб рдЙрддреНрд╕рд░реНрдЬрд┐рдд рдХрд░реЗрдВред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдкреИрдЯрд░реНрди рдХреЛ рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░реЗрдВ рдЬрд┐рдиреНрд╣реЗрдВ рд░рди-рдЯрд╛рдЗрдо рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

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

рдЗрд╕рдХреА рдЬрдЧрд╣ рд╢рд╛рдпрдж рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдХрдВрдкрд╛рдЗрд▓рд░ рдкреНрд▓рдЧрдЗрди (рдмреЗрд╢рд░реНрдо рдкреНрд▓рдЧ) рд╣реЛрдирд╛ рд╣реИ рдЬрд┐рд╕реЗ рд▓реЛрдЧ рдЕрдкрдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд░рдирд╛ рдЪреБрди рд╕рдХрддреЗ рд╣реИрдВред

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

const props = {
  name : "Little John",
  slogan: "Rolls are rolls and tools are tools."
}

console.log(nameof`${props}.slogan`) // slogan
console.log(nameof`${props}.foo`) // ERROR: Property 'foo' not found on object 

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

nameof рдЬреЛрдбрд╝рдиреЗ рд╕реЗ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдХреБрдЫ рд▓рд╛рдн рд╣реИ, рд▓реЗрдХрд┐рди рдореЗрд░реА рд░рд╛рдп рдореЗрдВ рдЗрд╕реЗ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рджреНрд╡рд╛рд░рд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕реБрдЭрд╛рд╡ рдЗрд╕ рджрд┐рд╢рд╛рдирд┐рд░реНрджреЗрд╢ рдХреЛ рдкреВрд░рд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ:

  • рдпрд╣ рднрд╛рд╡реЛрдВ рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╡рд┐рднрд┐рдиреНрди JS рдХреЛ рдЙрддреНрд╕рд░реНрдЬрд┐рдд рдХрд┐рдП рдмрд┐рдирд╛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдХреНрдпрд╛ рдЖрдк рд╕реНрдкрд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕ рд╕рдВрджрд░реНрдн рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди JS рдХрд╛ рдХреНрдпрд╛ рдЕрд░реНрде рд╣реИ? рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ nameof<InterfaceA> рдФрд░ nameof<InterfaceB> рджреЛрдиреЛрдВ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рдЖрдЙрдЯрдкреБрдЯ рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдорд╛рди рд╣реЛрддреЗ рд╣реИрдВ рд▓реЗрдХрд┐рди рдПрдХ рд╣реА рдкреНрд░рдХрд╛рд░ рд╕рд╛рдЭрд╛ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдХреНрдпрд╛ рдЗрд╕реЗ рдЕрд▓рдЧ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ?

@JLWalsh рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдЧрд▓рдд рддрд░реАрдХреЗ рд╕реЗ рдкрдврд╝рд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЬреЗрдПрд╕ рдЙрддреНрд╕рд░реНрдЬрд┐рдд рдирд╣реАрдВ рдХрд░рдирд╛ (рдЬрдм рдореИрдВрдиреЗ рдЗрд╕реЗ рдХреЙрдкреА рдФрд░ рдкреЗрд╕реНрдЯ рдХрд┐рдпрд╛ рддреЛ рдореИрдВ рд╕реНрдореГрддрд┐ рд╕реЗ рдЖрдзрд╛ рдЬрд╛ рд░рд╣рд╛ рдерд╛)ред рддреЛ рдПрдХ рдХреЙрд▓ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд▓реЗрдирд╛ рдФрд░ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЕрдХреНрд╖рд░ рдЙрддреНрд╕рд░реНрдЬрд┐рдд рдХрд░рдирд╛ред рдореБрдЭреЗ рдЕрдм рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЙрд╕ рдмрд┐рдВрджреБ рдХрд╛ рдЕрдм рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдЬ рдмрд╣реБрдд рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЗ рдмрд╛рдж рдореЗрд░рд╛ рджрд┐рдорд╛рдЧ рддрд▓рд╛ рд╣реБрдЖ рд╣реИред

рдореИрдВ рдЗрд╕ рдЧреИрд░-рд▓рдХреНрд╖реНрдп рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪ рд░рд╣рд╛ рдерд╛:

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

рдХреГрдкрдпрд╛ рдЗрд╕реЗ рдЬреЛрдбрд╝реЗрдВ

@rjamesnw
рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдореЗрдВ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдореИрдВрдиреЗ рдХреБрдЫ рд╕рдВрд╢реЛрдзрди рдХрд┐рдпрд╛ рд╣реИ:

function nameof(selector: () => any, fullname = false) {
    var s = '' + selector;
    var m = s.match(/return\s+([A-Z0-9$_.]+)/i)
        || s.match(/.*?(?:=>|function.*?{)\s*([A-Z0-9$_.]+)/i);
    var name = m && m[1] || "";
    return fullname ? name : name.split('.').reverse()[0];
}

рдЯреАрд╕реА39 рдереНрд░реЗрдбреНрд╕ рдХреЛ рдиреАрддрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЙрдХ рдХрд░рдирд╛ рдХреНрдпреЛрдВрдХрд┐ рдЯреАрд╕реА39 рдиреЗ рдЕрднреА рддрдХ рдРрд╕рд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ, рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╢рд┐рдХрд╛рдпрдд рдХрд░рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмрд╛рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реИ

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

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

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

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

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

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

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