рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдбреЗрд╡рд▓рдкрд░ рдХреА 5 рдЖрдЬреНрдЮрд╛рдПрдБ

рдЫрд╡рд┐


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


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


рдЭреВрда рдордд рдмреЛрд▓реЛ


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


рдирд┐рдореНрди рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, getUser рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдкреНрд░рдХрд╛рд░ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдРрд╕реА рд╡рд╕реНрддреБ рд▓реМрдЯрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╣рдореЗрд╢рд╛ рджреЛ рдЧреБрдг рд╣реЛрддреЗ рд╣реИрдВ: name рдФрд░ age ред


 interface User { name: string; age: number; } function getUser(id: number): User { /* ... */ } 

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


 function getUser(id: number): User { return { age: 12 } as User; } 

рдРрд╕рд╛ рдордд рдХрд░реЛ! рдпрд╣ рдПрдХ FALSE рд╣реИред рдЗрд╕ рддрд░рд╣ рдХреЗ рдХреЛрдб рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рдХреЗ, рдЖрдк рдЕрдиреНрдп рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП LIE (рдЬреЛ рдЕрдкрдиреЗ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдЕрдкрдиреЗ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ)ред рдЙрдиреНрд╣реЗрдВ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ getUser рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдП рдЧрдП рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рд╣рдореЗрд╢рд╛ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХрд╛ name рдлрд╝реАрд▓реНрдб рд╣реЛрдЧрд╛ред рд▓реЗрдХрд┐рди рд╡рд╣ рд╡рд╣рд╛рдБ рдирд╣реАрдВ рд╣реИ! рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЬрдм рдЖрдкрдХрд╛ рд╕рд╣рдХрд░реНрдореА getUser(1).name.toString() рд▓рд┐рдЦрддрд╛ рд╣реИ рддреЛ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ? рдЖрдк рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ ...


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


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


рдЭреВрда рдордд рдмреЛрд▓реЛред рдЕрдкрдиреЗ рдЕрдиреБрдмрдВрдзреЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░реЗрдВред


рд╕рдЯреАрдХ рд░рд╣реЗрдВ


рдкреНрд░рдХрд╛рд░ рдкреНрд░рд▓реЗрдЦрди рд╣реИрдВред рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рджрд╕реНрддрд╛рд╡реЗрдЬреАрдХрд░рдг рдХрд░рддреЗ рд╕рдордп, рдХреНрдпрд╛ рдЖрдк рдЕрдзрд┐рдХ рд╕реЗ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдирд╣реАрдВ рдмрддрд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ?


 //   function getUser(id) { /* ... */ } //     : name  age function getUser(id) { /* ... */ } //  id       id , //     : name  age. //     undefined. function getUser(id) { /* ... */ } 

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


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


 function getUserType(id: number): string { /* ... */ } function getUserType(id: number): 'standard' | 'premium' | 'admin' { /* ... */ } 

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


рдЖрдЗрдП рдПрдХ рдЕрдзрд┐рдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред State рдкреНрд░рдХрд╛рд░ рдШрдЯрдХ рдХреА рд╕реНрдерд┐рддрд┐ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдмреИрдХрдПрдВрдб рд╕реЗ рдХреБрдЫ рдбреЗрдЯрд╛ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рддрд╛ рд╣реИред рдХреНрдпрд╛ рдпрд╣ рдкреНрд░рдХрд╛рд░ рд╕рд╣реА рд╣реИ?


 interface State { isLoading: boolean; data?: string[]; errorMessage?: string; } 

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


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


 type State = | { status: 'loading' } | { status: 'successful', data: string[] } | { status: 'failed', errorMessage: string }; 

рдЕрдм рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЧреНрд░рд╛рд╣рдХ рдХреЗ рдкрд╛рд╕ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рд╣реИ: рдЙрд╕реЗ рдЕрдм рд╕рдВрдкрддреНрддрд┐рдпреЛрдВ рдХреЗ рдЧрд▓рдд рд╕рдВрдпреЛрдЬрди рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред


рд╕рдЯреАрдХ рд░рд╣реЗрдВред рдЕрдкрдиреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдкрд░ рдЕрдзрд┐рдХ рд╕реЗ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдкрд╛рд╕ рдХрд░реЗрдВред


рдкреНрд░рдХрд╛рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░реЗрдВ


