рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреА рдШреЛрд╖рдгрд╛ 3.4 рдЖрд░рд╕реА

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


рдЖрд░рд╕реА рдХрд╛ рдЙрдкрдпреЛрдЧ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдЗрд╕реЗ NuGet рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╛ рдирд┐рдореНрди рдХрдорд╛рдВрдб рдХреЗ рд╕рд╛рде npm рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:


npm install -g typescript@rc 

рдЖрдк рд╕рдВрдкрд╛рджрдХ рджреНрд╡рд╛рд░рд╛ рд╕рд╣рд╛рдпрддрд╛ рднреА рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ



рдЖрдЗрдП рдЬрд╛рдиреЗрдВ рдХрд┐ 3.4 рдореЗрдВ рдирдпрд╛ рдХреНрдпрд╛ рд╣реИ!




рдпрд╣ рд▓реЗрдЦ рд╣рдорд╛рд░реЗ рдмреНрд▓реЙрдЧ рдореЗрдВред

рдмрд╛рдж рдореЗрдВ рддреЗрдЬрд╝ - --incremental рдзреНрд╡рдЬ рдХреЗ рд╕рд╛рде рдмрдирд╛рддрд╛ рд╣реИ


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


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


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


 // tsconfig.json { "compilerOptions": { "incremental": true, "outDir": "./lib" }, "include": ["./src"] } 

рдЗрди рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЗ рд╕рд╛рде рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдЬрдм рд╣рдо tsc рдЪрд▓рд╛рддреЗ рд╣реИрдВ, рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╣рдорд╛рд░реЗ рдЖрдЙрдЯрдкреБрдЯ рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА ( ./lib ) рдореЗрдВ .tsbuildinfo рдирд╛рдордХ рдПрдХ рдлрд╛рдЗрд▓ рдХреА рддрд▓рд╛рд╢ рдХрд░реЗрдЧрд╛ред рдпрджрд┐ ./lib/.tsbuildinfo рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИ, рддреЛ рдпрд╣ рдЙрддреНрдкрдиреНрди рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдРрд╕рд╛ рд╣реЛрддрд╛ рд╣реИ, рддреЛ tsc рдЙрд╕ рдлрд╛рдЗрд▓ рдХреЛ incrementally рдЯрд╛рдЗрдк-рдЪреЗрдХ рдХрд░рдиреЗ рдФрд░ рд╣рдорд╛рд░реА рдЖрдЙрдЯрдкреБрдЯ рдлрд╛рдЗрд▓реЛрдВ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдЧрд╛ред


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


 // front-end.tsconfig.json { "compilerOptions": { "incremental": true, "tsBuildInfoFile": "./buildcache/front-end", "outDir": "./lib" }, "include": ["./src"] } 

рдЬрдм рддрдХ рдХреЛрдИ рдФрд░ рдПрдХ рд╣реА рдХреИрд╢ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд▓рд┐рдЦрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рддрдм рддрдХ рд╣рдореЗрдВ рддреЗрдЬреА рд╕реЗ рд╡реГрджреНрдзрд┐рд╢реАрд▓ рдардВрдб рдХрд╛ рдЖрдирдВрдж рд▓реЗрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред


рд╕рдордЧреНрд░ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ


рд╕рдордЧреНрд░ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рд╕рд╛рде рдЗрд░рд╛рджреЗ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ ( tsconfig.json s рдХреЗ рд╕рд╛рде composite рд╕реЗрдЯ true ) рдпрд╣ рд╣реИ рдХрд┐ рд╡рд┐рднрд┐рдиреНрди рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рдмреАрдЪ рд╕рдВрджрд░реНрднреЛрдВ рдХреЛ рд╡реГрджреНрдзрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЬреИрд╕реЗ, рдорд┐рд╢реНрд░рд┐рдд рдкрд░рд┐рдпреЛрдЬрдирд╛рдПрдВ рд╣рдореЗрд╢рд╛ .tsbuildinfo рдлрд╝рд╛рдЗрд▓реЛрдВ рдХрд╛ рдЙрддреНрдкрд╛рджрди .tsbuildinfo ред