рдЪреВрдВрдХрд┐ рдкреНрд░рдХрд╛рд░ рдПрдХ рдЕрдиреБрдмрдВрдз рдФрд░ рдкреНрд░рд▓реЗрдЦрди рджреЛрдиреЛрдВ рд╣реИрдВ, рд╡реЗ рдЖрдкрдХреЗ рдХрд╛рд░реНрдпреЛрдВ (рдпрд╛ рд╡рд┐рдзрд┐рдпреЛрдВ) рдХреЛ рдбрд┐рдЬрд╛рдЗрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдорд╣рд╛рди рд╣реИрдВред


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


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


рд░рд┐рдПрдХреНрдЯ рдЬреЗрдПрд╕ рдореЗрдВ рд╣рд╛рдпрд░ рдСрд░реНрдбрд░ рдХрдВрдкреЛрдиреЗрдВрдЯреНрд╕ (HOC) рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рд╣реИред рдпреЗ рдРрд╕реЗ рдХрд╛рд░реНрдп рд╣реИрдВ рдЬреЛ рдХрд┐рд╕реА рддрд░рд╣ рд╕реЗ рджрд┐рдП рдЧрдП рдШрдЯрдХ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк рдПрдХ рдЙрдЪреНрдЪ-рдХреНрд░рдо рдШрдЯрдХ withLoadingIndicator рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдХрд┐рд╕реА рдореМрдЬреВрджрд╛ рдШрдЯрдХ рдореЗрдВ рд▓реЛрдбрд┐рдВрдЧ рд╕рдВрдХреЗрддрдХ рдЬреЛрдбрд╝рддрд╛ рд╣реИред


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


ComponentType рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ рд╣реИ, рдЬреЛ рдШрдЯрдХ рдЧреБрдгреЛрдВ рдХреЗ рдкреНрд░рдХрд╛рд░ рджреНрд╡рд╛рд░рд╛ рдкреИрд░рд╛рдореАрдЯрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред withLoadingIndicator рдПрдХ рдШрдЯрдХ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдПрдХ рдирдпрд╛ рдШрдЯрдХ рджреЗрддрд╛ рд╣реИ рдЬреЛ рдореВрд▓ рдШрдЯрдХ рдпрд╛ рд▓реЛрдбрд┐рдВрдЧ рд╕рдВрдХреЗрддрдХ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред рдирдИ рддрд╛рд░реНрдХрд┐рдХ рд╕рдВрдкрддреНрддрд┐ - isLoading рдХреЗ рдореВрд▓реНрдп рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХреНрдпрд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдП, рдЗрд╕ рдкрд░ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдЧрдпрд╛ред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рджрд┐рдП рдЧрдП рдШрдЯрдХ рдХреЛ рдореВрд▓ рдПрдХ рдХреЗ рд╕рдорд╛рди рдЧреБрдгреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдХреЗрд╡рд▓ рдирдИ isLoading рд╕рдВрдкрддреНрддрд┐ рдЬреЛрдбрд╝реА рдЬрд╛рддреА рд╣реИред


рд╣рдо рдЯрд╛рдЗрдк рдХреЛ рдЕрдВрддрд┐рдо рд░реВрдк рджреЗрдВрдЧреЗред withLoadingIndicator рдЯрд╛рдЗрдк рдХрд╛ рдПрдХ рдШрдЯрдХ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ ComponentType<P> , рдЬрд╣рд╛рдБ P рд╕рдВрдкрддреНрддрд┐ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИред withLoadingIndicator P & { isLoading: boolean } рдкреНрд░рдХрд╛рд░ рдХреЗ рдЙрдиреНрдирдд рдЧреБрдгреЛрдВ рд╡рд╛рд▓рд╛ рдПрдХ рдШрдЯрдХ рджреЗрддрд╛ рд╣реИред


 const withLoadingIndicator = <P>(Component: ComponentType<P>) : ComponentType<P & { isLoading: boolean }> => ({ isLoading, ...props }) => { /* ... */ } 

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


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


рд╕рдЦреНрддреА рдмрд░рддреЗрдВ


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


рд╕рдВрдХрд▓рдХ - --strict рдлреНрд▓реИрдЧ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдХреЗ рдЖрдк рдЗрд╕реЗ рдФрд░ рднреА рдмреЗрд╣рддрд░ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдПрдХ рдореЗрдЯрд╛ рдлрд╝реНрд▓реИрдЧ рд╣реИ --noImplicitAny рд╕рднреА рд╕рдЦреНрдд рдкреНрд░рдХрд╛рд░ рдХреЗ рдЪреЗрдХрд┐рдВрдЧ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЛ --noImplicitAny рдХрд░рддрд╛ рд╣реИ: --noImplicitAny , --noImplicitThis , --alwaysStrict , --strictBindCallApply , --strictNullChecks , --strictFunctionTypes рдФрд░ --strictPropertyInitialization ред


рдЭрдВрдбреЗ рдХреНрдпрд╛ рдХрд░рддреЗ рд╣реИрдВ? рд╕рд╛рдорд╛рдиреНрдпрддрдпрд╛, рдЙрдирдХреЗ рд╢рд╛рдорд┐рд▓ рд╣реЛрдиреЗ рд╕реЗ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕рдВрдХрд▓рди рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд╡реГрджреНрдзрд┐ рд╣реЛрддреА рд╣реИред рдФрд░ рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реИ! рдЕрдзрд┐рдХ рд╕рдВрдХрд▓рди рддреНрд░реБрдЯрд┐рдпрд╛рдВ - рд╕рдВрдХрд▓рдХ рд╕реЗ рдЕрдзрд┐рдХ рд╕рд╣рд╛рдпрддрд╛ред


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


 function getUser(id: number): User { if (id >= 0) { return { name: 'John', age: 12 }; } else { return undefined; } } 

getUser рдкреНрд░рдХрд╛рд░ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рд╣рдореЗрд╢рд╛ User рдХреЗ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рд▓реМрдЯрд╛рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рджреЗрдЦреЗрдВ: рдПрдХ рдлрд╝рдВрдХреНрд╢рди undefined рднреА рд▓реМрдЯ рд╕рдХрддрд╛ рд╣реИ!


рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдПрдХ рд╕рдВрдХрд▓рди рддреНрд░реБрдЯрд┐ рдореЗрдВ --strictNullChecks рдзреНрд╡рдЬ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рдирд╛:


 Type 'undefined' is not assignable to type 'User'. 

рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрдВрдкрд╛рдЗрд▓рд░ рдЭреВрда рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рддрд╛ рд╣реИред рдЗрд╕ рддреНрд░реБрдЯрд┐ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдмрд╕ рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ рдкреВрд░реА рд╕рдЪреНрдЪрд╛рдИ рдмрддрд╛рдПрдВ:


 function getUser(id: number): User | undefined { /* ... */ } 

рдкреНрд░рдХрд╛рд░ рдЬрд╛рдБрдЪ рдХреА рдХрдареЛрд░рддрд╛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░реЗрдВред рд╕рдВрдХрд▓рдХ рдЖрдкрдХреЛ рддреНрд░реБрдЯрд┐рдпреЛрдВ рд╕реЗ рдмрдЪрд╛рддрд╛ рд╣реИред


рдЕрдк рдЯреВ рдбреЗрдЯ рд░рдЦреЗрдВ


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


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


рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕рдВрд╕реНрдХрд░рдг 2.0 рдореЗрдВ рд╡рд┐рднреЗрджрд┐рдд рд╕рдВрдШ рдкреНрд░рдХрд╛рд░ рдкреЗрд╢ рдХрд┐рдП рдЧрдП рдереЗ (рдореИрдВрдиреЗ рдХрдорд╛рдВрдб рдореЗрдВ рдЙрдирдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рд╕рдЯреАрдХ рдХрд┐рдпрд╛ рд╣реИ )ред


рд╡рд░реНрдЬрди 3.2 рдиреЗ рдХрдВрдкрд╛рдЗрд▓рд░ --strictBindCallApply рдкреЗрд╢ рдХрд┐рдпрд╛, рдЬрд┐рд╕рдореЗрдВ bind , call рдФрд░ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ apply рд▓рд┐рдП рд╕рд╣реА рдЯрд╛рдЗрдкрд┐рдВрдЧ рд╢рд╛рдорд┐рд▓ рд╣реИред


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


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


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


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


рд╕рд╛рд░рд╛рдВрд╢


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


рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рдЖрдкрдХреЗ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЛ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рджреЗрдЦрдХрд░ рдореБрдЭреЗ рдкреНрд░рд╕рдиреНрдирддрд╛ рд╣реЛрдЧреАред


рдмреЛрдирд╕


рдХреНрдпрд╛ рдЖрдкрдХреЛ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдпрд╣ рд▓реЗрдЦ рдкрд╕рдВрдж рдЖрдпрд╛? рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рдЖрдк рднреА рдЗрд╕ рдореБрдлреНрдд рдкреАрдбреАрдПрдл рдХреЛ рдкрд╕рдВрдж рдХрд░реЗрдВрдЧреЗ: 10 рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╡рд┐рдХрд╛рд╕ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдЬреЛ рдЖрдкрдХреЗ рдХреЛрдб рдХреЛ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдмрдирд╛рддреА рд╣реИрдВред

Source: https://habr.com/ru/post/hi461565/


All Articles