outFile


рдЬрдм outFile рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдмрд┐рд▓реНрдб рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдирд╛рдо рдЖрдЙрдЯрдкреБрдЯ рдлрд╝рд╛рдЗрд▓ рдХреЗ рдирд╛рдо рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реЛрдЧрд╛ред рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ, рдпрджрд┐ рд╣рдорд╛рд░реА рдЖрдЙрдЯрдкреБрдЯ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдлрд╝рд╛рдЗрд▓ ./output/foo.js , рддреЛ --incremental рдзреНрд╡рдЬ рдХреЗ рдиреАрдЪреЗ, рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдлрд╝рд╛рдЗрд▓ рдЙрддреНрдкрдиреНрди рдХрд░реЗрдЧрд╛ ./output/foo.tsbuildinfo ред рдКрдкрд░ рдХреЗ рд░реВрдк рдореЗрдВ, рдЗрд╕реЗ --tsBuildInfoFile рдзреНрд╡рдЬ рдХреЗ рд╕рд╛рде рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред


--incremental рдлрд╝рд╛рдЗрд▓ рд╕реНрд╡рд░реВрдк рдФрд░ рд╕рдВрд╕реНрдХрд░рдг


рдЬрдмрдХрд┐ --incremental рджреНрд╡рд╛рд░рд╛ рдЬреЗрдирд░реЗрдЯ рдХреА рдЧрдИ рдлрд╛рдЗрд▓ JSON рд╣реИ, рд▓реЗрдХрд┐рди рдлрд╛рдЗрд▓ рдХрд╛ рдорддрд▓рдм рдХрд┐рд╕реА рдЕрдиреНрдп рдЯреВрд▓ рд╕реЗ рдЦрдкрдд рдирд╣реАрдВ рд╣реИред рд╣рдо рдЗрд╕рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЗ рд▓рд┐рдП рд╕реНрдерд┐рд░рддрд╛ рдХреА рдХреЛрдИ рдЧрд╛рд░рдВрдЯреА рдирд╣реАрдВ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╣рдорд╛рд░реА рд╡рд░реНрддрдорд╛рди рдиреАрддрд┐ рдпрд╣ рд╣реИ рдХрд┐ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдХреЛрдИ рдПрдХ рд╕рдВрд╕реНрдХрд░рдг рдХрд┐рд╕реА рдЕрдиреНрдп рд╕рдВрд╕реНрдХрд░рдг рд╕реЗ рдЙрддреНрдкрдиреНрди .tsbuildinfo рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд╕рдордЭ рдирд╣реАрдВ .tsbuildinfo ред


ReadonlyArray рдФрд░ рдЖрд╕рд╛рдиреА рд╕реЗ readonly рд▓рд┐рдП рд╕реБрдзрд╛рд░


рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ 3.4 рдпрд╣ рдХреЗрд╡рд▓ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд░рдгреА рдкреНрд░рдХрд╛рд░ рдХреА рддрд░рд╣ рдереЛрдбрд╝рд╛ рдЖрд╕рд╛рди рдмрдирд╛рддрд╛ рд╣реИред


ReadonlyArray рд▓рд┐рдП рдПрдХ рдирдпрд╛ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕


ReadonlyArray рдкреНрд░рдХрд╛рд░ Array s рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдХреЗрд╡рд▓ рд╕реЗ рдкрдврд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред ReadonlyArray рд╣реИрдВрдбрд▓ рдХреЗ рд╕рд╛рде рдХреЛрдИ рднреА рдЪрд░ рд╕рд░рдгреА рдХреЗ рдХрд┐рд╕реА рднреА рддрддреНрд╡ рдХреЛ рдЬреЛрдбрд╝, рд╣рдЯрд╛ рдпрд╛ рд╣рдЯрд╛ рдирд╣реАрдВ рд╕рдХрддрд╛ рд╣реИред


 function foo(arr: ReadonlyArray<string>) { arr.slice(); // okay arr.push("hello!"); // error! } 

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд░рд╛рджреЗ рдХреЗ рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рд▓рд┐рдП Array рдХреЗ рдКрдкрд░ ReadonlyArray рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдХреНрд╕рд░ рдЕрдЪреНрдЫрд╛ рдЕрднреНрдпрд╛рд╕ рд╣реЛрддрд╛ рд╣реИ, рдпрд╣ рдЕрдХреНрд╕рд░ рдПрдХ рджрд░реНрдж рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рд╕рд░рдгрд┐рдпреЛрдВ рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рд╣реЛрддрд╛ рд╣реИред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, number[] Array<number> рдХрд╛ рдПрдХ рд╢реЙрд░реНрдЯрд╣реИрдВрдб рд╕рдВрд╕реНрдХрд░рдг рд╣реИ, рдЬрд┐рд╕ рддрд░рд╣ Date[] Array<Date> рд▓рд┐рдП рдПрдХ рд╢реЙрд░реНрдЯрд╣реИрдВрдб рд╣реИред


рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ 3.4 рд╕рд░рдгреА рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдП рд░реАрдбрд╛рдпрдирд▓реА рд╕рдВрд╢реЛрдзрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ ReadonlyArray рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдкреНрд░рд╕реНрддреБрдд рдХрд░рддрд╛ рд╣реИред


 function foo(arr: readonly string[]) { arr.slice(); // okay arr.push("hello!"); // error! } 

readonly рдЯреНрдпреВрдкрд▓реНрд╕


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


 function foo(pair: readonly [string, string]) { console.log(pair[0]); // okay pair[1] = "hello!"; // error } 

рдЙрд╕реА рддрд░рд╣ рд╕реЗ рдЬреЛ рд╕рд╛рдзрд╛рд░рдг рдЯреНрдпреВрдкрд▓реНрд╕ рд╣реИрдВ рдЬреЛ Array рд╕реЗ рдлреИрд▓рддреЗ рд╣реИрдВ - рдЯрд╛рдЗрдк 1 , T 2 рддрддреНрд╡реЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдЯреНрдпреВрдкрд▓ ... T n Array< рд╕реЗ рдлреИрд▓рддрд╛ рд╣реИ Array< T 1 | T 2 | ... T n > - рдЖрд╕рд╛рдиреА рд╕реЗ рдкрдврд╝реЗ рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рдХрд╛рд░ рд╣реИрдВ рдЬреЛ ReadonlyArray рд╕реЗ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рд╣реЛрддреЗ рд╣реИрдВред рддреЛ рддрддреНрд╡реЛрдВ T 1 , T 2 , ... рдХреЗ рд╕рд╛рде рдПрдХ рдЖрд╕рд╛рдиреА рд╕реЗ рдЯреНрдпреВрдкрд▓ ReadonlyArray< T 1 рд╕реЗ T рдлреИрд▓рддрд╛ рд╣реИред T 2 | ... T n > ред


readonly рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП рд╕рдВрд╢реЛрдзрдХ рдФрд░ рдЖрд╕рд╛рдиреА рд╕реЗ рд╕рд░рдгрд┐рдпреЛрдВ рдХрд╛ рдореИрдк рдХрд┐рдпрд╛ рдЧрдпрд╛


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


 interface Box<T> { value: T } type Boxify<T> = { [K in keyof T]: Box<T[K]> } // { a: Box<string>, b: Box<number> } type A = Boxify<{ a: string, b: number }>; // Array<Box<number>> type B = Boxify<number[]>; // [Box<string>, Box<number>] type C = Boxify<[string, boolean]>; 

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


 // lib.d.ts type Readonly<T> = { readonly [K in keyof T]: T[K] } // How code acted *before* TypeScript 3.4 // { readonly a: string, readonly b: number } type A = Readonly<{ a: string, b: number }>; // number[] type B = Readonly<number[]>; // [string, boolean] type C = Readonly<[string, boolean]>; 

рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ 3.4 рдореЗрдВ, рдореИрдк рдХрд┐рдП рдЧрдП рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдЖрд╕рд╛рдиреА рд╕реЗ рд╕рдВрд╢реЛрдзрдХ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╕рд░рдгреА-рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдЙрдирдХреЗ рд╕рдВрдмрдВрдзрд┐рдд рдкреНрд░рддрд┐рд░реВрдк рд╕рдордХрдХреНрд╖реЛрдВ рдореЗрдВ рдмрджрд▓ рджреЗрдЧрд╛ред


 // How code acts now *with* TypeScript 3.4 // { readonly a: string, readonly b: number } type A = Readonly<{ a: string, b: number }>; // readonly number[] type B = Readonly<number[]>; // readonly [string, boolean] type C = Readonly<[string, boolean]>; 

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


 type Writable<T> = { -readonly [K in keyof T]: T[K] } // { a: string, b: number } type A = Writable<{ readonly a: string; readonly b: number }>; // number[] type B = Writable<readonly number[]>; // [string, boolean] type C = Writable<readonly [string, boolean]>; 

рдЪреЗрддрд╛рд╡рдирд┐рдпрд╛рдВ


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


 let err1: readonly Set<number>; // error! let err2: readonly Array<boolean>; // error! let okay: readonly boolean[]; // works fine 

const рджрд╛рд╡реЗ


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


 let x = "hello"; // hurray! we can assign to 'x' later on! x = "world"; 

рддрдХрдиреАрдХреА рд░реВрдк рд╕реЗ, рдкреНрд░рддреНрдпреЗрдХ рд╢рд╛рдмреНрджрд┐рдХ рдореВрд▓реНрдп рдХрд╛ рд╢рд╛рдмреНрджрд┐рдХ рдкреНрд░рдХрд╛рд░ рд╣реЛрддрд╛ рд╣реИред рдКрдкрд░, рдкреНрд░рдХрд╛рд░ "hello" x рд▓рд┐рдП рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЯрд╛рдЗрдк string рд▓рд┐рдП рдЪреМрдбрд╝рд╛ рд╣реЛ рдЧрдпрд╛ред


рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рджреГрд╢реНрдп рдпрд╣ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ x рдХрд╛ рдореВрд▓ рд╢рд╛рдмреНрджрд┐рдХ рдкреНрд░рдХрд╛рд░ "hello" рдФрд░ рдЬрд┐рд╕реЗ рд╣рдо рдмрд╛рдж рдореЗрдВ "world" рддрд░рд╣ рдЕрд╕рд╛рдЗрди рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:


 let x: "hello" = "hello"; // error! x = "world"; 

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


 type Shape = | { kind: "circle", radius: number } | { kind: "square", sideLength: number } function getShapes(): readonly Shape[] { let result = [ { kind: "circle", radius: 100, }, { kind: "square", sideLength: 50, }, ]; // Some terrible error message because TypeScript inferred // 'kind' to have the type 'string' instead of // either '"circle"' or '"square"'. return result; } 

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


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


 function getShapes(): readonly Shape[] { // This explicit annotation gives a hint // to avoid widening in the first place. let result: readonly Shape[] = [ { kind: "circle", radius: 100, }, { kind: "square", sideLength: 50, }, ]; return result; } 

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


рдЗрд╕реЗ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ 3.4 рдиреЗ рд╢рд╛рдмреНрджрд┐рдХ рдореВрд▓реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ рдирд┐рд░реНрдорд╛рдг рдкреЗрд╢ рдХрд┐рдпрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдХреЙрдиреНрд╕реНрдЯреЗрдВрдЯ рдПрд╢реНрдпреЛрд░реЗрдВрд╕ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЯрд╛рдЗрдк рдирд╛рдо рдХреЗ рд╕реНрдерд╛рди рдкрд░ const рд╕рд╛рде рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЕрднрд┐рдХрдерди рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ 123 as const )ред рдЬрдм рд╣рдо const рдХрдердиреЛрдВ рдХреЗ рд╕рд╛рде рдирдП рд╢рд╛рдмреНрджрд┐рдХ рднрд╛рд╡реЛрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдЙрд╕ рднрд╛рд╖рд╛ рдХреЛ рд╕рдВрдХреЗрдд рджреЗ рд╕рдХрддреЗ рд╣реИрдВ


  • рдЙрд╕ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдореЗрдВ рдХреЛрдИ рд╢рд╛рдмреНрджрд┐рдХ рдкреНрд░рдХрд╛рд░ рдЪреМрдбрд╝рд╛ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП "hello" рд╕реЗ string рдирд╣реАрдВ рдЬрд╛ рд░рд╣рд╛ рд╣реИ)
  • рдСрдмреНрдЬреЗрдХреНрдЯ рд╢рд╛рдмреНрджрд┐рдХ рдЖрд╕рд╛рдиреА рд╕реЗ рдЧреБрдг рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ
  • рд╕рд░рдгреА рд╢рд╛рдмреНрджрд┐рдХ рдЖрд╕рд╛рдиреА рд╕реЗ рдЯреНрдпреВрдкрд▓ рдмрди рдЬрд╛рддреЗ рд╣реИрдВ

 // Type '10' let x = 10 as const; // Type 'readonly [10, 20]' let y = [10, 20] as const; // Type '{ readonly text: "hello" }' let z = { text: "hello" } as const; 

.tsx рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рдмрд╛рд╣рд░, рдХреЛрдг рдмреНрд░реИрдХреЗрдЯ рдЕрднрд┐рдХрдерди рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред


 // Type '10' let x = <const>10; // Type 'readonly [10, 20]' let y = <const>[10, 20]; // Type '{ readonly text: "hello" }' let z = <const>{ text: "hello" }; 

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


 // Works with no types referenced or declared. // We only needed a single const assertion. function getShapes() { let result = [ { kind: "circle", radius: 100, }, { kind: "square", sideLength: 50, }, ] as const; return result; } for (const shape of getShapes()) { // Narrows perfectly! if (shape.kind === "circle") { console.log("Circle radius", shape.radius); } else { console.log("Square side length", shape.sideLength); } } 

рдКрдкрд░ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдПрдиреЛрдЯреЗрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдкрд░ рдзреНрдпрд╛рди рджреЗрдВред рдХрд╛рд╕реНрдЯ рдПрд╢реНрдпреЛрд░реЗрдВрд╕ рдиреЗ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд╕рдмрд╕реЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░рдХрд╛рд░ рдХреЛ рд▓реЗрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреАред


рдЪреЗрддрд╛рд╡рдирд┐рдпрд╛рдВ


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


 // Error! // A 'const' assertion can only be applied to a string, number, boolean, array, or object literal. let a = (Math.random() < 0.5 ? 0 : 1) as const; // Works! let b = Math.random() < 0.5 ? 0 as const : 1 as const; 

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


 let arr = [1, 2, 3, 4]; let foo = { name: "foo", contents: arr, }; foo.name = "bar"; // error! foo.contents = []; // error! foo.contents.push(5); // ...works! 

globalThis рд▓рд┐рдП рдЯрд╛рдЗрдк-рдЪреЗрдХрд┐рдВрдЧ


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


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


 // in a global file: let abc = 100; // Refers to 'abc' from above. globalThis.abc = 200; 

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


 const answer = 42; globalThis.answer = 333333; // error! 

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


рдирд╛рдорд┐рдд рдорд╛рдкрджрдВрдбреЛрдВ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░реЗрдВ


рдХрднреА-рдХрднреА, рдкреИрд░рд╛рдореАрдЯрд░ рд╕реВрдЪрд┐рдпрд╛рдВ рдЕрдирдЬрд╛рдиреА рд╣реЛрдиреЗ рд▓рдЧрддреА рд╣реИрдВред


 function updateOptions( hue?: number, saturation?: number, brightness?: number, positionX?: number, positionY?: number positionZ?: number) { // .... } 

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


 interface Options { hue?: number, saturation?: number, brightness?: number, positionX?: number, positionY?: number positionZ?: number } function updateOptions(options: Options = {}) { // .... } 

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


рдПрдХ рдлрдВрдХреНрд╢рди рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ рдЬрд┐рд╕реЗ рдирд╛рдорд╛рдВрдХрд┐рдд рдорд╛рдирджрдВрдб рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред


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


рдмреНрд░реЗрдХрд┐рдВрдЧ рдЪреЗрдВрдЬреЗрд╕


рд╢реАрд░реНрд╖-рд╕реНрддрд░ this рдЕрдм рдЯрд╛рдЗрдк рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ


рд╢реАрд░реНрд╖-рд╕реНрддрд░ рдХрд╛ рдкреНрд░рдХрд╛рд░ рдЕрдм typeof globalThis рд░реВрдк рдореЗрдВ рдЯрд╛рдЗрдк рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдЖрдкрдХреЛ noImplicitAny рддрд╣рдд this рдкрд░ рдЕрдЬреНрдЮрд╛рдд рдореВрд▓реНрдпреЛрдВ рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рддреНрд░реБрдЯрд┐рдпрд╛рдБ рдкреНрд░рд╛рдкреНрдд рд╣реЛ рд╕рдХрддреА рд╣реИрдВред


 // previously okay in noImplicitAny, now an error this.whargarbl = 10; 

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ noImplicitThis рддрд╣рдд рд╕рдВрдХрд▓рд┐рдд рдХреЛрдб рдпрд╣рд╛рдВ рдХрд┐рд╕реА рднреА рдкрд░рд┐рд╡рд░реНрддрди рдХрд╛ рдЕрдиреБрднрд╡ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред


рдкреНрд░рдЪрд╛рд░рд┐рдд рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреЗ рддрд░реНрдХ


рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ 3.4 рдореЗрдВ рд╕реБрдзрд╛рд░ рдХреЗ рдХрд╛рд░рдг рд╕рд╛рдорд╛рдиреНрдп рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдХрд╛рд░реНрдп рдЙрддреНрдкрдиреНрди рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдмрдЬрд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рдЙрдирдХреЗ рдЕрд╡рд░реЛрдз (рдЖрдорддреМрд░ рдкрд░ {} ) рдХреЛ рд╡рд╛рдкрд╕ рд▓реЗ рдФрд░ рд╡рд╛рдкрд╕ рдХрд░ рджреЗрдВред


 declare function compose<T, U, V>(f: (arg: T) => U, g: (arg: U) => V): (arg: T) => V; function list<T>(x: T) { return [x]; } function box<T>(value: T) { return { value }; } let f = compose(list, box); let x = f(100) // In TypeScript 3.4, 'x.value' has the type // // number[] // // but it previously had the type // // {}[] // // So it's now an error to push in a string. x.value.push("hello"); 

x рдкрд░ рдПрдХ рд╕реНрдкрд╖реНрдЯ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдПрдиреЛрдЯреЗрд╢рди рддреНрд░реБрдЯрд┐ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛ рд╕рдХрддрд╛ рд╣реИред


рдЖрдЧреЗ рдХреНрдпрд╛ рд╣реИ?


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


рдЕрднреА рд╣рдо рдЖрд░рд╕реА рдХреЗ рд╕рд╛рде рдЕрдкрдиреЗ рдЕрдиреБрднрд╡ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реБрдирдиреЗ рдХреЗ рд▓рд┐рдП рдЙрддреНрд╕реБрдХ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдЕрднреА рдПрдХ рд╢реЙрдЯ рджреЗрдВ рдФрд░ рд╣рдореЗрдВ рдЕрдкрдиреЗ рд╡рд┐рдЪрд╛рд░ рдмрддрд╛рдПрдВ!

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


All Articles