Typescript: рд╕реБрдЭрд╛рд╡: рдЗрдВрдбреЗрдХреНрд╕ рд╕рд┐рдЧреНрдиреЗрдЪрд░ рдореЗрдВ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХрд╛ рд╡рд┐рдХрд▓реНрдк

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

рдЕрджреНрдпрддрди : рдореЗрд░реЗ рдирд╡реАрдирддрдо рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд▓рд┐рдП рдЯрд┐рдкреНрдкрдгреА рджреЗрдЦреЗрдВ https://github.com/Microsoft/TypeScript/issues/13778#issuecomment -406316164

strictNullChecks рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд╕рд╛рде, рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рд╣рд╕реНрддрд╛рдХреНрд╖рд░реЛрдВ рдореЗрдВ undefined рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдпрд╛ рд╕рд░рдгреА рдкрд░)ред рдпрд╣ рдПрдХ рдкреНрд░рд╕рд┐рджреНрдз рдЪреЗрддрд╛рд╡рдиреА рд╣реИ рдФрд░ рдХрдИ рдореБрджреНрджреЛрдВ рдкрд░ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ рд╣реИ, рдЕрд░реНрдерд╛рддреН https://github.com/Microsoft/TypeScript/issues/9235 , https://github.com/Microsoft/TypeScript/issues/13161 , https://github .com/Microsoft/TypeScript/issues/12287 , рдФрд░ https://github.com/Microsoft/TypeScript/pull/7140#issuecomment -192606629ред

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

const xs: number[] = [1,2,3];
xs[100] // number, even with strictNullChecks

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

undefined рд╕рд╣рд┐рдд рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рд╣рд╕реНрддрд╛рдХреНрд╖рд░реЛрдВ рдХрд╛ рдЙрджрд╛рд╣рд░рдг:

const xs: number[] = [1,2,3];
xs[100] // number | undefined

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

Committed Suggestion

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

рд╣рдо рдЗрд╕ рдмрд╛рдд рдХреЛ рд▓реЗрдХрд░ рдХрд╛рдлреА рд╕рдВрд╢рдп рдореЗрдВ рд╣реИрдВ рдХрд┐ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдХрд┐рд╕реА рдХреЛ рднреА рдЗрд╕ рдЭрдВрдбреЗ рд╕реЗ рдХреЛрдИ рдлрд╛рдпрджрд╛ рд╣реЛрдЧрд╛ред рдорд╛рдирдЪрд┐рддреНрд░ рдФрд░ рдорд╛рдирдЪрд┐рддреНрд░ рдЬреИрд╕реА рдЪреАрдЬрд╝реЗрдВ рдЕрдкрдиреА рдкрд░рд┐рднрд╛рд╖рд╛ рд╕рд╛рдЗрдЯреЛрдВ рдкрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА | undefined рдореЗрдВ рдСрдкреНрдЯ рдЗрди рдХрд░ рд╕рдХрддреА рд╣реИрдВ

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

рдореИрдВ рдЗрд╕ рдмрдЧ рдореЗрдВ рдЖрдпрд╛ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдореМрдЬреВрджрд╛ рдХреЛрдб рдкрд░ strictNullChecks рд╕рдХреНрд╖рдо рдХрд░ рд░рд╣рд╛ рдерд╛ рдФрд░ рдореЗрд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рддреБрд▓рдирд╛ рдереА рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рддреНрд░реБрдЯрд┐ рдорд┐рд▓реАред рдЕрдЧрд░ рдореИрдВ рдмрд┐рд▓реНрдХреБрд▓ рдирдпрд╛ рдХреЛрдб рд▓рд┐рдЦ рд░рд╣рд╛ рд╣реЛрддрд╛ рддреЛ рд╢рд╛рдпрдж рдореБрдЭреЗ рдпрд╣рд╛рдВ рдЗрд╕ рдореБрджреНрджреЗ рдХрд╛ рдПрд╣рд╕рд╛рд╕ рдирд╣реАрдВ рд╣реЛрддрд╛ (рдЯрд╛рдЗрдк рд╕рд┐рд╕реНрдЯрдо рдореБрдЭреЗ рдмрддрд╛ рд░рд╣рд╛ рдерд╛ рдХрд┐ рдореБрдЭреЗ рд╣рдореЗрд╢рд╛ рдПрдХ рдореВрд▓реНрдп рдорд┐рд▓ рд░рд╣рд╛ рд╣реИ) рдФрд░ рд░рдирдЯрд╛рдЗрдо рд╡рд┐рдлрд▓рддрд╛ рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдпрд╛ред рдЯреАрдПрд╕ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рдпрд╛рдж рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП (рдпрд╛ рдЗрд╕рд╕реЗ рднреА рдмрджрддрд░, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдЬрд╛рдирддреЗ рд╣реИрдВ) рдХрд┐ рд╡реЗ рдЕрдкрдиреЗ рд╕рднреА рдорд╛рдирдЪрд┐рддреНрд░реЛрдВ рдХреЛ | undefined рд╕рд╛рде рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╣реИрдВ, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╡рд╣ рдХрд░рдиреЗ рдореЗрдВ рд╡рд┐рдлрд▓ рд╣реЛ рд░рд╣рд╛ рд╣реИ рдЬреЛ рд▓реЛрдЧ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЪрд╛рд╣рддреЗ рд╣реИрдВред

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

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

@mhegazy рдпрд╣ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рд╡рд┐рдЪрд╛рд░ рд╣реИред рд╕рд░рдгреА/рд╡рд╕реНрддреБ рдХреЗ рд▓рд┐рдП рдкреНрд░рдХрд╛рд░ рдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдкрд░ рдХреЛрдИ рдорд╛рд░реНрдЧрджрд░реНрд╢рди?

interface Array<T> рдореЗрдВ lib.d.ts ред рдореИрдВрдиреЗ рдЕрдиреНрдп рдЕрдиреБрдХреНрд░рдордг рд╣рд╕реНрддрд╛рдХреНрд╖рд░реЛрдВ рдХреЛ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП regexp \[\w+: (string|number)\] рджреНрд╡рд╛рд░рд╛ рднреА рдЦреЛрдЬрд╛ред

рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдпрд╣ рдХреЛрд╢рд┐рд╢ рдХреА:

{
    // https://github.com/Microsoft/TypeScript/blob/1f92bacdc81e7ae6706ad8776121e1db986a8b27/lib/lib.d.ts#L1300
    declare global {
        interface Array<T> {
            [n: number]: T | undefined;
        }
    }

    const xs = [1,2,3]
    const x = xs[100]
    x // still number :-(
}

рдХреЛрдИ рд╡рд┐рдЪрд╛рд░?

рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ lib.d.ts рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдХрд╣рддреЗ рд╣реИрдВ, lib.strict.d.ts , рдХреЗ рд▓рд┐рдП рд╕реВрдЪрдХрд╛рдВрдХ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдмрджрд▓ [n: number]: T | undefined; , рдЕрдкрдиреЗ рд╕рдВрдХрд▓рди рдореЗрдВ рдлрд╝рд╛рдЗрд▓ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдЖрдкрдХреЛ рдЗрдЪреНрдЫрд┐рдд рдкреНрд░рднрд╛рд╡ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдХреВрд▓, рдЗрд╕рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред

рдпрд╣рд╛рдВ рд╕реБрдЭрд╛рдП рдЧрдП рдлрд┐рдХреНрд╕ рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдПрдХ рдЕрд▓рдЧ lib рдлрд╝рд╛рдЗрд▓ рдХреЛ рдлреЛрд░реНрдХ рдХрд░рдиреЗ рдФрд░ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

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

рдПрдХ рддрд░рдл рдзреНрдпрд╛рди рджреЗрдВ рдкрд░, рдпрд╣ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ рдХрд┐ рдХреЗ рд▓рд┐рдП рдкреНрд░рдХрд╛рд░ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ get ES6 рд╕рдВрдЧреНрд░рд╣ рдкрд░ рд╡рд┐рдзрд┐ ( Map / Set ) рд░рд┐рдЯрд░реНрди T | undefined рдЬрдм Array / Object рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред

рдпрд╣ рдПрдХ рд╕рдЪреЗрдд рдирд┐рд░реНрдгрдп рд╣реИред рдЗрд╕ рдХреЛрдб рдХреЗ рд▓рд┐рдП рддреНрд░реБрдЯрд┐ рд╣реЛрдирд╛ рдмрд╣реБрдд рдХрд╖реНрдЯрдкреНрд░рдж рд╣реЛрдЧрд╛:

var a = [];
for (var i =0; i< a.length; i++) {
    a[i]+=1; // a[i] is possibly undefined
}

рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ ! рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рдирд╛ рдЕрдиреБрдЪрд┐рдд рд╣реЛрдЧрд╛ред рдпрд╛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП

var a = [];
for (var i =0; i< a.length; i++) {
    if (a[i]) {
        a[i]+=1; // a[i] is possibly undefined
    }
}

рдорд╛рдирдЪрд┐рддреНрд░ рдХреЗ рд▓рд┐рдП рдЖрдо рддреМрд░ рдкрд░ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред

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

рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдХрд┐рд╕реА рдШреЛрд╖рдгрд╛ рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдзреНрд╡рдЬ рдЬреЛрдбрд╝рдирд╛ рдХреБрдЫ рдРрд╕рд╛ рд╣реИ рдЬреЛ рд╣рдо рдХрд░реЗрдВрдЧреЗред

@mhegazy рд▓реЗрдХрд┐рди рдЫреЗрдж рд╡рд╛рд▓реЗ рд╕рд░рдгреА рдХреЗ рд▓рд┐рдП a[i] рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рдВрднрд╡рддрдГ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реИ:

let a: number[] = []
a[0] = 0
a[5] =0
for (let i = 0; i < a.length; i++) {
  console.log(a[i])
}

рдЖрдЙрдЯрдкреБрдЯ рд╣реИ:

undefined
undefined
undefined
undefined
0

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

рдЕрдЧрд░ рдХреЛрдИ рдЕрдкрдиреЗ lib.d.ts рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ рдФрд░ рдЕрдкрдиреЗ рдХреЛрдб рдореЗрдВ рд╕рднреА рдбрд╛рдЙрдирд╕реНрдЯреНрд░реАрдо рдмреНрд░реЗрдХ рдХреЛ рдареАрдХ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ рдФрд░ рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ рд╕рдордЧреНрд░ рдЕрдВрддрд░ рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ, рдпрд╣ рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдЗрд╕рдореЗрдВ рдХреБрдЫ рдореВрд▓реНрдп рдкреНрд░рд╕реНрддрд╛рд╡ рд╣реИ, рд╣рдо рдЙрд╕ рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рдЦреБрд▓реЗ рд╣реИрдВред рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ рдпрджрд┐ рдмрд╣реБрдд рд╕реЗ рд▓реЛрдЧ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ ! рдЕрдзрд┐рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрддреНрд╕рд╛рд╣рд┐рдд рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЕрднреА рддрдХ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рдкрд░реНрдпрд╛рдкреНрдд рдЕрд╡рд╕рд░ рдирд╣реАрдВ рд╣реИрдВ, рддреЛ рдпрд╣ рдлрд╝реНрд▓реИрдЧ рдПрдХ рд╡рд┐рдХрд▓реНрдк рд╣реЛрдЧрд╛ред

рд╣рдо рдЗрд╕ рдмрд╛рдд рдХреЛ рд▓реЗрдХрд░ рдХрд╛рдлреА рд╕рдВрд╢рдп рдореЗрдВ рд╣реИрдВ рдХрд┐ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдХрд┐рд╕реА рдХреЛ рднреА рдЗрд╕ рдЭрдВрдбреЗ рд╕реЗ рдХреЛрдИ рдлрд╛рдпрджрд╛ рд╣реЛрдЧрд╛ред рдорд╛рдирдЪрд┐рддреНрд░ рдФрд░ рдорд╛рдирдЪрд┐рддреНрд░ рдЬреИрд╕реА рдЪреАрдЬрд╝реЗрдВ рдЕрдкрдиреА рдкрд░рд┐рднрд╛рд╖рд╛ рд╕рд╛рдЗрдЯреЛрдВ рдкрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА | undefined рдореЗрдВ рдСрдкреНрдЯ рдЗрди рдХрд░ рд╕рдХрддреА рд╣реИрдВ

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

рдореИрдВ рдЗрд╕ рдмрдЧ рдореЗрдВ рдЖрдпрд╛ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдореМрдЬреВрджрд╛ рдХреЛрдб рдкрд░ strictNullChecks рд╕рдХреНрд╖рдо рдХрд░ рд░рд╣рд╛ рдерд╛ рдФрд░ рдореЗрд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рддреБрд▓рдирд╛ рдереА рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рддреНрд░реБрдЯрд┐ рдорд┐рд▓реАред рдЕрдЧрд░ рдореИрдВ рдмрд┐рд▓реНрдХреБрд▓ рдирдпрд╛ рдХреЛрдб рд▓рд┐рдЦ рд░рд╣рд╛ рд╣реЛрддрд╛ рддреЛ рд╢рд╛рдпрдж рдореБрдЭреЗ рдпрд╣рд╛рдВ рдЗрд╕ рдореБрджреНрджреЗ рдХрд╛ рдПрд╣рд╕рд╛рд╕ рдирд╣реАрдВ рд╣реЛрддрд╛ (рдЯрд╛рдЗрдк рд╕рд┐рд╕реНрдЯрдо рдореБрдЭреЗ рдмрддрд╛ рд░рд╣рд╛ рдерд╛ рдХрд┐ рдореБрдЭреЗ рд╣рдореЗрд╢рд╛ рдПрдХ рдореВрд▓реНрдп рдорд┐рд▓ рд░рд╣рд╛ рд╣реИ) рдФрд░ рд░рдирдЯрд╛рдЗрдо рд╡рд┐рдлрд▓рддрд╛ рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдпрд╛ред рдЯреАрдПрд╕ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рдпрд╛рдж рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП (рдпрд╛ рдЗрд╕рд╕реЗ рднреА рдмрджрддрд░, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдЬрд╛рдирддреЗ рд╣реИрдВ) рдХрд┐ рд╡реЗ рдЕрдкрдиреЗ рд╕рднреА рдорд╛рдирдЪрд┐рддреНрд░реЛрдВ рдХреЛ | undefined рд╕рд╛рде рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╣реИрдВ, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╡рд╣ рдХрд░рдиреЗ рдореЗрдВ рд╡рд┐рдлрд▓ рд╣реЛ рд░рд╣рд╛ рд╣реИ рдЬреЛ рд▓реЛрдЧ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЪрд╛рд╣рддреЗ рд╣реИрдВред

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

рдЕрд╕рд▓ рдореЗрдВ рд▓рдХреНрд╖реНрдп рд╣реИ:

1) рдЙрди рдирд┐рд░реНрдорд╛рдгреЛрдВ рдХреА рд╕рд╛рдВрдЦреНрдпрд┐рдХреАрдп рд░реВрдк рд╕реЗ рдкрд╣рдЪрд╛рди рдХрд░реЗрдВ рдЬрд┐рдирдореЗрдВ рддреНрд░реБрдЯрд┐ рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИред

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

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

рдореИрдВ рдЗрд╕ рдЯрд┐рдкреНрдкрдгреА рдкрд░ рдереЛрдбрд╝рд╛ рдФрд░ рддрд░реНрдХ рдореЗрдВ рдЧрдпрд╛ https://github.com/Microsoft/TypeScript/issues/11238#issuecomment -250562397

рджреБрдирд┐рдпрд╛ рдореЗрдВ рджреЛ рдкреНрд░рдХрд╛рд░ рдХреА рдЪрд╛рдмрд┐рдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪреЗрдВ: рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдЙрдирдХреЗ рдкрд╛рд╕ рдХрд┐рд╕реА рд╡рд╕реНрддреБ (рд╕реБрд░рдХреНрд╖рд┐рдд) рдореЗрдВ рд╕рдВрдмрдВрдзрд┐рдд рд╕рдВрдкрддреНрддрд┐ рд╣реЛрддреА рд╣реИ, рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдк рдирд╣реАрдВ рдЬрд╛рдирддреЗ рдХрд┐ рдХрд┐рд╕реА рд╡рд╕реНрддреБ (рдЦрддрд░рдирд╛рдХ) рдореЗрдВ рд╕рдВрдмрдВрдзрд┐рдд рд╕рдВрдкрддреНрддрд┐ рд╣реЛрддреА рд╣реИред

рд╕рд╣реА рдХреЛрдб рд▓рд┐рдЦрдиреЗ рд╕реЗ рдЖрдкрдХреЛ рдкрд╣рд▓реА рддрд░рд╣ рдХреА рдХреБрдВрдЬреА рдорд┐рд▓рддреА рд╣реИ, рдПрдХ "рд╕реБрд░рдХреНрд╖рд┐рдд" рдХреБрдВрдЬреА, рдЬреИрд╕реЗ

for (let i = 0; i < arr.length; i++) {
  // arr[i] is T, not T | undefined

рдпрд╛

for (const k of Object.keys(obj)) {
  // obj[k] is T, not T | undefined

рдЖрдкрдХреЛ рджреВрд╕рд░реА рддрд░рд╣ рдХреА рдХреБрдВрдЬреА рд╕реЗ рдорд┐рд▓рддреА рд╣реИ, "рдЦрддрд░рдирд╛рдХ" рдкреНрд░рдХрд╛рд░, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдирдкреБрдЯ рдЬреИрд╕реА рдЪреАрдЬреЛрдВ рд╕реЗ, рдпрд╛ рдбрд┐рд╕реНрдХ рд╕реЗ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ JSON рдлрд╛рдЗрд▓реЗрдВ, рдпрд╛ рдХреБрдЫ рдЪрд╛рдмрд┐рдпреЛрдВ рдХреА рд╕реВрдЪреА рдЬреЛ рдореМрдЬреВрдж рд╣реЛ рд╕рдХрддреА рд╣реИрдВ рд▓реЗрдХрд┐рди рд╣реЛ рд╕рдХрддреА рд╣реИрдВред

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

for (let i = 0; i < arr.length; i++) {
  console.log(arr[i].name);

рдФрд░ рдЯрд╛рдЗрдкрдкреНрд░рддрд┐ рдЖрдк рдХрдо рд╕реЗ рд╢рд┐рдХрд╛рдпрдд рдХрд░ рд░рд╣рд╛ рд╣реИ рдХрд┐ arr[i] рд╣реЛ рд╕рдХрддрд╛ рд╣реИ undefined рднрд▓реЗ рд╣реА рд╣реЗ рдореИрдВ рд╕рд┐рд░реНрдл @ #% # рдЗрд╕рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЖрдИрдПрдирдЬреА рджреЗрдЦреЛред рдЕрдм рдЖрдкрдХреЛ рдЗрд╕ рддрд░рд╣ рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреА рдЖрджрдд рд╣реЛ рдЧрдИ рд╣реИ, рдФрд░ рдпрд╣ рдореВрд░реНрдЦрддрд╛рдкреВрд░реНрдг рд▓рдЧрддрд╛ рд╣реИ:

for (let i = 0; i < arr.length; i++) {
  // TypeScript makes me use ! with my arrays, sad.
  console.log(arr[i]!.name);

рдпрд╛ рд╢рд╛рдпрдж рдЖрдк рдЗрд╕ рддрд░рд╣ рдХреЛрдб рд▓рд┐рдЦрддреЗ рд╣реИрдВ:

function doSomething(myObj: T, yourObj: T) {
  for (const k of Object.keys(myObj)) {
    console.log(yourObj[k].name);
  }
}

рдФрд░ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╣рддрд╛ рд╣реИ "рдЕрд░реЗ, рд╡рд╣ рд╕реВрдЪрдХрд╛рдВрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ | undefined рд╣реЛ рд╕рдХрддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдк рдЗрд╕реЗ рдХрд░реНрддрд╡реНрдпрдкреВрд░реНрд╡рдХ рдареАрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдиреЗ рдЗрд╕ рддреНрд░реБрдЯрд┐ рдХреЛ рдкрд╣рд▓реЗ рд╣реА 800 рдмрд╛рд░ рджреЗрдЦрд╛ рд╣реИ:

function doSomething(myObj: T, yourObj: T) {
  for (const k of Object.keys(myObj)) {
    console.log(yourObj[k]!.name); // Shut up TypeScript I know what I'm doing
  }
}

рд▓реЗрдХрд┐рди рдЖрдкрдиреЗ рдмрдЧ рдХреЛ рдареАрдХ рдирд╣реАрдВ рдХрд┐рдпрд╛ ред рдЖрдк Object.keys(yourObj) , рдпрд╛ рд╢рд╛рдпрдж myObj[k] рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рддреЗ рдереЗред рдпрд╣ рд╕рдмрд╕реЗ рдЦрд░рд╛рдм рдкреНрд░рдХрд╛рд░ рдХреА рдХрдВрдкрд╛рдЗрд▓рд░ рддреНрд░реБрдЯрд┐ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд┐рд╕реА рднреА рдкрд░рд┐рджреГрд╢реНрдп рдореЗрдВ рдЖрдкрдХреА рдорджрдж рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ - рдпрд╣ рдХреЗрд╡рд▓ рд╣рд░ рддрд░рд╣ рдХреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реА рдЕрдиреБрд╖реНрдард╛рди рд▓рд╛рдЧреВ рдХрд░ рд░рд╣рд╛ рд╣реИ, рдЗрд╕ рдкрд░ рдзреНрдпрд╛рди рджрд┐рдП рдмрд┐рдирд╛ рдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрд╕реА рд░реВрдк рдХреА рдХрд┐рд╕реА рднреА рдЕрдиреНрдп рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╕реЗ рдЕрдзрд┐рдХ рдЦрддрд░рдирд╛рдХ рдерд╛ рдпрд╛ рдирд╣реАрдВред

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

рдЙрди рдирд┐рд░реНрдорд╛рдгреЛрдВ рдХреА рд╕рд╛рдВрдЦреНрдпрд┐рдХреАрдп рд░реВрдк рд╕реЗ рдкрд╣рдЪрд╛рди рдХрд░реЗрдВ рдЬрд┐рдирдореЗрдВ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИред

рд╢рд╛рдпрдж рдпрд╣ рдХрд╣рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ "рд╕реНрдерд┐рд░ рд░реВрдк рд╕реЗ рдЙрди рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреА рдкрд╣рдЪрд╛рди рдХрд░реЗрдВ рдЬреЛ рджреВрд╕рд░реЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рдкрд▓рдХ :. рдореБрдЭреЗ рдпрд╛рдж рджрд┐рд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдЬрдм рд╣рдореЗрдВ рдмрдЧ рдорд┐рд▓рддреЗ рд╣реИрдВ рдЬреЛ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рд╣реЛрддреЗ рд╣реИрдВ "рдореИрдВрдиреЗ * рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдерд╛ рдЬрдм рдореЗрд░рд╛ рдорддрд▓рдм / рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдерд╛, рдХреНрдпрд╛ рдЖрдк * рдПрдХ рдЪреЗрддрд╛рд╡рдиреА рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ?"

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

! рд╕рд╛рде рдлрд┐рдХреНрд╕ рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рднреА рдирд╛рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВ - рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдХреЛрдИ рд╕рд╛рде рдЖрддрд╛ рд╣реИ рдФрд░ рдРрд╕рд╛ рдкрд░рд┐рд╡рд░реНрддрди рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдзрд╛рд░рдгрд╛ рдЕрдм рдЕрдорд╛рдиреНрдп рд╣реИ? рдЖрдк рдПрдХ рд╡рд░реНрдЧ рдореЗрдВ рд╡рд╛рдкрд╕ рдЖ рдЧрдП рд╣реИрдВ (рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЛ рдкрдХрдбрд╝рдиреЗ рд╡рд╛рд▓реА рдХрд┐рд╕реА рдЪреАрдЬрд╝ рдХреЗ рд▓рд┐рдП рд╕рдВрднрд╛рд╡рд┐рдд рд░рдирдЯрд╛рдЗрдо рд╡рд┐рдлрд▓рддрд╛)ред рд╕рд░рдгрд┐рдпреЛрдВ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд╕реБрд░рдХреНрд╖рд┐рдд рддрд░реАрдХреЗ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП рдЬреЛ рдпрд╛ рддреЛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЭреВрда рдмреЛрд▓рдиреЗ рдпрд╛ ! рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдкрд░ рднрд░реЛрд╕рд╛ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреНрдпрд╛ рдЖрдк array.forEach(i => console.log(i.name) рдЬреИрд╕рд╛ рдХреБрдЫ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?)

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

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

рд╡реИрд╕реЗ рднреА, рдпрд╣ рд╕рд┐рд░реНрдл рдореЗрд░реЗ 2 рд╕реЗрдВрдЯ рд╣реИрдВ .. рдореИрдВ рдЗрд╕реЗ рдмрд╛рд╣рд░ рдирд╣реАрдВ рдЦреАрдВрдЪрдирд╛ рдЪрд╛рд╣рддрд╛ - рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рдЖрдк рд╕рдордЭрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рдХрд╣рд╛рдБ рд╕реЗ рдЖ рд░рд╣реЗ рд╣реИрдВ рдФрд░ рдЖрдк рдореБрдЭрд╕реЗ рдЗрд╕ рдкрд░ рдирд┐рд░реНрдгрдп рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣реАрдВ рдмреЗрд╣рддрд░ рд╣реИрдВ :-)

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

for (let i = 0; i < a.length; i++) {
  const value = a[i];
}

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

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

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

рд╣рдореЗрдВ рдЦреБрдж рд╕реЗ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЗрддрдирд╛ рд╣реА рдХрд░ рд╕рдХрддрд╛ рд╣реИред

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

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

рдпрджрд┐ рдпрд╣ рдЖрдкрдХрд╛ рдкреНрд░рдХрд╛рд░ рд╣реИ, рддреЛ рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдореЗрдВ | undefined рдЬреЛрдбрд╝реЗрдВред --noImplicitAny рддрд╣рдд рдмрд┐рдирд╛ рдХрд┐рд╕реА рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рд╡рд╛рд▓реЗ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдЕрдиреБрдХреНрд░рдорд┐рдд рдХрд░рдирд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рддреНрд░реБрдЯрд┐ рд╣реИред
ES6 Map рдХреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА get(key: K): V | undefined; рд░реВрдк рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

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

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

declare var values: number[];
for (let index = 0, length = values.length; index< length; index ++) {
   const value = value[index]; // always defined, because index is within array range and only controlled by it
}

(рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЬреЛ рд╡рд┐рд░рд▓ рд╕рд░рдгрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ - рдЕрдкрдиреЗ рдЖрдк рдХреЛ рдЧрд░реНрдо рдЬрд▓рддреА рд╣реБрдИ рдЖрдЧ рд╕реЗ рдорд╛рд░реЗрдВ)

рдЬрд╣рд╛рдВ рддрдХ Object.keys рд╕рд╡рд╛рд▓ рд╣реИ, рддреЛ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЛ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рд╕реАрдорд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП allkeysof T рдХрд╣рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢реЗрд╖ рдкреНрд░рдХрд╛рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ

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

рдЖрдкрдХреА рдСрдмреНрдЬреЗрдХреНрдЯ рдкреНрд░рдХрд╛рд░ рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ |undefined рдбрд╛рд▓рдиреЗ рдХреЗ рд╕рд╛рде (рдХрдо рд╕реЗ рдХрдо) рджреЛ рдЕрдиреНрдп рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВ:

  • рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЖрдк рдЗрди рд╡рд╕реНрддреБрдУрдВ рдореЗрдВ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рдЕрд╕рд╛рдЗрди рдХрд░ рд╕рдХрддреЗ
  • рдЕрдиреНрдп рд╕рдВрдЪрд╛рд▓рди, рдЬреИрд╕реЗ Object.values (рдпрд╛ _.values ) рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдкрд░рд┐рдгрд╛рдореЛрдВ рдореЗрдВ undefined рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА

tslint рдирд┐рд░рдВрддрд░ рд╕реНрдерд┐рддрд┐ рдХреА рдЭреВрдареА-рд╕рдХрд╛рд░рд╛рддреНрдордХ рдЪреЗрддрд╛рд╡рдиреА рдХреА рд░рд┐рдкреЛрд░реНрдЯ рдХрд░рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЧрд▓рдд рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рдирдХрд╛рд░реА рджреЗрддрд╛ рд╣реИ (= | undefined рдХрдореА)ред
https://github.com/palantir/tslint/issues/2944

рд╕рд░рдгреА рдЕрдиреБрдХреНрд░рдордг рдореЗрдВ | undefined рдХреА рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐ рдХреЗ рд╕рд╛рде рдирд┐рдпрдорд┐рдд рд░реВрдк рд╕реЗ рдЫреЛрдбрд╝реА рдЧрдИ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдпрд╣ рдкреИрдЯрд░реНрди рд╣реИ рдЬрдм find рд╕реНрдерд╛рди рдкрд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

const array = [ 1, 2, 3 ];
const firstFour = array.filter((x) => (x === 4))[0];
// if there is no `4` in the `array`,
// `firstFour` will be `undefined`, but TypeScript thinks `number` because of the indexer signature.
const array = [ 1, 2, 3 ];
const firstFour = array.find((x) => (x === 4));
// `firstFour` will be correctly typed as `number | undefined` because of the `find` signature.

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

for (let i = 0; i < arr.length; i++) {
  foo(arr[i]!)
}

рд╕рд╛рде рд╣реА, рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдирдП, рдмреЗрд╣рддрд░ рддрд░реАрдХреЗ рд╕реЗ for of рд▓реВрдк рдХреЗ рд╕рд╛рде рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдПрдХ TSLint рдирд┐рдпрдо prefer-for-of рдЬреЛ рдЖрдкрдХреЛ рдкреБрд░рд╛рдиреА рд╢реИрд▓реА for рд▓реВрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рддрд╛ рд╣реИред рдЕрдм рдФрд░ред

рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЯрд╛рдЗрдк рд╕рд┐рд╕реНрдЯрдо рдбреЗрд╡рд▓рдкрд░ рдХреЗ рд▓рд┐рдП рдЕрд╕рдВрдЧрдд рд╣реИред array.pop() рд▓рд┐рдП if рдЪреЗрдХ рдпрд╛ ! рдЕрднрд┐рдХрдерди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди [array.length - 1] рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХреНрд╕реЗрд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред ES6 map.get() рдХреЛ if рдЪреЗрдХ рдпрд╛ ! рдЕрднрд┐рдХрдерди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИрд╢ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред @sompylasar рдХрд╛ рдЙрджрд╛рд╣рд░рдг рднреА рдЕрдЪреНрдЫрд╛ рд╣реИред

рдПрдХ рдФрд░ рдЙрджрд╛рд╣рд░рдг рд╡рд┐рдирд╛рд╢рдХрд╛рд░реА рд╣реИ:

const specifier = 'Microsoft/TypeScript'
const [repo, revision] = specifier.split('@') // types of repo and revision are string
console.log('Repo: ' + repo)
console.log('Short rev: ' + revision.slice(0, 7)) // Error: Cannot call function 'slice' on undefined

рдЕрдЧрд░ рдХрдВрдкрд╛рдЗрд▓рд░ рдиреЗ рдореБрдЭреЗ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд┐рдпрд╛ рд╣реЛрддрд╛ рддреЛ рдореИрдВ рдкрд╕рдВрдж рдХрд░рддрд╛:

const specifier = 'Microsoft/TypeScript'
const [repo, revision] = specifier.split('@') // types of repo and revision are string | undefined
console.log('Repo: ', repo || 'no repo')
console.log('Short rev:', revision ? revision.slice(0, 7) : 'no revision')

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

рдЗрдореЛ рдпрд╣ рдЯрд╛рдЗрдкрд┐рдВрдЧ рдлрд╛рдЗрд▓реЛрдВ рдореЗрдВ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдмрд▓реНрдХрд┐ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╕рд┐рд╕реНрдЯрдо рдореИрдХреЗрдирд┐рдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП - рдЗрдВрдбреЗрдХреНрд╕ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЗ рд╕рд╛рде рдХреБрдЫ рднреА рдПрдХреНрд╕реЗрд╕ рдХрд░рддреЗ рд╕рдордп, рдпрд╣ undefined ред рдпрджрд┐ рдЖрдкрдХреЗ рддрд░реНрдХ рдиреЗ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд┐рдпрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдирд╣реАрдВ рд╣реИ, рддреЛ рдмрд╕ ! ред рдЕрдиреНрдпрдерд╛ if рдФрд░ рдЖрдк рдЕрдЪреНрдЫреЗ рд╣реИрдВред

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

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

@pelotom рддрдм рдЖрдкрдХреА рдЪрд┐рдВрддрд╛ рдХреНрдпрд╛ рд╣реИ (рдХреНрдпреЛрдВрдХрд┐ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдЬреНрдпрд╛рджрд╛рддрд░ рдЦреБрдж рдХреЛ рдкрд░реЗрд╢рд╛рдиреА рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд╛рд▓ рдЪреБрдХреЗ рд╣реИрдВ)?

@ рдПрд▓реЗрдХреНрд╕реА-рдмрд╛рдпрдХреЛрд╡ рдЬреНрдпрд╛рджрд╛рддрд░ рдЗрдВрдбреЗрдХреНрд╕ рд╕рд┐рдЧреНрдиреЗрдЪрд░ рдкрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдерд░реНрдб-рдкрд╛рд░реНрдЯреА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рдмрдбрд╝реЗ рдкреИрдорд╛рдиреЗ рдкрд░ рд╣реЛрддреЗ рд╣реИрдВред рдореБрдЭреЗ рдЪреЗрддрд╛рд╡рдиреА рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдкрд░рд┐рдгрд╛рдо рд╕рдВрднрд╡рддрдГ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реИ, рдореИрдВ { [k: string]: A } рдкрд░ рдПрдХ рд╕рдВрдкрддреНрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдореИрдВрдиреЗ рдХреЗрд╡рд▓ рд╕рд░рдгреА рдЕрдиреБрдХреНрд░рдордг рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕реЗ рдПрдХ рдорд╛рдорд▓реЗ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ рдХрд┐ рдЭрдВрдбрд╛ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдкрд░реЗрд╢рд╛рди рдХреНрдпреЛрдВ рд╣реЛрдЧрд╛ред

рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЖрдк рдЙрдиреНрд╣реЗрдВ рдареАрдХ рд╡реИрд╕реЗ рд╣реА рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдЬреИрд╕реЗ рдЖрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВ? (рдереЛрдбрд╝рд╛ рдЕрддрд┐рд░рд┐рдХреНрдд рдХрд╛рдо рджрд┐рдпрд╛ рдЧрдпрд╛)

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

рдХрдкреНрддрд╛рди рдУ рдЦреЗрд▓рддреЗ рд░рд╣реЗрдВ...: рдЖрдк рдЖрдЬ рдЕрдкрдиреЗ lib.d.ts рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЕрдзрд┐рдХ рдзреНрд╡рдирд┐ рдХреЛрдбрдмреЗрд╕ рдХреЗ рдЦреБрд╢ рдорд╛рд▓рд┐рдХ рдмрди рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдЖрдк рдЕрдЧрд▓реЗ рдПрди рд╡рд░реНрд╖реЛрдВ рдХреЗ рд▓рд┐рдП рдзреНрд╡рдЬ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

@ рдПрд▓реЗрдХреНрд╕реА-рдмрд╛рдпрдХреЛрд╡ lib.d.ts рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдХрд░ рдЗрд╕реЗ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ?

declare type Keyed<T> = { [key: string]: T | undefined; }

рдлрд┐рд░ Array рдкрд░рд┐рднрд╛рд╖рд╛ рдореЗрдВ lib.es2015.core.d.ts , рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ

[n: number]: T;

рд╕рд╛рде

[n: number]: T | undefined;

@ рдПрд▓реЗрдХреНрд╕реА-рдмрд╛рдпрдХреЛрд╡ рд╢рд╛рдпрдж рдЖрдк рдЙрд╕ рд╣рд┐рд╕реНрд╕реЗ рд╕реЗ рдЪреВрдХ рдЧрдП рдЬрд╣рд╛рдВ рдореИрдВрдиреЗ рдХрд╣рд╛ рдерд╛ рдХрд┐ рдореБрдЭреЗ рд╕рд░рдгрд┐рдпреЛрдВ рдХреА рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рд╣реИред рдореБрдЭреЗ рдЗрд╕ рдмрд╛рдд рдХреА рдкрд░рд╡рд╛рд╣ рд╣реИ рдХрд┐ рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдиреЗ { [k: string]: T } рдкреНрд░рдХрд╛рд░ рдХрд╛ рдХреБрдЫ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рд╣реИ, рдФрд░ рдореИрдВ рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рдХреБрдЫ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдРрд╕реА рд╡рд╕реНрддреБ рддрдХ рдкрд╣реБрдВрдЪ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдХреЗрд╡рд▓ lib.d.ts рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдХреЗ рдЗрд╕реЗ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ; рдЗрд╕рдХреЗ рд▓рд┐рдП рд╡рд┐рдЪрд╛рд░рд╛рдзреАрди рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдХреНрдпрд╛ рдЖрдкрдХреЗ рдкрд╛рд╕ рддреГрддреАрдп рдкрдХреНрд╖ рдкрд░рд┐рднрд╛рд╖рд╛ рдлрд╝рд╛рдЗрд▓реЛрдВ рдкрд░ рдирд┐рдпрдВрддреНрд░рдг рд╣реИ? рдпрджрд┐ рдРрд╕рд╛ рд╣реИ рддреЛ рдЖрдк рдЙрдиреНрд╣реЗрдВ рдареАрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

рдФрд░ рдЕрдм рд╣рдо рд╡рд╛рдкрд╕ рдЖ рдЧрдП рд╣реИрдВ

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

рд╕рдордп рдПрдХ рд╕рдкрд╛рдЯ рд╡реГрддреНрдд рд╣реИред

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

рд╣рд╛рдВ, рдореБрдЭреЗ рд╣рд░ рд╕рдордп рджреВрд╕рд░реЛрдВ рдХреА рдЯрд╛рдЗрдкрд┐рдВрдЧ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдиреА рдкрдбрд╝рддреА рд╣реИ рдФрд░ рдореИрдВ рдЗрд╕реЗ рдХрдо рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред

рдФрд░ рдЖрдк рдПрди рд╡рд░реНрд╖реЛрдВ рдореЗрдВ, рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЕрднреА рдХреЗ рд▓рд┐рдП рдЖрдк рдкреАрдбрд╝рд┐рдд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдКрдкрд░ рдЙрда рд╕рдХрддреЗ рд╣реИрдВ

рдЖрдкрдХреЗ рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд░рдЪрдирд╛рддреНрдордХ рдЗрдирдкреБрдЯ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж

рдЗрд╕рдХреЗ рд▓рд┐рдП рд░рдЪрдирд╛рддреНрдордХ рдЗрдирдкреБрдЯ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ, рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдмрдВрдж рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐:
рдПред рдпрд╛ рддреЛ [x] undefined рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВ, рдЗрд╕ рдкрд░ рдирд┐рд░реНрдгрдп рдбреЗрд╡рд▓рдкрд░реНрд╕ рдкрд░ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ

  • рдЙрдиреНрд╣реЗрдВ рдпрд╣ рд╕рдм рдЕрдкрдиреЗ рджрд┐рдорд╛рдЧ рдореЗрдВ рд░рдЦрдиреЗ рджреЗрдВ рдЬреИрд╕рд╛ рдХрд┐ рд╡реЗ рд╣рдореЗрд╢рд╛ рдкрд╣рд▓реЗ рдХрд░рддреЗ рдереЗ
  • рдпрд╛ рд╕реБрдЭрд╛рд╡ рдХреЗ рдЕрдиреБрд╕рд╛рд░ lib.d.ts рдФрд░ 3rd-party.d.ts рдХреЛ рдмрджрд▓рдХрд░

рдмреАред рдпрд╛ #a . рдореЗрдВ рд╣рд╛рдереЛрдВ рд╕реЗ рдЖрд╕рд╛рдиреА рд╕реЗ рдХреА рдЬрд╛ рд╕рдХрдиреЗ рд╡рд╛рд▓реА рдХрд┐рд╕реА рдЪреАрдЬрд╝ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рд╕рд┐рдВрдЯреИрдХреНрд╕ / рдкреНрд░рдХрд╛рд░ / рдкреНрд░рд╡рд╛рд╣ рд╡рд┐рд╢реНрд▓реЗрд╖рдг / N рд╡рд░реНрд╖ рд▓рдЧрддреЗ рд╣реИрдВ

рдореБрджреНрджрд╛ (рдмреА) рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рд╕реНрддрд╛рд╡ рд╣реИ, рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рдХреЛрдИ рдирдпрд╛ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рдпрд╣ рд╕рд┐рд░реНрдл рдПрдХ рдХрдВрдкрд╛рдЗрд▓рд░ рдзреНрд╡рдЬ рд╣реИред

рдпрд╣ рдиреАрдЪреЗ рдЖрддрд╛ рд╣реИ рдХрд┐ { [x: string]: {} } рдкреНрд░рдХрд╛рд░ рд▓рдЧрднрдЧ рд╣рдореЗрд╢рд╛ рдЭреВрда рд╣реЛрддрд╛ рд╣реИ; Proxy рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рдЫреЛрдбрд╝рдХрд░, рдРрд╕реА рдХреЛрдИ рд╡рд╕реНрддреБ рдирд╣реАрдВ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЕрдирдВрдд рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдЧреБрдг рд╣реЛрдВ, рд╣рд░ рд╕рдВрднрд╡ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдмрд╣реБрдд рдХрдоред рдкреНрд░рд╕реНрддрд╛рд╡ рдПрдХ рд╕рдВрдХрд▓рдХ рдзреНрд╡рдЬ рд╣реИ рдЬреЛ рдЗрд╕реЗ рдкрд╣рдЪрд╛рдирддрд╛ рд╣реИред рдпрд╣ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЬреЛ рд╣рд╛рд╕рд┐рд▓ рд╣реБрдЖ рд╣реИ рдЙрд╕рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдмрд╣реБрдд рдХрдард┐рди рд╣реИ; рдореИрдВ рдЙрд╕ рдХреЙрд▓ рдХреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдирдХрд░реНрддрд╛рдУрдВ рдкрд░ рдЫреЛрдбрд╝ рджреВрдБрдЧрд╛ред

рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рди рддреЛ

  • T | undefined
  • рди рд╣реА T

рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рд╕рд╣реА рд╣реИ

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

T | undefined рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рд╕рд╣реА рд╣реИ, рдЬрд┐рди рдХрд╛рд░рдгреЛрдВ рд╕реЗ рдореИрдВрдиреЗ рдЕрднреА рджрд┐рдпрд╛ рд╣реИред рдЖрд╢реНрд░рд┐рдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдкрдиреЗ рдирд┐рд░рд░реНрдердХ рдЬреБрдорд▓реЗ рдХреЛ рдирдЬрд╝рд░рдЕрдВрджрд╛рдЬрд╝ рдХрд░ рджреЗрдВрдЧреЗ, рдЖрдкрдХрд╛ рджрд┐рди рд╢реБрдн рд╣реЛред

рдЖрдк рдЬрд┐рддрдирд╛ рдЪрд╛рд╣реЗрдВ рдореБрдЭреЗ рдЕрдирджреЗрдЦрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рд▓реЗрдХрд┐рди T | undefined рд▓рд┐рдП рдПрдХ рдУрд╡рд░рд╢реВрдЯ рд╣реИ

declare var items: number[];
for (var index = 0; index < items.length; index ++) {
   void items[index];
}

рдореИрдВ рдирд╣реАрдВ рдмрд▓реНрдХрд┐ рд╣реЛрдЧрд╛ T | undefined рд╡рд╣рд╛рдБ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдФрд░ рд╕рдВрдХрд▓рдХ рдХрд┐ рдмрддрд╛ index рдХреЗ рдПрдХ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдЗрдВрдбреЗрдХреНрд╕ рд░реЗрдВрдЬ рд╣реИ items рдЗрд╕ рддрд░рд╣ рдмрд╛рд╣рд░ рдирд╣реАрдВ рдорд┐рд▓рддрд╛ рд╣реИ, рддреЛ рдЬрдм рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд╛рдЧреВ рд╕реАрдорд╛ items ; рд╕рд╛рдзрд╛рд░рдг рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЬреИрд╕реЗ рдХрд┐ рдЕрдХреНрд╕рд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ for / while рд▓реВрдк рдЖрдХреГрддрд┐рдпреЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ, рд╕рдВрдХрд▓рдХ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЗрд╕рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд╕рдХрддрд╛ рд╣реИ; рдЬрдЯрд┐рд▓ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, undefined s рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдФрд░ рд╣рд╛рдБ, рдореВрд▓реНрдп-рдЖрдзрд╛рд░рд┐рдд рдкреНрд░рдХрд╛рд░ рдпрд╣рд╛рдБ рдЙрдкрдпреБрдХреНрдд рд╣реЛрдВрдЧреЗ; рд╢рд╛рдмреНрджрд┐рдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкреНрд░рдХрд╛рд░ рдЗрддрдиреЗ рдЙрдкрдпреЛрдЧреА рд╣реИрдВ, рд╢рд╛рдмреНрджрд┐рдХ рдмреВрд▓рд┐рдпрди рдФрд░ рд╕рдВрдЦреНрдпрд╛ рдФрд░ рд╢реНрд░реЗрдгреА/рд╕реЗрдЯ-рдСрдл-рд░реЗрдВрдЬ рдкреНрд░рдХрд╛рд░ рдХреНрдпреЛрдВ рдирд╣реАрдВ рд╣реИрдВ? рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛрдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╣ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд╕рд╛рде рд╡реНрдпрдХреНрдд рдХреА рдЬрд╛ рд╕рдХрдиреЗ рд╡рд╛рд▓реА рд╣рд░ рдЪреАрдЬ рдХреЛ рдХрд╡рд░ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реИ (рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрд▓реНрдо рдЬреЛ рдЗрд╕реЗ рд╕реАрдорд┐рдд рдХрд░рддрд╛ рд╣реИ)ред

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

@ рдПрд▓реЗрдХреНрд╕реА-рдмрд╛рдпрдХреЛрд╡, рдЬрд┐рдЬреНрдЮрд╛рд╕реБ рдЙрд╕ рдмрджрд▓рд╛рд╡ рдХреЗ рдмрд╛рдж рдЖрдкрдХрд╛ рдЕрдиреБрднрд╡ рдХреНрдпрд╛ рдерд╛? рдЖрдкрдХреЛ рдХрд┐рддрдиреА рдмрд╛рд░ ! ? рдФрд░ рдЖрдк рдХрд┐рддрдиреА рдмрд╛рд░ рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдмрдЧреНрд╕ рдХреЛ рдлрд╝реНрд▓реИрдЧ рдХрд░рддреЗ рд╣реБрдП рдкрд╛рддреЗ рд╣реИрдВ?

@mhegazy рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ рдореИрдВрдиреЗ T рд╕реЗ T | undefined рддрдХ рдЬрд╛рдиреЗ рдореЗрдВ рдмрд╣реБрдд рдЕрдВрддрд░ рдирд╣реАрдВ рджреЗрдЦрд╛, рди рд╣реА рдореИрдВрдиреЗ рдХреЛрдИ рдмрдЧ рдкрдХрдбрд╝рд╛, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореЗрд░реА рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдореИрдВ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рд░рдгреА рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реВрдВ рдЬреЛ ! рд░рдЦрддрд╛ рд╣реИ

https://github.com/aleksey-bykov/basic/blob/master/array.ts

рдореИрдВ рдХрд┐рд╕ lib рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рдкреНрд░рдХрд╛рд░ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдвреВрдБрдв рд╕рдХрддрд╛ рд╣реВрдБ? рдореИрдВрдиреЗ Array рдХреЛ [n: number]: T рд╕реЗ [n: number]: T | undefined рдвреВрдВрдврд╛ рдФрд░ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рд╣реИред рдЕрдм рдореИрдВ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд▓рд┐рдП рднреА рдпрд╣реА рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред

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

рдЖрдкрдХреЛ рдЕрдкрдиреЗ рдХреЛрдб рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рд╕рдЯреАрдХ рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рдХреЛ рджреЗрдЦрдиреЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдареАрдХ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ

рдкреНрд░рддреНрдпрдХреНрд╖ рдХреБрдВрдЬреА рд▓реБрдХрдЕрдк рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреИрд╕реЗ? рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП

const xs = { foo: 'bar' }
xs['foo']

рд╡рд╣рд╛рдБ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рддрд░реАрдХрд╛ рд╣реИ T | undefined рдХреЗ рдмрдЬрд╛рдп T рдпрд╣рд╛рдБ? рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдореИрдВ рд╣рд░ рдЬрдЧрд╣ рдЕрдкрдиреЗ рдХреЛрдбрдмреЗрд╕ рдореЗрдВ рдЗрди рд╣реЗрд▓реНрдкрд░реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ, рдЬреИрд╕реЗ рдХрд┐ рд╕рд░рдгрд┐рдпреЛрдВ рдФрд░ рд╡рд╕реНрддреБрдУрдВ рдкрд░ рдЗрдВрдбреЗрдХреНрд╕ рд▓реБрдХрдЕрдк рдХреЗ рд▓рд┐рдП рд╕реБрд░рдХреНрд╖рд┐рдд рд╡рд┐рдХрд▓реНрдк:

// TS doesn't return the correct type for array and object index signatures. It returns `T` instead
// of `T | undefined`. These helpers give us the correct type.
// https://github.com/Microsoft/TypeScript/issues/13778
export const getIndex = function<X> (index: number, xs: X[]): X | undefined {
  return xs[index];
};
export const getKeyInMap = function<X> (key: string, xs: { [key: string]: X }): X | undefined {
  return xs[key];
};

@mhegazy рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдЗрд╕реЗ рд▓рд┐рдЦрд╛ рд╣реИ, рдореИрдВ https://unsplash.com рдкрд░ рдЙрддреНрдкрд╛рджрди рдореЗрдВ рдПрдХ рдмрдЧ рдХреЛ рдареАрдХ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдЬрд┐рд╕реЗ рд╕рдЦреНрдд рдЗрдВрдбреЗрдХреНрд╕ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдкрдХрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рдерд╛ред

рдореИрдВ рджреЗрдЦрддрд╛ рд╣реВрдВ, рдореИрдк рдХрд┐рдП рдЧрдП рдкреНрд░рдХрд╛рд░ рдХреЗ рдСрдкрд░реЗрдЯрд░ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:

const xs = { foo: 'bar' };
type EachUndefined<T> = { [P in keyof T]: T[P] | undefined; }
const xu : EachUndefined<typeof xs> = xs;
xu.foo; // <-- string | undefined

рдпрджрд┐ --strictArrayIndex рдЬреИрд╕рд╛ рдХреЛрдИ рдлрд╝реНрд▓реИрдЧ рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдлрд╝реНрд▓реИрдЧ рдХреЛ lib.d.ts рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рд▓реЛрдЧ lib.d.ts рдлрд╛рдЗрд▓реЛрдВ рдХреЗ рд╕рдЦреНрдд рд╕рдВрд╕реНрдХрд░рдг рдЬрд╛рд░реА рдХрд░ рд╕рдХреЗрдВ рдЬреИрд╕реЗ " lib": ['strict-es6'] ?

рдЗрд╕рдореЗрдВ рдХрдИ рд╕реБрдзрд╛рд░ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рди рдХрд┐ рдХреЗрд╡рд▓ рд╕рдЦреНрдд рд╕рд░рдгреА рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, Object.keys :

interface ObjectConstructor {
    // ...
    keys(o: {}): string[];
}

рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:

interface ObjectConstructor {
    // ...
    keys<T>(o: T): (keyof T)[];
}

рдЖрдЬ рдХреЗ рдПрд╕рдмреАрдПрд╕ рд╕реЗ рдЕрдкрдбреЗрдЯ: рд╣рдо 30 рдорд┐рдирдЯ рддрдХ рдПрдХ-рджреВрд╕рд░реЗ рдкрд░ рдЪрд┐рд▓реНрд▓рд╛рддреЗ рд░рд╣реЗ рдФрд░ рдХреБрдЫ рдирд╣реАрдВ рд╣реБрдЖред тАНтЩВя╕П

@RyanCavanaugh рдПрдХ SBS рдХреНрдпрд╛ рд╣реИ, рдЬрд┐рдЬреНрдЮрд╛рд╕рд╛ рд╕реЗ рдмрд╛рд╣рд░?

@radix "рд╕реБрдЭрд╛рд╡ рдмреИрдХрд▓реЙрдЧ

рдпрд╣ рдкреЗрдЪреАрджрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╕рдорд╛рдзрд╛рди рд╕реНрдкрд╖реНрдЯ рд╣реИ:
рджреЛрдиреЛрдВ T рдФрд░ T | undefined рдЧрд▓рдд рд╣реИрдВ, рдПрдХ рд╣реА рд╕рд╣реА рддрд░реАрдХрд╛ рд╣реИ рдХрд┐ рдЗрдВрдбреЗрдХреНрд╕ рд╡реЗрд░рд┐рдПрдмрд▓ рдХреЛ рдЗрд╕рдХреЗ рдХрдВрдЯреЗрдирд░ рдХреА рдХреНрд╖рдорддрд╛ рд╕реЗ рдЕрд╡рдЧрдд рдХрд░рд╛рдпрд╛ рдЬрд╛рдП, рдпрд╛ рддреЛ рд╕реЗрдЯ рд╕реЗ рдЙрдард╛рдХрд░ рдпрд╛ рдХрд┐рд╕реА рдЬреНрдЮрд╛рдд рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рд░реЗрдВрдЬ рдореЗрдВ рд╕рдВрд▓рдЧреНрди рдХрд░рдХреЗ

@RyanCavanaugh рдореИрдВ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪ рд░рд╣рд╛ рдерд╛, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЪрд╛рд▓ рдореЗрдВ рд╕рднреА рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╕реЗ 87% рд╢рд╛рдорд┐рд▓ рд╣реЛрдВрдЧреЗ:

  • values[index] T рдпрджрд┐ рд╕реВрдЪрдХрд╛рдВрдХ for (HERE; ...) рдореЗрдВ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реЛ
  • values[somethingElse] T | undefined рдХреЗ рдмрд╛рд╣рд░ рдШреЛрд╖рд┐рдд рд╕рднреА рдЪрд░реЛрдВ рдХреЗ рд▓рд┐рдП for

@aleksey-bykov рд╣рдордиреЗ рдХреБрдЫ рдФрд░ рднреА рдмреЗрд╣рддрд░ рдЪрд░реНрдЪрд╛ рдХреА - рдХрд┐ " arr[index] рд▓рд┐рдП рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЧрд╛рд░реНрдб рддрдВрддреНрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ index < arr.length рджреНрд╡рд╛рд░рд╛ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рд▓реЗрдХрд┐рди рдпрд╣ рдЙрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдорджрдж рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ рдЬрд╣рд╛рдВ рдЖрдк pop 'd рдмреАрдЪ рдореЗрдВ рдПрдХ рд▓реВрдк, рдпрд╛ рдЕрдкрдиреЗ рд╕рд░рдгреА рдХреЛ рдЙрд╕ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдкрд╛рд╕ рдХрд░ рджрд┐рдпрд╛ рдЬрд┐рд╕рдиреЗ рддрддреНрд╡реЛрдВ рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛ред рдРрд╕рд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдРрд╕рд╛ рдирд╣реАрдВ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд▓реЛрдЧ рдРрд╕реЗ рддрдВрддреНрд░ рдХреА рддрд▓рд╛рд╢ рдореЗрдВ рд╣реИрдВ рдЬреЛ рдУрдУрдмреА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ 82.9% рд╕рдордп рд╕реЗ рд░реЛрдХрддрд╛ рд╣реИ - рдЖрдЦрд┐рд░рдХрд╛рд░ , рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдорд╛рдорд▓рд╛ рд╣реИ рдХрд┐ рд╕рд░рдгреА-рдЕрдиреБрдХреНрд░рдордг рдХреЛрдб рдХрд╛ рд▓рдЧрднрдЧ рд╡рд╣ рдЕрдВрд╢ рд╡реИрд╕реЗ рднреА рд╕рд╣реА рд╣реИред рдЧрд▓рдд рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдмрдЧ рди рдкрдХрдбрд╝рддреЗ рд╣реБрдП рд╕рд╣реА рдХреЛрдб рдореЗрдВ рд╕рдорд╛рд░реЛрд╣ рдЬреЛрдбрд╝рдирд╛ рдПрдХ рдмреБрд░рд╛ рдкрд░рд┐рдгрд╛рдо рд╣реИред

рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдПрд▓реЗрдХреНрд╕реА рдХрднреА рднреА рдПрдХ рд╕рд░рдгреА рдХреЛ рдмрджрд▓ рджреЗрдЧрд╛

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

  • рдЖрдк рдХрдВрдЯреЗрдирд░ рдореЗрдВ рдЙрддреНрдкрд░рд┐рд╡рд░реНрддрди рдЯреНрд░реИрдХ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ
  • рдЖрдк рд╕реВрдЪрдХрд╛рдВрдХ рдЬреЛрдбрд╝рддреЛрдбрд╝ рдХреЛ рдЯреНрд░реИрдХ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ

рдЗрд╕рдХреЗ рд╕рд╛рде рдХрд╣рд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдЖрдк рдмрд╣реБрдд рдХрдо рдЧрд╛рд░рдВрдЯреА рджреЗ рд╕рдХрддреЗ рд╣реИрдВ, рдпрджрд┐ рдРрд╕рд╛ рд╣реИ рддреЛ рдЖрдк рдХреЛрд╢рд┐рд╢ рдХреНрдпреЛрдВ рдХрд░реЗрдВрдЧреЗ рдпрджрд┐ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрдкрдпреЛрдЧ рдХрд╛ рдорд╛рдорд▓рд╛ < array.length рднреАрддрд░ рд╕рднреА рддрддреНрд╡реЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЧреВрдВрдЧрд╛ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рд╣реИ

рдЬреИрд╕реЗ рдореИрдВрдиреЗ рдЖрдорддреМрд░ рдкрд░ рдХрд╣рд╛

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

рдЗрд╕рд▓рд┐рдП рдЬрдм рддрдХ рд╕реВрдЪрдХрд╛рдВрдХ рдХрд┐рд╕реА рддрд░рд╣ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рд╣рдо рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдХреЗ рд╕рд╛рде рдХреБрдЫ рдирд╣реАрдВ рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ) рдпрд╣ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдХрд░рдирд╛ рдЙрдЪрд┐рдд рд╣реИ рдХрд┐ рд╕реВрдЪрдХрд╛рдВрдХ рд▓реВрдк рдмреЙрдбреА рдХреЗ рд╕рд╛рде рд╕рд╣реА рд╣реИ

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

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

рд╕рд╣реА рдХреЛрдб рдореЗрдВ рд╕рдорд╛рд░реЛрд╣ рдЬреЛрдбрд╝рдирд╛

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

рдмрдЧ рдирд╣реАрдВ рдкрдХрдбрд╝рддреЗ рд╕рдордп

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

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

рд╣рдо рдХреБрдЫ рднреА рдЕрдЬреАрдм рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдФрд░ рдкреНрд░рдХрд╛рд░ рдЧрд▓рдд рд╣реИрдВред

рдпрд╣ рдкреИрд░рд╛рдЧреНрд░рд╛рдл, рдореЗрд░реЗ рд▓рд┐рдП, рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рди рд╣реЛрдиреЗ рдХреЗ рдПрдХ рдЕрдЪреНрдЫреЗ рдХрд╛рд░рдг рдХреА рддрд░рд╣ рдкрдврд╝рддрд╛ рд╣реИред рдХрд┐рд╕реА рд╕рд░рдгреА рдХреЛ рд╕реАрдорд╛ рд╕реЗ рдмрд╛рд╣рд░ рдПрдХреНрд╕реЗрд╕ рдХрд░рдирд╛ рдПрдХ рдЕрдЬреАрдм рдмрд╛рдд рд╣реИ; рдкреНрд░рдХрд╛рд░ рдХреЗрд╡рд▓ "рдЧрд▓рдд" рд╣реИрдВ рдпрджрд┐ рдЖрдк рдПрдХ рдЕрд╕рд╛рдорд╛рдиреНрдп рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ (OOBing)ред рдПрдХ рд╕рд░рдгреА рд╕реЗ рдХреЛрдб рдкрдврд╝рдиреЗ рдХрд╛ рд╡рд┐рд╢рд╛рд▓ рдмрд╣реБрдордд рдРрд╕рд╛ рдЗрди-рдмрд╛рдЙрдВрдб рдХрд░рддрд╛ рд╣реИ; рдЗрд╕ рддрд░реНрдХ рджреНрд╡рд╛рд░рд╛ рдЙрди рдорд╛рдорд▓реЛрдВ рдореЗрдВ undefined рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдирд╛ "рдЧрд▓рдд" рд╣реЛрдЧрд╛ред

... рд╡рд░реНрдХрд┐рдВрдЧ рдХреЛрдб рдЬреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╡рд┐рдлрд▓ рд░рд╣рддрд╛ рд╣реИ

рдореБрдЭреЗ рдХрд┐рд╕реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрддрд╛ рдирд╣реАрдВ рд╣реИ - рдХреНрдпрд╛ рдЖрдк рдЙрдиреНрд╣реЗрдВ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЗрдВрдЧрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?

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

рдЗрд╕ рдФрд░ рдПрдХ TSLint рдирд┐рдпрдо рдХреЗ рдмреАрдЪ рдЙрдкрдпреЛрдЧреА рдЕрдВрддрд░ рдХреНрдпрд╛ рд╣реИ рдЬреЛ рдХрд╣рддрд╛ рд╣реИ рдХрд┐ "рд╕рднреА рд╕рд░рдгреА рдПрдХреНрд╕реЗрд╕ рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдореЗрдВ рдкрд┐рдЫрд▓рд╛ ! рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП"?

@RyanCavanaugh рдореЗрд░реА рдзрд╛рд░рдгрд╛ рдпрд╣ рд╣реИ рдХрд┐ TSLint рдирд┐рдпрдо рд╕рдВрдХреАрд░реНрдг рдкреНрд░рдХрд╛рд░реЛрдВ рдпрд╛ рдирд┐рдпрдВрддреНрд░рдг-рдкреНрд░рд╡рд╛рд╣ рдкреНрд░рдХрд╛рд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реЛрдЧрд╛ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП if рдореЗрдВ рдкрд╣реБрдВрдЪ рдХреЛ рд▓рдкреЗрдЯрдирд╛, рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХрдирд╛, return рдЖрдИрдПрдирдЬреА рдпрд╛ continue рдЕрдЧрд░ рдпрд╣ рд╕реЗрдЯ рдирд╣реАрдВ рд╣реИ, рдЖрджрд┐)ред рдпрд╣ рдХреЗрд╡рд▓ рдРрд░реЗ рдПрдХреНрд╕реЗрд╕ рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╣реИ, рдпрд╣ рд╡рд┐рдирд╛рд╢ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреА рд╣реИред https://github.com/Microsoft/TypeScript/issues/13778#issuecomment -336265143 рдореЗрдВ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреИрд╕рд╛ рджрд┐рдЦреЗрдЧрд╛? ! рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрд╕реЗ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ undefined рд░реВрдк рдореЗрдВ рдЗрди рдЪрд░реЛрдВ рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рдмрдирд╛рдиреА рд╣реЛрдЧреАред рдЬреЛ рдореЗрд░реЗ рд▓рд┐рдП рдХреБрдЫ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдЬреЛ рдЯрд╛рдЗрдк рдЪреЗрдХрд░ рдХреЛ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓рд┐рдВрдЯрд░ рдирд╣реАрдВред

@RyanCavanaugh

рдпрд╣ рдкреИрд░рд╛рдЧреНрд░рд╛рдл, рдореЗрд░реЗ рд▓рд┐рдП, рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рди рд╣реЛрдиреЗ рдХреЗ рдПрдХ рдЕрдЪреНрдЫреЗ рдХрд╛рд░рдг рдХреА рддрд░рд╣ рдкрдврд╝рддрд╛ рд╣реИред рдХрд┐рд╕реА рд╕рд░рдгреА рдХреЛ рд╕реАрдорд╛ рд╕реЗ рдмрд╛рд╣рд░ рдПрдХреНрд╕реЗрд╕ рдХрд░рдирд╛ рдПрдХ рдЕрдЬреАрдм рдмрд╛рдд рд╣реИ; рдкреНрд░рдХрд╛рд░ рдХреЗрд╡рд▓ "рдЧрд▓рдд" рд╣реИрдВ рдпрджрд┐ рдЖрдк рдПрдХ рдЕрд╕рд╛рдорд╛рдиреНрдп рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ (OOBing)ред

... рд╡рд░реНрдХрд┐рдВрдЧ рдХреЛрдб рдЬреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╡рд┐рдлрд▓ рд░рд╣рддрд╛ рд╣реИ

рдореБрдЭреЗ рдХрд┐рд╕реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрддрд╛ рдирд╣реАрдВ рд╣реИ - рдХреНрдпрд╛ рдЖрдк рдЙрдиреНрд╣реЗрдВ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЗрдВрдЧрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?

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

рдЗрд╕реЗ рд╣рдореЗрд╢рд╛ рдХрд┐рд╕реА рдЪреАрдЬрд╝ рдХреА рддреБрд▓рдирд╛ undefined

рдЬреЛ рд╢рд░реНрдо рдХреА рдмрд╛рдд рд╣реИ

const canWeDoIt = null === undefined; // yes we can!

рдЗрд╕реЗ рд╣рдореЗрд╢рд╛ рдХрд┐рд╕реА рдЪреАрдЬрд╝ рдХреА рддреБрд▓рдирд╛ undefined

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

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

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

export type Chooser = (context?: Context) => number | string;
export interface Choices {
    [choice: number]: Struct;
    [choice: string]: Struct;
}

export const Branch = (chooser: Chooser, choices: Choices, context?: Context): Struct => {
    return choices[chooser(context)];  // Could be undefined
}

рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдФрд░ рдХреЗрд╡рд▓ | undefined рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдмрджрд▓рдирд╛, @types/node рдРрд╕рд╛ рдХрд░рддрд╛ рд╣реИ process.env :

    export interface ProcessEnv {
        [key: string]: string | undefined;
    }

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

process.env.SOME_CONFIG && JSON.parse(process.env.SOME_CONFIG)

рджреЗрддрд╛ рд╣реИ

[ts]
Argument of type 'string | undefined' is not assignable to parameter of type 'string'.
  Type 'undefined' is not assignable to type 'string'.

@felixfbecker

рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдпрд╣ рдЗрд╕ рдмрдЧ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ: https://github.com/Microsoft/TypeScript/issues/17960

рдЖрдк рдПрдХ рдЪрд░ рдХреЗ рд▓рд┐рдП env var рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдХреЗ рдФрд░ рдлрд┐рд░ рдЙрд╕рдХреА рд░рдЦрд╡рд╛рд▓реА рдХрд░рдХреЗ рдЗрд╕реЗ рд╣рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

const foo = process.env.SOME_CONFIG
foo && JSON.parse(foo);

рдХреБрдЫ рдиреЛрдб рдЯрд╛рдЗрдкрд┐рдВрдЧ рдореЗрдВ | undefined рдЬреЛрдбрд╝рдирд╛ рдХреЛрдб рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдХреНрд╕рд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдЧреБрдгреЛрдВ рдХреЗ рд╕рд╛рде рдЗрди рдЗрдВрдЯрд░рдлреЗрд╕ рдХреА рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП рд╡реГрджреНрдзрд┐ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдИрдП

interface ProcessEnv {
  foo?: string;
  bar?: string;
}

рдЗрдВрдбреЗрдХреНрд╕ рд╕рд┐рдЧреНрдиреЗрдЪрд░ рдореЗрдВ | undefined рдмрд┐рдирд╛ TSC рд╢рд┐рдХрд╛рдпрдд рдХрд░рддрд╛ рд╣реИ Property 'foo' of type 'string | undefined' is not assignable to string index type 'string'. ред

рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдХреА рдПрдХ рд▓рд╛рдЧрдд рд╣реИ рдпрджрд┐ рдЖрдкрдХреЛ рдЕрддрд┐рд░рд┐рдХреНрдд | undefined рд╡рд╛рд▓реЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рд╣реИ рдФрд░ рдЬрд┐рдирдХреЗ рдкрд╛рд╕ рдпрд╣ рдирд╣реАрдВ рд╣реИред

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рд╣рдо рдЗрд╕рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛ рд╕рдХреЗрдВред

рдореИрдВ рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рдЕрдкрдиреЗ рд╡рд┐рдЪрд╛рд░ рдПрдХрддреНрд░ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред

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

  • рд╢рдмреНрджрдХреЛрд╢ рдЙрд░реНрдл тАЛтАЛрдирдХреНрд╢реЗ, рдЬрд╣рд╛рдВ рдЪрд╛рдмрд┐рдпрд╛рдБ рдЕрдЬреНрдЮрд╛рдд рд╣реИрдВ
  • рд░рд┐рдХреЙрд░реНрдб, рдЬрд╣рд╛рдВ рдЪрд╛рдмрд┐рдпрд╛рдБ рдЬреНрдЮрд╛рдд рд╣реИрдВ

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

рд╢рдмреНрджрдХреЛрд╢реЛрдВ (рдЙрд░реНрдл рдорд╛рдирдЪрд┐рддреНрд░) рдФрд░ рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд▓рд┐рдП, рд╕реВрдЪрдХрд╛рдВрдХ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рд╣рдо рдореВрд▓реНрдп рдкреНрд░рдХрд╛рд░ рдореЗрдВ | undefined рд╢рд╛рдорд┐рд▓ рдХрд░рдирд╛ рдЪреБрди рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, { [key: index]: string | undefined } ред рд╕рднреА рдХреБрдВрдЬрд┐рдпрд╛рдБ рд▓реБрдХрдЕрдк рдорд╛рдиреНрдп рд╣реИрдВ (рдХреНрдпреЛрдВрдХрд┐ рдХреБрдВрдЬрд┐рдпрд╛рдБ рд╕рдВрдХрд▓рди рд╕рдордп рдкрд░ рдЬреНрдЮрд╛рдд рдирд╣реАрдВ рд╣реЛрддреА рд╣реИрдВ), рдФрд░ рд╕рднреА рдХреБрдВрдЬрд┐рдпрд╛рдБ рдПрдХ рд╣реА рдкреНрд░рдХрд╛рд░ рдХреА рд╣реЛрддреА рд╣реИрдВ (рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, T | undefined )ред

рдЗрдВрдбреЗрдХреНрд╕ рд╕рд┐рдЧреНрдиреЗрдЪрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдХреЗрд╡рд▓ рдбрд┐рдХреНрд╢рдирд░реА рдСрдмреНрдЬреЗрдХреНрдЯ рдкреИрдЯрд░реНрди рдФрд░ рдПрд░реЗрдЬрд╝ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдпрд╣ рд╡рд╛рдВрдЫрд┐рдд рд╣реИ рдХрд┐ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдЗрдВрдбреЗрдХреНрд╕ рд╕рд┐рдЧреНрдиреЗрдЪрд░ рд╡реИрд▓реНрдпреВ рдЯрд╛рдЗрдк рдореЗрдВ | undefined рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП: рдпрджрд┐ рдХреБрдВрдЬрд┐рдпрд╛рдБ рдЬреНрдЮрд╛рдд рдирд╣реАрдВ рд╣реИрдВ, рдФрд░ рдХреБрдВрдЬреА рд▓реБрдХрдЕрдк рд╕рдВрднрд╡рддрдГ undefined рд▓реМрдЯрд╛рддреЗ рд╣реИрдВ

рдмрдЧ рдХреЗ рдЕрдЪреНрдЫреЗ рдЙрджрд╛рд╣рд░рдг рд╣реИрдВ рдЬреЛ рдЗрд╕рдХреЗ рдмрд┐рдирд╛ рдЕрджреГрд╢реНрдп рджрд┐рдЦрд╛рдИ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ Array.prototype.find undefined рд▓реМрдЯрд╛рдирд╛, рдпрд╛ рдкреНрд░рдореБрдЦ рд▓реБрдХрдЕрдк рдЬреИрд╕реЗ array[0] рд░рд┐рдЯрд░реНрдирд┐рдВрдЧ undefined ред (рдХреБрдВрдЬреА рд▓реБрдХрдЕрдк рдХреЗ рд▓рд┐рдП рд╡рд┐рдирд╛рд╢ рд╕рд┐рд░реНрдл рдЪреАрдиреА рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рд╣реИред) рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рдХреЛ рд╕рд╣реА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП getKey рдЬреИрд╕реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд▓рд┐рдЦрдирд╛ рд╕рдВрднрд╡ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рдХреЛрдбрдмреЗрд╕ рдореЗрдВ рдЗрди рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд╢рд╛рд╕рди рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

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

рдХреНрдпрд╛ рдпрд╣ рдмрдХрд╛рдпрд╛ рдореБрджреНрджрд╛ рд╣реИ, рдпрд╛ рдХреНрдпрд╛ рдореИрдВ рдЧрд▓рдд рд╕рдордЭ рд░рд╣рд╛ рд╣реВрдБ?

рдореИрдВрдиреЗ рдХрд┐рди рдорд╛рдорд▓реЛрдВ рдФрд░ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ?

рдЖрдкрдХреЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдкреНрд░рдХрд╛рд░ рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ | рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рдбрд╛рд▓рдиреЗ рдХреЗ рд╕рд╛рде (рдХрдо рд╕реЗ рдХрдо) рджреЛ рдЕрдиреНрдп рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВ:

  • рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЖрдк рдЗрди рд╡рд╕реНрддреБрдУрдВ рдореЗрдВ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рдЕрд╕рд╛рдЗрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЗрд░рд╛рджрд╛ рдирд╣реАрдВ рд╣реИ
  • рдЕрдиреНрдп рд╕рдВрдЪрд╛рд▓рди, рдЬреИрд╕реЗ Object.values тАЛтАЛтАЛтАЛ(рдпрд╛ _.values) рдЖрдкрдХреЛ рдкрд░рд┐рдгрд╛рдореЛрдВ рдореЗрдВ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдмрд╣реБрдд рд╣реА рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд┐рдВрджреБ рд╣реИред

рдлрд┐рд▓рд╣рд╛рд▓, рдореИрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде рдкреНрд░рдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ:

const safelyAccessProperty = <T, K extends keyof T>(object: T, key: K): T[K] | undefined => object[key]; рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ

рдХреА рддрд░рд╣ рдлрд┐рд░ рдкрд╣реБрдБрдЪ рдЧреБрдг safelyAccessProperty(myObject, myKey) , рдХреЗ рдмрдЬрд╛рдп myObject[myKey] ред

@plul рдЕрдЪреНрдЫреА рдкрдХрдбрд╝ред рдЪрд░реНрдЪрд╛ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд░реАрдб рдСрдкрд░реЗрд╢рдВрд╕ рдкрд░ рдХреЗрдВрджреНрд░рд┐рдд рд╣реИ, рд▓реЗрдХрд┐рди рдЗрдВрдбреЗрдХреНрд╕рд░ рдкреНрд░рдХрд╛рд░ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рджреЛ рдЧреБрдирд╛ рд╣реИ, рдФрд░ | undefined рдЬреЛрдбрд╝рдиреЗ рд╕реЗ undefined рдорд╛рди рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдорд┐рд▓ рдЬрд╛рдПрдЧреАред

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

рдЗрд╕реЗ рд╕реНрдХреЗрд▓реЗрдмрд▓ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдпрджрд┐ рдлрд╝рдВрдХреНрд╢рди рд╕рднреА рд╕рд░рдгреА рдФрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдЗрдВрд╕реНрдЯреЗрдВрд╕реЗрд╕ (рд╣рд░ рдкреНрд░рдХрд╛рд░ рдЬреЛ рдЗрдВрдбреЗрдХреНрд╕рд░ рдСрдкрд░реЗрд╢рдВрд╕ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ) рдкрд░ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреИрд╕реЗ рд╕реА ++ std::vector рдореЗрдВ .at() рдЬреЛ рдУрдУрдмреА рдПрдХреНрд╕реЗрд╕ рдХреЗ рд▓рд┐рдП рд░рдирдЯрд╛рдЗрдо рдореЗрдВ рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХрддрд╛ рд╣реИ , рдФрд░ рдПрдХ рдЕрдирд┐рдпрдВрддреНрд░рд┐рдд [] рдСрдкрд░реЗрдЯрд░ рдЬреЛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ OOB рдПрдХреНрд╕реЗрд╕ рдкрд░ SEGFAULT рдХреЗ рд╕рд╛рде рдХреНрд░реИрд╢ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рд╕рдмрд╕реЗ рдЦрд░рд╛рдм рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдореЗрдореЛрд░реА рдХреЛ рджреВрд╖рд┐рдд рдХрд░ рджреЗрддрд╛ рд╣реИред

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

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

рдПрдХ рд╡рд┐рдЪрд╛рд░ рдЬреЛ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЖрд╢рд╛рдЬрдирдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ: рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдЖрдк рдЗрдВрдбреЗрдХреНрд╕ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╕рдордп ?: рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╣ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдЖрдк рд╕рд╛рдорд╛рдиреНрдп рдЙрдкрдпреЛрдЧ рдХреЗ рддрд╣рдд рдХрднреА-рдХрднреА рдореВрд▓реНрдпреЛрдВ рдХреЗ рдЧрд╛рдпрдм рд╣реЛрдиреЗ рдХреА рдЙрдореНрдореАрдж рдХрд░рддреЗ рд╣реИрдВ? рдпрд╣ рдКрдкрд░ рд╡рд░реНрдгрд┐рдд | undefined рддрд░рд╣ рдХрд╛рд░реНрдп рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди рдЕрдЬреАрдм рдбрд╛рдЙрдирд╕рд╛рдЗрдбреНрд╕ рдХреЗ рдмрд┐рдирд╛ред рдЗрд╕реЗ рд╕реНрдкрд╖реНрдЯ undefined рдорд╛рдиреЛрдВ рдХреЛ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдЬреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рд╛рдорд╛рдиреНрдп ?: рд╕реЗ рдПрдХ рдЕрдВрддрд░ рд╣реИред

рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:

type NewWay = {[key: string]?: string};
const n: NewWay = {};

// Has type string | undefined
n['foo']

// Has type Array<string>
Object.values(n)

// Doesn't work
n['foo'] = undefined;

// Works
delete n['foo'];

| undefined рдХреЗ рдкрд┐рдЫрд▓реЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреА рддреБрд▓рдирд╛ рдореЗрдВ:

type OldWay = {[key: string]: string | undefined};
const o: OldWay = {};

// Has type string | undefined
o['foo']

// Has type Array<string | undefined>
Object.values(o)

// Works
o['foo'] = undefined;

// Works
delete o['foo'];

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


рдореИрдВ рдиреЛрдЯ рдХрд░реВрдВрдЧрд╛ рдХрд┐ рд╡реИрдХрд▓реНрдкрд┐рдХ рдЧреБрдг | undefined рднреА рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рдФрд░ рдЗрд╕рдиреЗ рдореБрдЭреЗ рдХреБрдЫ рдмрд╛рд░ рдХрд╛рдЯрд╛ рд╣реИ - рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ TS рдПрдХ рд▓рд╛рдкрддрд╛ рд╕рдВрдкрддреНрддрд┐ рдФрд░ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рдкрд░ рд╕реЗрдЯ рдХреА рдЧрдИ рд╕рдВрдкрддреНрддрд┐ рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдореИрдВ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ { foo?: T, bar?: T } рдХреЛ { [name: 'foo' | 'bar']: T } рдХреЗ рд╕рдорд╛рди рдорд╛рдирд╛ рдЬрд╛рдП, рдЬреЛ рднреА рд╣реЛ (рдКрдкрд░ process.env рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ рднреА рджреЗрдЦреЗрдВ)


рдХреНрдпрд╛ рдЯреАрдПрд╕ рд╕рдВрдЦреНрдпрд╛ рдФрд░ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЗрдВрдбреЗрдХреНрд╕рд░реНрд╕ рдкрд░ рд╕рдорд░реВрдкрддрд╛ рдХреЛ рддреЛрдбрд╝рдиреЗ рдХреЗ рдЦрд┐рд▓рд╛рдл рд╣реИ?

foo[bar] && foo[bar].baz() рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рд╛рдорд╛рдиреНрдп JS рдкреИрдЯрд░реНрди рд╣реИ, рдЬрдм рдпрд╣ TS рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ рддреЛ рдпрд╣ рдЕрдирд╛рдбрд╝реА рд▓рдЧрддрд╛ рд╣реИ (рдЖрдкрдХреЛ рдпрд╣ рдпрд╛рдж рджрд┐рд▓рд╛рдиреЗ рдХреЗ рдЕрд░реНрде рдореЗрдВ рдХрд┐ рдпрджрд┐ рдЖрдк | undefined рдирд╣реАрдВ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рдФрд░ рдЬрдм рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ рдпрджрд┐ рдЖрдк рдХрд░рддреЗ рд╣реИрдВ)ред


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

class Foo {
    foo: string | number = 123

    bar() {
        this.foo = 'bar'
    }

    broken() {
        if (typeof this.foo === 'number') {
            this.bar();
            this.foo.toLowerCase(); // right, but type error
            this.foo.toExponential(); // wrong, but typechecks
        }
    }
}

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

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

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

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

let arr!: string[];
if (arr.length == 3) {
  //arr is of type [string, string, string]
}

if (arr.length > 3) {
  //arr is of type [string, string, string, string, ...string[]]
}

if (arr.length) {
  //arr is of type [string, ...string[]]
}

if (arr.length < 3) {
  //arr is of type [string?, string?, string?]
  if (arr.length > 0) {
    //arr is of type [string, string?, string?]
  }
}

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

let someNumber = 55;
if (arr.length) {
  let el1 = arr[0]; //string
  let el2 = arr[1]; //string | undefined
  let el3 = arr[someNumber]; //string | undefined
}

if(arr.length >= 3){
    let [el1, el2, el3, el4] = arr;
    //el1, el2, el3 are string
    // el4 is string | undefined    
}

if (arr.length == 2){
    let [el1, el2, el3] = arr; //compiler error: "Tuple type '[string, string]' with length '2' cannot be assigned to tuple with length '3'.",
}

рдЕрдиреНрдп рдкреНрд░рд╢реНрди рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рдХрд░реЗрдВрдЧреЗ рдЬреИрд╕реЗ:

if(arr.length >= 99999){
    // arr is [string, string, ... , string, ...string[]]
}

рд╣рдо IDE рдпрд╛ рдХрдВрдкрд╛рдЗрд▓рд░ рд╕рдВрджреЗрд╢реЛрдВ рдореЗрдВ рдЗрд╕ рд╡рд┐рд╢рд╛рд▓ рдЯрдкрд▓ рдХрд╛ рдкреНрд░рдХрд╛рд░ рдирд╣реАрдВ рджрд┐рдЦрд╛ рд╕рдХрддреЗ рд╣реИрдВред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ "рд╕рднреА рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдирд┐рд╢реНрдЪрд┐рдд рд▓рдВрдмрд╛рдИ рдХреЗ рдЯреБрдкрд▓" рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рддреЛ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП 1000 рддрд╛рд░реЛрдВ рдХрд╛ рдЯрдкрд▓ string[10000] рдФрд░ рдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдг рд╕реЗ рд╕рдВрдХреБрдЪрд┐рдд рд╕рд░рдгреА рдХрд╛ рдкреНрд░рдХрд╛рд░ [...string[99999], ...string[]] ред

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

рд╡рд╕реНрддреБрдУрдВ

рдореИрдВ рд╣рдореЗрд╢рд╛ [key: string (or number, symbol)]: V |┬аundefined рдХрд╛ рдПрдХ рдЗрдВрдбреЗрдХреНрд╕ рдкреНрд░рдХрд╛рд░ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдХреЗрд╡рд▓ рдХрднреА-рдХрднреА рдореИрдВ undefined рдорд╛рдорд▓реЗ рдХреЛ рднреВрд▓ рдЬрд╛рддрд╛ рд╣реВрдВред рдЬрдм рднреА рдХрд┐рд╕реА рджреЗрд╡ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕рдВрдХрд▓рдХ рдХреЛ рдмрддрд╛рдирд╛ рд╣реЛрддрд╛ рд╣реИ "рдореЗрд░рд╛ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдХрд░реЛ, рдпрд╣ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХреЗ рд▓рд┐рдП рдЙрд╕ рдЪреАрдЬрд╝ рдХрд╛ рдкреНрд░рдХрд╛рд░ рд╣реИ" рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИред
Map.get рдареАрдХ рд╕реЗ (рдХрдбрд╝рд╛рдИ рд╕реЗ) рдЯрд╛рдЗрдк рдХрд░рдирд╛ рдмрд╣реБрдд рдХрдо рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕рд╛рджреЗ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдПрдХ рдореБрдлреНрдд рдкрд╛рд╕ рдорд┐рд▓рддрд╛ рд╣реИред
рдлрд┐рд░ рднреА, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рднреВрдорд┐ рдореЗрдВ рдЗрд╕реЗ рдЖрд╕рд╛рдиреА рд╕реЗ рдареАрдХ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдмрд╣реБрдд рдмреБрд░рд╛ рдирд╣реАрдВ рд╣реИред рдореЗрд░реЗ рдкрд╛рд╕ рдХреЛрдИ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рд╣реИ, рдХрд┐рд╕реА рднреА рджрд░ рдкрд░ред

рд╕рд░рдгрд┐рдпреЛрдВ

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

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдзрд┐рдХ рд╕реЗ рдЕрдзрд┐рдХ рд▓реЛрдЧ рдЗрди рджреЛ рд╕рд░реНрд╡реЛрддреНрддрдо рдкреНрд░рдерд╛рдУрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░рддреЗ рд╣реИрдВ:

  • Arrays рдХреЛ рдкреБрдирд░рд╛рд╡реГрддреНрдд рдпрд╛ рд░реВрдкрд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдореВрд▓ рд╡рд┐рдзрд┐рдпреЛрдВ рдпрд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдпрд╣рд╛рдВ рдХреЛрдИ рдмреНрд░реИрдХреЗрдЯ рдПрдХреНрд╕реЗрд╕ рдирд╣реАрдВ рд╣реИред
  • Arrays рдХреЛ рдЬрдЧрд╣ рдореЗрдВ рди рдмрджрд▓реЗрдВ

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

рдпрд╣ рдмрд┐рдирд╛ рджрд┐рдорд╛рдЧ рдХреЗ рд▓рдЧрддрд╛ рд╣реИ рдФрд░ рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдкреВрд░реЗ lib.d.ts рдХреЛ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдХреЙрдкреА-рдкреЗрд╕реНрдЯ рдХрд░рдирд╛ рдПрдХ рд╕реНрд╡реАрдХрд╛рд░реНрдп рд╕рдорд╛рдзрд╛рди рд╣реИред

рдЬрдм рд╣рдо рдХрд┐рд╕реА рдРрд░реЗ/рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЗрдВрдбреЗрдХреНрд╕ рдХрд░рддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рдРрд░реЗ ( array[0] ) рдХрд╛ рдкрд╣рд▓рд╛ рдЖрдЗрдЯрдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдкрд░рд┐рдгрд╛рдо рдореЗрдВ undefined ред

рдпрд╣ рдЗрдВрдбреЗрдХреНрд╕ рд╕рд┐рдЧреНрдиреЗрдЪрд░ рдореЗрдВ undefined рдЬреЛрдбрд╝рдХрд░ рд╕рдВрднрд╡ рд╣реИред

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЕрдЧрд░ рдореИрдВ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╕рдордЭрддрд╛ рд╣реВрдВ, рддреЛ рдЗрдВрдбреЗрдХреНрд╕ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдореЗрдВ undefined рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐, рд╕рд░рдгреА рдпрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдкрд░ рдореИрдкрд┐рдВрдЧ рдХрд░рддреЗ рд╕рдордп, рдорд╛рдиреЛрдВ рдореЗрдВ undefined рд╢рд╛рдорд┐рд▓ рд╣реЛрдЧрд╛, рднрд▓реЗ рд╣реА рд╡реЗ рдЬреНрдЮрд╛рдд рди рд╣реЛрдВ undefined (рдЕрдиреНрдпрдерд╛ рд╣рдо рдЙрди рдкрд░ рдореИрдкрд┐рдВрдЧ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ)ред

рдЗрдВрдбреЗрдХреНрд╕ рдкреНрд░рдХрд╛рд░/рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЗрдВрдбреЗрдХреНрд╕ рд▓реБрдХрдЕрдк (рдЬреИрд╕реЗ array[0] ) рдФрд░ рдореИрдкрд┐рдВрдЧ (рдЬреИрд╕реЗ for рд▓реВрдк рдФрд░ Array.prototype.map ) рджреЛрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рдЗрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреНрд░рдХрд╛рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

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

рддреЛ, рд╕рд╡рд╛рд▓ рдмрди рдЬрд╛рддрд╛ рд╣реИ: рд╣рдо рджреЛрдиреЛрдВ рдорд╛рдорд▓реЛрдВ рдХреЛ рдХреИрд╕реЗ рд╕рдВрддреБрд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?

// Manually adding `undefined` to the index signature
declare const array: (number | undefined)[];

const first = array[0]; // number | undefined, as desired :-)
type IndexValue = typeof array[0]; // number | undefined, as desired! :-)

array.map(x => {
  x // number | undefined, not desired! :-(
})

рдкреНрд░рд╕реНрддрд╛рд╡

рдПрдХ рдХрдВрдкрд╛рдЗрд▓рд░ рд╡рд┐рдХрд▓реНрдк рдЬреЛ рдЗрдВрдбреЗрдХреНрд╕ рд▓реБрдХрдЕрдк (рдЬреИрд╕реЗ array[0] ) рдХреЛ Set.get рдФрд░ Map.get рдЯрд╛рдЗрдк рдХрд░рддрд╛ рд╣реИ, рдЗрдВрдбреЗрдХреНрд╕ рд╡реИрд▓реНрдпреВ рдЯрд╛рдЗрдк рдореЗрдВ undefined рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдХреЗ (рдирд╣реАрдВ) рд╕реВрдЪрдХрд╛рдВрдХ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рд╣реА)ред рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдореЗрдВ undefined рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реЛрдЧрд╛, рддрд╛рдХрд┐ рдорд╛рдирдЪрд┐рддреНрд░рдг рдХрд╛рд░реНрдп рдкреНрд░рднрд╛рд╡рд┐рдд рди рд╣реЛрдВред

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

declare const array: number[];

// The compiler option would include `undefined` in the index value type
const first = array[0]; // number | undefined, as desired :-)
type IndexValue = typeof array[0]; // number | undefined, as desired :-)

array.map(x => {
  x // number, as desired :-)
})

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ for рд▓реВрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рд░рдгреА/рд╡рд╕реНрддреБрдУрдВ рдкрд░ рд▓реВрдкрд┐рдВрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдХреЛ рд╣рд▓ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рд╡рд╣ рддрдХрдиреАрдХ рдЗрдВрдбреЗрдХреНрд╕ рд▓реБрдХрдЕрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИред

for (let i = 0; i < array.length; i++) {
  const x = array[i];
  x; // number | undefined, not desired! :-(
}

рдореЗрд░реЗ рд▓рд┐рдП рдФрд░ рдореБрдЭреЗ рдХрдИ рдЕрдиреНрдп рд▓реЛрдЧреЛрдВ рдкрд░ рд╕рдВрджреЗрд╣ рд╣реИ, рдпрд╣ рд╕реНрд╡реАрдХрд╛рд░реНрдп рд╣реИ рдХреНрдпреЛрдВрдХрд┐ for рд▓реВрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдХрд╛рд░реНрдпрд╛рддреНрдордХ рд╢реИрд▓реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ Array.prototype.map ред рдпрджрд┐ рд╣рдореЗрдВ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рд╣рдо рдЧреИрд░-рд╢реВрдиреНрдп рдЕрднрд┐рдХрдерди рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЗ рд╕рд╛рде рдпрд╣рд╛рдВ рд╕реБрдЭрд╛рдП рдЧрдП рдХрдВрдкрд╛рдЗрд▓рд░ рд╡рд┐рдХрд▓реНрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЦреБрд╢ рд╣реЛрдВрдЧреЗред

for (let i = 0; i < array.length; i++) {
  const x = array[i]!;
  x; // number, as desired :-)
}

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

рдСрдкреНрдЯ-рдЖрдЙрдЯ (рдХрдВрдкрд╛рдЗрд▓рд░ рд╡рд┐рдХрд▓реНрдк рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд╕рдХреНрд╖рдо рдХрд░рддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рд╡рд╣рд╛рдВ рдСрдкреНрдЯ-рдЖрдЙрдЯ рдХрд░реЗрдВ):

declare const array: { [index: number]!!: string };

declare const dictionary: { [index: string]!!: string }

рдСрдкреНрдЯ-рдЗрди (рдХреЛрдИ рдХрдВрдкрд╛рдЗрд▓рд░ рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ, рдЬрд╣рд╛рдВ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рд╡рд╣рд╛рдВ рдХреЗрд╡рд▓ рдСрдкреНрдЯ-рдЗрди рдХрд░реЗрдВ):

declare const array: { [index: string]!!: string };

declare const dictionary: { [index: string]??: string }

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

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

const balls = [1, 2 ,3];

рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, balls рдХреЛ [number, number, number] рдорд╛рдирд╛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕реЗ рд▓рд┐рдЦрдХрд░ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

const balls: number[] = [1, 2 ,3];

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

const balls: [number, number, number] = [1, 2 ,3];
const n = balls[100];

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

@buu700 рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ 3.0 рдореЗрдВ рдЖрдкрдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИ: https://blogs.msdn.microsoft.com/typescript/2018/07/30/announcing-typescript-3-0/#richer -tuple-types

рдЕрдЪреНрдЫрд╛! рд╡реИрд╕реЗ рдпрд╣ рджрд┐рд▓рдЪрд╕реНрдк рд╕рдордп рд╣реИред рдореИрдВ рд░рд┐рд▓реАрдЬ рдХреА рдШреЛрд╖рдгрд╛ рдЦреЛрд▓ рдЪреБрдХрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдЕрднреА рддрдХ рдЗрд╕реЗ рдкрдврд╝рд╛ рдирд╣реАрдВ рдерд╛; рдХреЗрд╡рд▓ рдЙрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЪрд▓рдиреЗ рдХреЗ рдмрд╛рдж рдпрд╣рд╛рдВ рдЖрдпрд╛ рдЬрд╣рд╛рдВ рдореБрдЭреЗ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ (2.9) рдХреЛ рд╡рд╣ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЕрдЬреАрдм рдХрд╛рд╕реНрдЯрд┐рдВрдЧ ( (<(T|undefined)[]> arr).slice(-1)[0] ) рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереА рдЬреЛ рдореИрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред

рдмрд╕ рдЪреАрдЬреЛрдВ рдХреЛ рдЗрд╕ рд╕реБрдЭрд╛рд╡ рдкрд░ рд╡рд╛рдкрд╕ рд▓рд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛: https://github.com/Microsoft/TypeScript/issues/13778#issuecomment -383072468

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

@mhegazy @RyanCavanaugh рдореЗрд░реЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдкрд░ рдХреЛрдИ рд╡рд┐рдЪрд╛рд░? https://github.com/Microsoft/TypeScript/issues/13778#issuecomment -406316164

рдореЗрд░реЗ рд▓рд┐рдП, рдПрдХ рдЖрд╕рд╛рди рдЙрдкрд╛рдп рд╣реИред рдПрдХ рдзреНрд╡рдЬ рд╕рдХреНрд╖рдо рдХрд░реЗрдВ рдЬреЛ рдЗрд╕рдХреА рдЬрд╛рдВрдЪ рдХрд░рддрд╛ рд╣реИред рдлрд┐рд░, рдЗрд╕рдХреЗ рдмрдЬрд╛рдп:

const array = [1, 2, 3];
for (var i =0; i< array.length; i++) {
    array[i]+=1; // array[i] is possibly undefined
}

рддреБрдо рдХрд░реЛ:

const array = [1, 2, 3];
array.forEach((value, i) => array[i] = value + 1);

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

рдореБрдЭреЗ рдЕрднреА рднреА рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд╛рд░рдВрдЯ рдПрдХ рдЦреБрд▓рд╛ рдореБрджреНрджрд╛ рд╣реИред

рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЬреЛ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд▓рд┐рдП рдирдпрд╛ рд╣реИ, рдореИрдВрдиреЗ рдкрд╛рдпрд╛ рдХрд┐ рд╕рдЦреНрдд рдореЛрдб рдореЗрдВ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдЕрдиреБрдХреНрд░рдорд┐рдд рдХрд░рдиреЗ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХреА рд╕реНрдерд┐рддрд┐ рдЕрдирдкреЗрдХреНрд╖рд┐рдд рд╣реИред рдореИрдВ рдПрдХ рд▓реБрдХрдЕрдк рдХреЗ рдкрд░рд┐рдгрд╛рдо T | undefined рд╣реЛрдиреЗ рдХреА рдЙрдореНрдореАрдж рдХрд░рддрд╛, рдЗрд╕реА рддрд░рд╣ Map.get ред рд╡реИрд╕реЗ рднреА, рдореИрдВ рдЕрднреА рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдЗрд╕рдореЗрдВ рднрд╛рдЧ рдЧрдпрд╛, рдФрд░ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдПрдХ рдореБрджреНрджрд╛ рдЦреЛрд▓рд╛:

рд╕реНрдХреНрд░реАрдкрд░реНрд╕/рдЯрд╛рдЗрдкреНрдб-рд╕реНрдХреНрд░реАрдкреНрд╕#107

рдореИрдВ рд╢рд╛рдпрдж рдЗрд╕реЗ рдЕрднреА рдмрдВрдж рдХрд░рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВ, рдХреНрдпреЛрдВрдХрд┐ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреЛрдИ рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдереЛрдбрд╝рд╛ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ T | undefined рдореЗрдВ "рдСрдкреНрдЯрд┐рдВрдЧ-рдЗрди" рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВ:

export function lookup<T>(map: {[index: string]: T}, index: string): T|undefined {
  return map[index];
}

рдСрдмреНрдЬреЗрдХреНрдЯ рдЗрдВрдбреЗрдХреНрд╕ рдСрдкрд░реЗрд╢рди рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ T | undefined рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣рд╛рдВ рдХреБрдЫ рд╕реБрдЭрд╛рд╡ рджрд┐рдП рдЧрдП рдереЗ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ:

const obj: {[key: string]: number | undefined} = {
  "a": 1,
  "b": 2,
};

const test = obj["c"]; // const test: number

рдпрд╣ рд╡реАрдПрд╕рд╕реАрдУрдбреА рд╕рдВрд╕реНрдХрд░рдг 1.31.1 рд╣реИ

@yawaramin рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдЖрдкрдХреЗ tsconfig.json рдореЗрдВ strictNullChecks рд╕рдХреНрд╖рдо рд╣реИ (рдЬреЛ strict рдзреНрд╡рдЬ рджреНрд╡рд╛рд░рд╛ рднреА рд╕рдХреНрд╖рдо рд╣реИ)

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

const words = ... // some string[] that could be empty
const x = words[0] as string | undefined
console.log(x.length) // TS error

рдЯреБрдкрд▓реНрд╕ рдЬреНрдЮрд╛рдд рд▓рдВрдмрд╛рдИ рдХреЗ рдЫреЛрдЯреЗ рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ string[5] рд▓рд┐рдП рд╢реЙрд░реНрдЯрд╣реИрдВрдб рдХреЗ рд░реВрдк рдореЗрдВ [string, string, string, string, string] рдЬреИрд╕рд╛ рдХреБрдЫ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ?

рдПрдХ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рдмрд╣реБрдд рдХреБрдЫред рдпрд╣ рдЯрд╛рдЗрдк рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдПрдХ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рдЫреЗрдж рд╣реИ, рдЦрд╛рд╕рдХрд░ рдЬрдм strictNullChecks рдзреНрд╡рдЬ рд╕рдХреНрд╖рдо рд╣реИред JS рдореЗрдВ рд╣рд░ рд╕рдордп рдкреНрд▓реЗрди рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЛ рдореИрдкреНрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдЙрд╕ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдлрд╝рдВрдХреНрд╢рди рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдирд╖реНрдЯ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╕рд░рдгреА рдХреЗ рд╕рд╛рде рдЗрд╕рдореЗрдВ рднрд╛рдЧ рд▓реЗрдВ:

function foo([first]: string[]) { /* ... */ }

рдпрд╣рд╛рдВ рдореИрдВ a рдкреНрд░рдХрд╛рд░ string | undefined рд╣реЛрдиреЗ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реВрдВ рд▓реЗрдХрд┐рди рдпрд╣ рдХреЗрд╡рд▓ string , рдЬрдм рддрдХ рдХрд┐ рдореИрдВ рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░рддрд╛

function foo([first]: (string | undefined)[]) { /* ... */ }

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

рдЗрд╕ рддрд░рд╣ рд╕реЗ рдореИрдВ рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реВрдВ: https://github.com/danielnixon/total-functions/

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

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

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

рдореИрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдорд╕реНрдпрд╛ рдореЗрдВ рднрд╛рдЧ | undefined рдирдХреНрд╢реЗ рдХреЗ рд╕рд╛рде рдЖрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп Object.entries() ред

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

рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЗрд╕реЗ рдЕрдиреБрд╢рдВрд╕рд┐рдд рдХреЗ рдЕрдиреБрд╕рд╛рд░ {[key: string]: string[] | undefined} рдореЗрдВ рдмрджрд▓ рджрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдЕрдм рдпрд╣ рдореЗрд░реЗ Object.entries() рдЙрдкрдпреЛрдЧ рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИред рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЕрдм рдорд╛рдирддрд╛ рд╣реИ (рдпрдереЛрдЪрд┐рдд, рдкреНрд░рдХрд╛рд░ рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдХреЗ рдЖрдзрд╛рд░ рдкрд░) рдХрд┐ рд╕реВрдЪрдХрд╛рдВрдХ рдореЗрдВ рдХреБрдВрдЬрд┐рдпрд╛рдБ рд╣реЛ рд╕рдХрддреА рд╣реИрдВ рдЬрд┐рдирдХрд╛ рдорд╛рди рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╣реИ, рдФрд░ рдЗрд╕рд▓рд┐рдП Object.entries() рдкрд░ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рдкрд░рд┐рдгрд╛рдо рдореЗрдВ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рдорд╛рди рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред

рд╣рд╛рд▓рд╛рдБрдХрд┐, рдореИрдВ рдЬрд╛рдирддрд╛ рд╣реВрдБ рдХрд┐ рдпрд╣ рдЕрд╕рдВрднрд╡ рд╣реИ; рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рдЬрдм рдореБрдЭреЗ undefined рдкрд░рд┐рдгрд╛рдо рдорд┐рд▓рдирд╛ рдЪрд╛рд╣рд┐рдП, рд╡рд╣ рдПрдХ рдРрд╕реА рдХреБрдВрдЬреА рдХреА рддрд▓рд╛рд╢ рдХрд░ рд░рд╣рд╛ рд╣реИ рдЬреЛ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИ, рдФрд░ рдЬреЛ Object.entries() рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рд╕реВрдЪреАрдмрджреНрдз рдирд╣реАрдВ рд╣реЛрдЧреАред рддреЛ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдЦреБрд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореБрдЭреЗ рдпрд╛ рддреЛ рдХреЛрдб рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ рдЬрд┐рд╕рдХрд╛ рдХреЛрдИ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХрд╛рд░рдг рдирд╣реАрдВ рд╣реИ, рдпрд╛ рдЪреЗрддрд╛рд╡рдирд┐рдпреЛрдВ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░реЗрдВ, рдЬрд┐рд╕реЗ рдореИрдВ рдирд╣реАрдВ рдХрд░рдирд╛ рдкрд╕рдВрдж рдХрд░реВрдВрдЧрд╛ред

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

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

рдЕрдЧрд░ рдХреЛрдИ рдЕрдкрдиреЗ lib.d.ts рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ рдФрд░ рдЕрдкрдиреЗ рдХреЛрдб рдореЗрдВ рд╕рднреА рдбрд╛рдЙрдирд╕реНрдЯреНрд░реАрдо рдмреНрд░реЗрдХ рдХреЛ рдареАрдХ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ рдФрд░ рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ рд╕рдордЧреНрд░ рдЕрдВрддрд░ рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ, рдпрд╣ рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдЗрд╕рдореЗрдВ рдХреБрдЫ рдореВрд▓реНрдп рдкреНрд░рд╕реНрддрд╛рд╡ рд╣реИ, рд╣рдо рдЙрд╕ рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рдЦреБрд▓реЗ рд╣реИрдВред

@RyanCavanaugh рдпрд╣рд╛рдБ рдореЗрд░реА рдХреЛрдб рдЖрдзрд╛рд░ рд╕реЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЬрд╣рд╛рдВ рдХреБрдЫ рдХреНрд░рдо рджреБрд░реНрдШрдЯрдирд╛рдУрдВ slumbering рд░рд╣реЗ рд╣реИрдВред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдореЗрд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдРрд╕реЗ рдорд╛рдорд▓реЗ рдереЗ рдЬрд╣рд╛рдВ рдореИрдВ рдЗрд╕ рд╡рдЬрд╣ рд╕реЗ рдЙрддреНрдкрд╛рджрди рдореЗрдВ рджреБрд░реНрдШрдЯрдирд╛рдЧреНрд░рд╕реНрдд рд╣реЛ рдЧрдпрд╛ рдерд╛ рдФрд░ рдПрдХ рд╣реЙрдЯрдлрд┐рдХреНрд╕ рдЬрд╛рд░реА рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереАред

src={savedAdsItem.advertImageList.advertImage[0].mainImageUrl || undefined}
return advert.advertImageList.advertImage.length ? advert.advertImageList.advertImage[0].mainImageUrl : ''
birthYear: profileData.birthYear !== null ? profileData.birthYear : allowedYears[0].value,
upsellingsList.upsellingProducts[0].upsellingProducts[0].selected = true
const latitude = parseFloat(coordinates.split(',')[0])
const advert = Object.values(actionToConfirm.selectedItems)[0]
await dispatch(deactivateMyAd(advert))

рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдпрд╣ рдХрд╖реНрдЯрдкреНрд░рдж рд╣реЛрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ ArticleIDs extends articleNames[] рдореЗрдВ рдкрд░рд┐рдгрд╛рдореА рдореВрд▓реНрдпреЛрдВ рдореЗрдВ undefined рд╣реИ, рдЬрдмрдХрд┐ рдЗрд╕реЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╕рдмрд╕реЗрдЯ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреА рдЪрд╛рд╣рд┐рдПред рдЖрд╕рд╛рдиреА рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реБрдзрд╛рд░реА рдЬрд╛ рд╕рдХрдиреЗ рд╡рд╛рд▓реА ReadonlyArray<articleNames> рдХреЗ рдмрдЬрд╛рдп articleNames[] ред

export enum articleNames {
    WEB_AGB = 'web_agb',
    TERMS_OF_USE = 'web_terms-of-use',
}
export const getMultipleArticles = async <ArticleIDs extends articleNames[], ArticleMap = { [key in ArticleIDs[number]]: CmsArticle }>(ids: ArticleIDs): Promise<ArticleMap> => {...}

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

рдореИрдВ рдЗрд╕ рдЯрд┐рдкреНрдкрдгреА рдкрд░ рдереЛрдбрд╝рд╛ рдФрд░ рддрд░реНрдХ рдореЗрдВ рдЧрдпрд╛ # 11238 (рдЯрд┐рдкреНрдкрдгреА)

рджреБрдирд┐рдпрд╛ рдореЗрдВ рджреЛ рдкреНрд░рдХрд╛рд░ рдХреА рдЪрд╛рдмрд┐рдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪреЗрдВ: рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ _do_ рдореЗрдВ рдХрд┐рд╕реА рд╡рд╕реНрддреБ (рд╕реБрд░рдХреНрд╖рд┐рдд) рдореЗрдВ рдПрдХ рд╕рдорд╛рди рд╕рдВрдкрддреНрддрд┐ рд╣реЛрддреА рд╣реИ, рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдк рдирд╣реАрдВ рдЬрд╛рдирддреЗ рдХрд┐ рдХрд┐рд╕реА рд╡рд╕реНрддреБ (рдЦрддрд░рдирд╛рдХ) рдореЗрдВ рд╕рдВрдмрдВрдзрд┐рдд рд╕рдВрдкрддреНрддрд┐ рд╣реЛрддреА рд╣реИред

рд╕рд╣реА рдХреЛрдб рд▓рд┐рдЦрдиреЗ рд╕реЗ рдЖрдкрдХреЛ рдкрд╣рд▓реА рддрд░рд╣ рдХреА рдХреБрдВрдЬреА рдорд┐рд▓рддреА рд╣реИ, рдПрдХ "рд╕реБрд░рдХреНрд╖рд┐рдд" рдХреБрдВрдЬреА, рдЬреИрд╕реЗ

for (let i = 0; i < arr.length; i++) {
  // arr[i] is T, not T | undefined

рдпрд╛

for (const k of Object.keys(obj)) {
  // obj[k] is T, not T | undefined

рдЖрдкрдХреЛ рджреВрд╕рд░реА рддрд░рд╣ рдХреА рдХреБрдВрдЬреА рд╕реЗ рдорд┐рд▓рддреА рд╣реИ, "рдЦрддрд░рдирд╛рдХ" рдкреНрд░рдХрд╛рд░, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдирдкреБрдЯ рдЬреИрд╕реА рдЪреАрдЬреЛрдВ рд╕реЗ, рдпрд╛ рдбрд┐рд╕реНрдХ рд╕реЗ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ JSON рдлрд╛рдЗрд▓реЗрдВ, рдпрд╛ рдХреБрдЫ рдЪрд╛рдмрд┐рдпреЛрдВ рдХреА рд╕реВрдЪреА рдЬреЛ рдореМрдЬреВрдж рд╣реЛ рд╕рдХрддреА рд╣реИрдВ рд▓реЗрдХрд┐рди рд╣реЛ рд╕рдХрддреА рд╣реИрдВред

рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЦрддрд░рдирд╛рдХ рдкреНрд░рдХрд╛рд░ рдХреА рдХреБрдВрдЬреА рдФрд░ рдЗрд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рд╣реИ, рддреЛ рдпрд╣рд╛рдВ | undefined рд╣реЛрдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред рд▓реЗрдХрд┐рди рдкреНрд░рд╕реНрддрд╛рд╡ "рдЦрддрд░рдирд╛рдХ_ рдХреБрдВрдЬрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдЦрддрд░рдирд╛рдХ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░реЗрдВ" рдирд╣реАрдВ рд╣реИ, рдпрд╣ "рд╕рднреА _ рдХреБрдВрдЬрд┐рдпреЛрдВ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рд╕реБрд░рдХреНрд╖рд┐рдд рдХреБрдВрдЬрд┐рдпреЛрдВ рдХреЛ рднреА рдЦрддрд░рдирд╛рдХ рдорд╛рдиреЗрдВ"ред рдФрд░ рдПрдХ рдмрд╛рд░ рдЬрдм рдЖрдк рд╕реБрд░рдХреНрд╖рд┐рдд рдЪрд╛рдмрд┐рдпреЛрдВ рдХреЛ рдЦрддрд░рдирд╛рдХ рдорд╛рдирдиреЗ рд▓рдЧрддреЗ рд╣реИрдВ, рддреЛ рдЬреАрд╡рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмреЗрдХрд╛рд░ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдЖрдк рдЬреИрд╕реЗ рдХреЛрдб рд▓рд┐рдЦрддреЗ рд╣реИрдВ

for (let i = 0; i < arr.length; i++) {
  console.log(arr[i].name);

рдФрд░ рдЯрд╛рдЗрдкрдкреНрд░рддрд┐ рдЖрдк рдХрдо рд╕реЗ рд╢рд┐рдХрд╛рдпрдд рдХрд░ рд░рд╣рд╛ рд╣реИ рдХрд┐ arr[i] рд╣реЛ рд╕рдХрддрд╛ рд╣реИ undefined рднрд▓реЗ рд╣реА _hey рдореИрдВ рд╕рд┐рд░реНрдл @ #% # it_ рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЖрдИрдПрдирдЬреА рджреЗрдЦреЛред рдЕрдм рдЖрдкрдХреЛ рдЗрд╕ рддрд░рд╣ рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреА рдЖрджрдд рд╣реЛ рдЧрдИ рд╣реИ, рдФрд░ рдпрд╣ рдореВрд░реНрдЦрддрд╛рдкреВрд░реНрдг рд▓рдЧрддрд╛ рд╣реИ:

for (let i = 0; i < arr.length; i++) {
  // TypeScript makes me use ! with my arrays, sad.
  console.log(arr[i]!.name);

рдпрд╛ рд╢рд╛рдпрдж рдЖрдк рдЗрд╕ рддрд░рд╣ рдХреЛрдб рд▓рд┐рдЦрддреЗ рд╣реИрдВ:

function doSomething(myObj: T, yourObj: T) {
  for (const k of Object.keys(myObj)) {
    console.log(yourObj[k].name);
  }
}

рдФрд░ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╣рддрд╛ рд╣реИ "рдЕрд░реЗ, рд╡рд╣ рд╕реВрдЪрдХрд╛рдВрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ | undefined рд╣реЛ рд╕рдХрддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдк рдЗрд╕реЗ рдХрд░реНрддрд╡реНрдпрдкреВрд░реНрд╡рдХ рдареАрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдиреЗ рдЗрд╕ рддреНрд░реБрдЯрд┐ рдХреЛ рдкрд╣рд▓реЗ рд╣реА 800 рдмрд╛рд░ рджреЗрдЦрд╛ рд╣реИ:

function doSomething(myObj: T, yourObj: T) {
  for (const k of Object.keys(myObj)) {
    console.log(yourObj[k]!.name); // Shut up TypeScript I know what I'm doing
  }
}

рд▓реЗрдХрд┐рди рдЖрдкрдиреЗ рдмрдЧ рдХреЛ рдареАрдХ рдирд╣реАрдВ рдХрд┐рдпрд╛ ред рдЖрдк Object.keys(yourObj) , рдпрд╛ рд╢рд╛рдпрдж myObj[k] рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рддреЗ рдереЗред рдпрд╣ рд╕рдмрд╕реЗ рдЦрд░рд╛рдм рдкреНрд░рдХрд╛рд░ рдХреА рдХрдВрдкрд╛рдЗрд▓рд░ рддреНрд░реБрдЯрд┐ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд┐рд╕реА рднреА рдкрд░рд┐рджреГрд╢реНрдп рдореЗрдВ рдЖрдкрдХреА рдорджрдж рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ - рдпрд╣ рдХреЗрд╡рд▓ рд╣рд░ рддрд░рд╣ рдХреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реА рдЕрдиреБрд╖реНрдард╛рди рд▓рд╛рдЧреВ рдХрд░ рд░рд╣рд╛ рд╣реИ, рдЗрд╕ рдкрд░ рдзреНрдпрд╛рди рджрд┐рдП рдмрд┐рдирд╛ рдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрд╕реА рд░реВрдк рдХреА рдХрд┐рд╕реА рднреА рдЕрдиреНрдп рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╕реЗ рдЕрдзрд┐рдХ рдЦрддрд░рдирд╛рдХ рдерд╛ рдпрд╛ рдирд╣реАрдВред

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

рдореИрдВ рдбрд┐рд▓реАрдЯ рдлрд╛рдЗрд▓ рдбрд╛рдпрд▓реЙрдЧ рд╕рд╛рджреГрд╢реНрдп рд╕реЗ рд╕рд╣рдордд рд╣реВрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рд╕рд╛рджреГрд╢реНрдп рдХреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдХреБрдЫ рдРрд╕рд╛ рдЬрд╛рдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рдмрдврд╝рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рд╕рдВрднрд╡рддрдГ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рдпрд╛ рд╢реВрдиреНрдп рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрджрд┐ рдпрд╣ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рд╕рддреНрдп рд╣реИ, strictNullChecks рд╡рд┐рдХрд▓реНрдк рд╕рдорд╛рди рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдкреНрд░реЗрд░рд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП document.getElementById рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ DOM рд╕реЗ рдХреБрдЫ рддрддреНрд╡ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ред

рд▓реЗрдХрд┐рди рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ, рдмрд╣реБрдд рд╕рд╛рд░реЗ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдХрдВрдкрд╛рдЗрд▓рд░ рдРрд╕реЗ рдХреЛрдб рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЭрдВрдбрд╛ рдЙрдард╛рдП рддрд╛рдХрд┐ рдЙрди рдХрд┐рдирд╛рд░реЗ рдХреЗ рдорд╛рдорд▓реЛрдВ рдХреЛ Cannot access property X of undefined рддреНрд░реБрдЯрд┐ рдХреЛ рдлреЗрдВрдХрдиреЗ рдХреЗ рдмрдЬрд╛рдп рдЙрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╕рдВрднрд╛рд▓рд╛ рдЬрд╛ рд╕рдХреЗ рдЬреЛ рдЯреНрд░реЗрд╕ рдХрд░рдирд╛ рдмрд╣реБрдд рдХрдард┐рди рд╣реИред

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

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

for (let i = 0; i < arr.length; i++) {
  console.log(arr[i].name);

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

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

рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ред

declare function someFunc(arr: number[], i: number): void;
let arr = [1, 2, 3, 4];
for (let i = 0; i < arr.length; i++) {
  someFunc(arr, arr[i]);
}

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

рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛?

declare function someFunc(arr: number[], i: number): void;
let arr = [1, 2, 3, 4];
let alias = arr;
for (let i = 0; i < arr.length; i++) {
  someFunc(alias, arr[i]);
}

@fabb рдореБрдЭреЗ рдПрдХ рдФрд░ рдЙрджрд╛рд╣рд░рдг рджреЗрдВ:

```
$ рдиреЛрдб

рдХрд╛рд╕реНрдЯ рдЧрд┐рд░рдлреНрддрд╛рд░реА = []
рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд
рдЧрд┐рд░рдлреНрддрд╛рд░реА [7] = 7
7
рдЖрдЧрдорди
[ <7 рдЦрд╛рд▓реА рдЖрдЗрдЯрдо>, рен ]
рдХреЗ рд▓рд┐рдП (рдЪрд▓реЛ i = 0; i < arr.length; i++) {
... рдХрдВрд╕реЛрд▓.рд▓реЙрдЧ (рдЧрд┐рд░рдлреНрддрд╛рд░реА [i])
...}
рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд
рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд
рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд
рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд
рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд
рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд
рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд
7
рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд```

@RyanCavanaugh рдХреЗ рдмрд╛рдж рд╕реЗ рдЖрдк рдпрд╣рд╛рдВ рд╣реИрдВ, item :: T рд▓рд┐рдП arr :: T[] рдореЗрдВ for (const item of arr) ... рдЙрд▓реНрд▓реЗрдЦ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ, рдФрд░ рдЕрдиреНрдпрдерд╛ arr[i] :: T | undefined рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдХреБрдЫ --strict-index ? рдЙрд╕ рдорд╛рдорд▓реЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬреЛ рдореБрдЭреЗ рдкрд░рд╡рд╛рд╣ рд╣реИ, obj[key] :: V | undefined рд▓реЗрдХрд┐рди Object.values(obj) :: V[] obj :: { [key: string]: V } ?

@yawaramin рдпрджрд┐ рдЖрдк рд╡рд┐рд░рд▓ рд╕рд░рдгрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рд╣реА рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдПрдХ --strict-index рдзреНрд╡рдЬ рдЗрд╕реЗ рдареАрдХ рдХрд░ рджреЗрдЧрд╛ред рдпрд╣ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИ:

const arr = []
arr[7] = 7

for (let i = 0; i < arr.length; i++) {
    console.log(Math.sqrt(arr[i]));
}

@RyanCavanaugh рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рд╛рдорд╛рдиреНрдп рдЙрджрд╛рд╣рд░рдг рд╣реИ рдХрд┐ рдореИрдВ рдЖрдкрдХреЛ рджрд┐рдЦрд╛ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЧрд▓рдд рддрд░реАрдХреЗ рд╕реЗ рд╕рд░рдгреА рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╡рдг рд╣реИрдВред

const getBlock = (unitNumber: string): string => unitNumber.split('-')[0]

рдКрдкрд░ рджрд┐рдП рдЧрдП рдХреЛрдб рдХреЛ strictNullChecks рддрд╣рдд рдХрдВрдкрд╛рдЗрд▓рд░ рдЪреЗрдХрд┐рдВрдЧ рдкрд╛рд╕ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ getBlock рдХреБрдЫ рдЙрдкрдпреЛрдЧ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реЛ рдЬрд╛рдПрдВрдЧреЗ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП getBlock('hello') рдРрд╕реЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдореИрдВ рдЧрдВрднреАрд░рддрд╛ рд╕реЗ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрдВрдкрд╛рдЗрд▓рд░ рдЙрдард╛рдирд╛ рдзреНрд╡рдЬ рддрд╛рдХрд┐ рдореИрдВ рдЕрдкрдиреЗ рдЖрд╡реЗрджрди рдХреЛ рд╡рд┐рд╕реНрдлреЛрдЯ рдХрд┐рдП рдмрд┐рдирд╛ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рдорд╛рдорд▓реЛрдВ рдХреЛ рдЗрдирд╛рдпрдд рд╕реЗ рд╕рдВрднрд╛рд▓ рд╕рдХреВрдВред

рдФрд░ рдпрд╣ рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╕рд╛рдорд╛рдиреНрдп рдореБрд╣рд╛рд╡рд░реЛрдВ рдкрд░ рднреА рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ рдЬреИрд╕реЗ рдХрд┐рд╕реА рд╕рд░рдгреА рдХреЗ рдЕрдВрддрд┐рдо рддрддреНрд╡ рддрдХ рдкрд╣реБрдВрдЪрдирд╛ arr.slice(-1)[0] , рдкрд╣рд▓реЗ рддрддреНрд╡ рддрдХ рдкрд╣реБрдВрдЪ arr[0] рдЖрджрд┐ред

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

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

@RyanCavanaugh рд╣рд╛рдВ, рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЦреБрдж рдХреЛ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдпрддрд╛ рдХреЗ рд▓рд┐рдП рдЙрдзрд╛рд░ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдпрд╛ рддреЛ рдПрдХ ! рдЖрд╡рд╢реНрдпрдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдпрд╛ рдПрдХ ReadonlyArray рд╕рд░рдгреА: someFunc(arr: ReadonlyArray<number>, i: number) ред

@yawaramin рд╡рд┐рд░рд▓ рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП, рддрддреНрд╡ рдкреНрд░рдХрд╛рд░ рдХреЛ рд╕рдВрднрд╡рддрдГ undefined рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдЬрдм рддрдХ рдХрд┐ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдпрд╣ рдирд╣реАрдВ рдирд┐рдХрд╛рд▓ рд╕рдХрддрд╛ рдХрд┐ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЯреБрдкрд▓ рдХреА рддрд░рд╣ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдХреЛрдб рдореЗрдВ @danielnixon (https://github.com/microsoft/TypeScript/issues/13778#issuecomment-536248028) рд╕реЗ рд▓рд┐рдВрдХ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, undefined рд╣реИред рдЪреВрдВрдХрд┐ рдХрдВрдкрд╛рдЗрд▓рд░ рдЧрд╛рд░рдВрдЯреА рджреЗрддрд╛ рд╣реИ рдХрд┐ рдХреЗрд╡рд▓ рд╕реЗрдЯ рдЗрдВрдбреЗрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдпрд╣ рдПрдХ рд╕рдЪреЗрдд рдирд┐рд░реНрдгрдп рд╣реИред рдЗрд╕ рдХреЛрдб рдХреЗ рд▓рд┐рдП рддреНрд░реБрдЯрд┐ рд╣реЛрдирд╛ рдмрд╣реБрдд рдХрд╖реНрдЯрдкреНрд░рдж рд╣реЛрдЧрд╛:

var a = [];
for (var i =0; i< a.length; i++) {
    a[i]+=1; // a[i] is possibly undefined
}

рдЕрд░реЗ, рдореИрдВ рдЙрд╕ рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдХреЛ рдкрд╣рдЪрд╛рдирддрд╛ рд╣реВрдВ; рдореИрдВ рдЗрд╕ рддрд░рд╣ рд╕реЗ рд▓реВрдк рд▓рд┐рдЦрддрд╛ рд╣реВрдБ рд╢рд╛рдпрдж рд╕рд╛рд▓ рдореЗрдВ рдПрдХ рдмрд╛рд░!

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

рдЗрд╕ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓реЗ рдХреЛ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдард┐рди рдмрдирд╛рдиреЗ рдХреА рдЖрд╢рдВрдХрд╛ рдЕрдзрд┐рдХ рдкреНрд░рддреАрдд рд╣реЛрддреА рд╣реИред рдпрджрд┐ рдЖрдк рдХреЗрд╡рд▓ рддрддреНрд╡реЛрдВ рдкрд░ рдкреБрдирд░рд╛рд╡реГрддрд┐ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдЖрдк for .. of рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдкрдХреЛ рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рддрддреНрд╡ рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ forEach рдпрд╛ entries рд╕реЗ рдЕрдзрд┐рдХ рдкреБрдирд░рд╛рд╡реГрддрд┐ рдХрд░реЗрдВред рдЖрдо рддреМрд░ рдкрд░ рдпрд╣ рдмреЗрд╣рдж рджреБрд░реНрд▓рдн рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд▓реВрдк рдХреЗ рд▓рд┐рдП рдЗрдВрдбреЗрдХреНрд╕-рдЖрдзрд╛рд░рд┐рдд рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

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

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

рдкрд░ рд╢реБрдХреНрд░, 25 рдЕрдХреНрдЯреВрдмрд░, 2019 рдХреЛ 11:59 рдкреВрд░реНрд╡рд╛рд╣реНрди brunnerh [email protected] рд▓рд┐рдЦрд╛ рд╣реИ:

рдпрд╣ рдПрдХ рд╕рдЪреЗрдд рдирд┐рд░реНрдгрдп рд╣реИред рдЗрд╕ рдХреЛрдб рдХреЗ рд▓рд┐рдП рдпрд╣ рдмрд╣реБрдд рдХрд╖реНрдЯрдкреНрд░рдж рд╣реЛрдЧрд╛
рддреНрд░реБрдЯрд┐ рд╣реЛ:

var a = []; for (var i =0; i< a.length; i++) {
рдП[i]+=1; // рдП [i] рд╕рдВрднрд╡рддрдГ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реИ
}

рдЕрд░реЗ, рдореИрдВ рдЙрд╕ рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдХреЛ рдкрд╣рдЪрд╛рдирддрд╛ рд╣реВрдВ; рдореИрдВ рдЗрд╕ рддрд░рд╣ рд╕реЗ рд▓реВрдк рд▓рд┐рдЦрддрд╛ рд╣реВрдБ рд╢рд╛рдпрдж рд╕рд╛рд▓ рдореЗрдВ рдПрдХ рдмрд╛рд░!

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

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

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

-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдиреЗ рдЯрд┐рдкреНрдкрдгреА рдХреА рдереАред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рд╕реАрдзреЗ рдЙрддреНрддрд░ рджреЗрдВ, рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/microsoft/TypeScript/issues/13778?email_source=notifications&email_token=ACAJU3DQ7U6Y3MUUM26J4JDQQM62XA5CNFSM4C6KEKAKY3PNVWWK3TUL52HS4DFVREXG43VMVBWK75PWSZ5
рдпрд╛ рд╕рджрд╕реНрдпрддрд╛ рд╕рдорд╛рдкреНрдд рдХрд░реЗрдВ
https://github.com/notifications/unsubscribe-auth/ACAJU3EWVM3CUFG25UF5PGDQQM62XANCNFSM4C6KEKAA
.

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

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

рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реИ рдХрд┐ рдХрд┐рд╕реА рдиреЗ рдЕрднреА рддрдХ as const рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдирд╣реАрдВ рдХреАред

const test = [1, 2, 3] as const;

(test[100]).toFixed(5);
// Tuple type 'readonly [1, 2, 3]' of length '3' has no element at index '100'.

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

const xs: Array<number | undefined> = [1,2,3];

// for objects but kind of related as well
Record<string, User | undefined>

interface Something {
  [key: string]: User | undefined
}

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

@martpie as const рдпрджрд┐ рдЖрдк рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реИред

рдХрдо рд╕реЗ рдХрдо рджреЛ рдХрд╛рд░рдг рд╣реИрдВ рдХрд┐ рдореИрдВ Array<T | undefined> рдЙрдкрдпреЛрдЧ рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛:

  1. рд╣рд░ рдмрд╛рд░ рдЬрдм рдЖрдк рдХрд┐рд╕реА рд╕рд░рдгреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдпрд╣ рдПрдХ рдФрд░ рдмрд╛рдд рдпрд╛рдж рд░рдЦрдиреА рд╣реЛрддреА рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрдк рдЕрдм рдХреЗрд╡рд▓ рдирд┐рд╣рд┐рдд рдЯрд╛рдЗрдкрд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдХрд┐ рдЕрдЪреНрдЫрд╛ рд╣реИред
  2. рдпрд╣ forEach , map рдФрд░ filter рдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░реЛрдВ рдХреЛ рдмрджрд▓ рджреЗрддрд╛ рд╣реИ, рдЬреЛ undefined рдХреЛ рддрддреНрд╡ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд╕ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ (рдЬрдм рддрдХ рдХрд┐ рд╕реВрдЪрдХрд╛рдВрдХ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЙрд╕ рддрд░рд╣ рд╕реЗ рд╕реЗрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ)ред рдЗрд╕ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдЙрди рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдХрд┐рддрдирд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рдирд╕реЗ рдирд┐рдкрдЯрдиреЗ рдореЗрдВ рдкрд░реЗрд╢рд╛рдиреА рд╣реЛ рд╕рдХрддреА рд╣реИред

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

const a: string[] = [];
const foo = a[1000];
if (foo) { // eslint says this is an unnecessary conditional
  console.log(foo.length);
}

рдПрд╕реНрд▓рд┐рдВрдЯ (рд╕рд╣реА рдврдВрдЧ рд╕реЗ) рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╕реЗ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдЬрд╛рдВрдЪ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдлреВ рдХрднреА рднреА рд╢реВрдиреНрдп рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рддреЛ рдЕрдм рдореБрдЭреЗ рди рдХреЗрд╡рд▓ рд╕рдЪреЗрдд рд░реВрдк рд╕реЗ рдпрд╛рдж рд░рдЦрдирд╛ рд╣реИ рдХрд┐ рдореИрдВ рдПрдХ рд╕рд░рдгреА рд╕реЗ рд╡рд╛рдкрд╕ рдЖрдиреЗ рд╡рд╛рд▓реА рдЪреАрдЬреЛрдВ рдкрд░ рдПрдХ рд╢реВрдиреНрдп рдЬрд╛рдВрдЪ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдореБрдЭреЗ _ рднреА_ рдПрдХ рдПрд╕реНрд▓рд┐рдВрдЯ рдЕрдХреНрд╖рдо рд▓рд╛рдЗрди рдЬреЛрдбрд╝рдиреА рд╣реИ! рдФрд░ рдЗрд╕ рддрд░рд╣ рдХреЗ рд▓реВрдк рдХреЗ рдмрд╛рд╣рд░ рдХреА рдЪреАрдЬреЛрдВ рдХреЛ рдПрдХреНрд╕реЗрд╕ рдХрд░рдирд╛ рд╡рд╕реНрддреБрддрдГ рдПрдХрдорд╛рддреНрд░ рддрд░реАрдХрд╛ рд╣реИ рдЬрд┐рд╕рд╕реЗ рд╣рдо рдХрднреА рднреА рдРрд░реЗ рдПрдХреНрд╕реЗрд╕ рдХрд░рддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ (рдЬреИрд╕реЗ рдХрд┐ рдЗрди рджрд┐рдиреЛрдВ рд╢рд╛рдпрдж рдЕрдзрд┐рдХрд╛рдВрд╢ рдЯреАрдПрд╕ рджреЗрд╡), рд╣рдо рд╕рд░рдгрд┐рдпреЛрдВ рдкрд░ рд▓реВрдкрд┐рдВрдЧ рдХрд░рддреЗ рд╕рдордп forEach/map/filter/etc рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред

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

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

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

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

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

// `things` is `Thing[]`, but is empty, i.e., `[]`
const { things } = data; 

// We are accessing `things[-1]`, which is obviously `undefined`, 
// but TypeScript thinks `latestThing` is a `Thing`
const latestThing = things[things.length - 1];

// TypeError: Cannot read property 'foo' of undefined
return latestThing.foo; 

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

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдмрд╕ рд╕реНрдкрд╖реНрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдореЗрд░рд╛ рдорддрд▓рдм "рд╣рдорд╛рд░рд╛ рдПрдкреАрдЖрдИ" рд╣реИ рдЬреИрд╕рд╛ рдХрд┐ "рдореИрдВ рдЬрд┐рд╕ рдЯреАрдо рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдЙрд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдИ рдЧрдИ рдПрдкреАрдЖрдИ"

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

рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдХреЗ рд░реВрдк рдореЗрдВ, рдореИрдВ рдПрдХ рдЫреЛрдЯреЗ рд╕реЗ рдЧрдВрджреЗ рд╣реИрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВред рдореИрдВ рд╕рд┐рд░реНрдл package.json рд╕рд╛рдзрд╛рд░рдг рдкреЛрд╕реНрдЯрдЗрдВрд╕реНрдЯреЙрд▓ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдЬреЛрдбрд╝рддрд╛ рд╣реВрдВ:

{
...
  "scripts": {
    "postinstall": "sed -i 's/\\[n: number\\]: T;/[n: number]: T | undefined;/g' node_modules/typescript/lib/lib.es5.d.ts",
    ...
  },
...
}

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

рдЗрд╕рдХреЗ рдЖрд╕-рдкрд╛рд╕ рдЪрд▓рдиреЗ рд╡рд╛рд▓реЗ рдЕрдиреНрдп рд╕рднреА рдореБрджреНрджреЗ рдпрд╣рд╛рдВ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рд┐рдд рд╣реЛрдиреЗ рд▓рдЧрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдкреВрдЫрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреА рдЬрдЧрд╣ рд╣реИ: рдЯреЗрдмрд▓ рд╕реЗ рд╡реИрдХрд▓реНрдкрд┐рдХ рдЗрдВрдбреЗрдХреНрд╕ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЗ рд▓рд┐рдП рд╢реЙрд░реНрдЯрд╣реИрдВрдб рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╣реИ? рдЬреИрд╕рд╛ рдХрд┐ @martpie рдмрддрд╛рддрд╛ рд╣реИ, рдЖрдкрдХреЛ interface Foo { [k: string]: Bar | undefined; } рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ рдЬреЛ рдХрд┐ interface Foo { [k: string]?: Bar; } рд╕реЗ рдХрдо рдПрд░реНрдЧреЛрдиреЛрдорд┐рдХ рд╣реИред

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

type Foo = { [_ in string]?: Bar } рднреА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЙрддрдирд╛ рд╕реБрдВрджрд░ рдирд╣реАрдВ, рд▓реЗрдХрд┐рди рдХрд╛рдлреА рд╕рдВрдХреНрд╖рд┐рдкреНрддред рдпрджрд┐ рдЖрдк рдЪрд╛рд╣реЗрдВ рддреЛ рдЕрдкрдирд╛ рдЦреБрдж рдХрд╛ Dict рдкреНрд░рдХрд╛рд░ рднреА рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, ?: рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рдЦрд┐рд▓рд╛рдл рдмрд╣рд╕ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ

рдпрд╣ рдЙрди "рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ: рдж рдмреИрдб рдкрд╛рд░реНрдЯреНрд╕" рд╡рд╛рд░реНрддрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдЬреИрд╕рд╛ рд▓рдЧрдиреЗ рд▓рдЧрд╛ рд╣реИ:

ts type Foo1 = { [_ in string]?: Bar } // Yup type Foo2 = { [_: string]?: Bar } // Nope interface Foo3 { k?: Bar } // Yup interface Foo4 { [_: string]?: Bar } // Nope

рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП T | undefined рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрдкрдпреЛрдЧреА рдирд╣реАрдВ рд╣реИред рд╣рдореЗрдВ рдЗрд╕реЗ рдмрдирд╛рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдЪрд╛рд╣рд┐рдП рддрд╛рдХрд┐ рдЗрдВрдбреЗрдХреНрд╕ рдСрдкрд░реЗрдЯрд░ [n] рдореЗрдВ T|undefined рдкреНрд░рдХрд╛рд░ рд╣реЛ, рд▓реЗрдХрд┐рди рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рд╕рд░рдгреА рдкрд░ map рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рд╣рдореЗрдВ T|undefined рдирд╣реАрдВ рдорд┐рд▓рдирд╛ рдЪрд╛рд╣рд┐рдП рдореВрд▓реНрдп, рдХреНрдпреЛрдВрдХрд┐ рдЙрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╣рдореЗрдВ рдкрддрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╡реЗ рдореМрдЬреВрдж рд╣реИрдВред

@radix рдРрд░реЗ рдкрд░ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП, рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реЛрдЧреА рдХреНрдпреЛрдВрдХрд┐ рдЙрди рд╕рднреА рдХреА рдЕрдкрдиреА рдкреНрд░рдХрд╛рд░ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛рдПрдВ рд╣реИрдВ рдЬреЛ рд╕рд╣реА рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░рддреА рд╣реИрдВ: рдЬреИрд╕реЗ map : https://github.com/microsoft /рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ/рдмреНрд▓реЙрдм/рдорд╛рд╕реНрдЯрд░/lib/lib.es5.d.ts#L1331

рдХреЗрд╡рд▓ рд╕рд╛рдорд╛рдиреНрдп рдХреЛрдб рдЙрдкрдпреЛрдЧ рдЬреЛ | undefined рдирд┐рд░реНрдорд╛рдг рдореЗрдВ рдЕрдиреБрднрд╡ рдХрд╛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреНрд░рддрд┐рдЧрдорди рд╣реЛрддрд╛ рд╣реИ рд╡рд╣ for ... of рд▓реВрдк рдореЗрдВ рд╣реЛрддрд╛ рд╣реИред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ (рдЗрд╕ рдореБрджреНрджреЗ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ), рд╡реЗ рд╕рд╛рдорд╛рдиреНрдп рдирд┐рд░реНрдорд╛рдг рд╣реИрдВред

@riggs рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк interface Array<T> { } рдмрдирд╛рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ [index: number]: T | undefined , рд▓реЗрдХрд┐рди @radix рд╕рдВрднрд╡рддрдГ рд╡рд░реНрддрдорд╛рди рдЕрдиреБрд╢рдВрд╕рд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣рд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ Array<T | undefined> рдореЗрдВ рдЖрдкрдХрд╛ рдЕрдкрдирд╛ рдХреЛрдбред

рдЙрддреНрддрд░рд╛рд░реНрджреНрдз рдХрдИ рдХрд╛рд░рдгреЛрдВ рд╕реЗ рдЦрд░рд╛рдм рд╣реИ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдХрдо рд╕реЗ рдХрдо рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЖрдк рдЕрдиреНрдп рдкреИрдХреЗрдЬреЛрдВ рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдкреВрд░реНрд╡ рдореЗрдВ рдХреБрдЫ рд╕рдорд╕реНрдпрд╛рдПрдВ рднреА рд╣реИрдВ, рдЕрд░реНрдерд╛рддреН рдЖрдк рд╕рд░рдгреА рдХреЛ undefined рдЕрд╕рд╛рдЗрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдпрд╣ рдХрд┐ рдЬреНрдЮрд╛рдд рд╕реБрд░рдХреНрд╖рд┐рдд рдорд╛рдорд▓реЛрдВ рдореЗрдВ рднреА undefined рджреЗрддрд╛ рд╣реИред тАНтЩВя╕П

рдЖрд╣, рд╣рд╛рдБ, рдореЗрд░реА рдЧрд▓рддрдлрд╣рдореАред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдореИрдВ рдХреЗрд╡рд▓ [index: number]: T | undefined рдкрд░рд┐рднрд╛рд╖рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдЬрд┐рдХреНрд░ рдХрд░ рд░рд╣рд╛ рдерд╛ред рдореИрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рд╣рдордд рд╣реВрдВ рдХрд┐ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЛ Array<T | undefined> рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рдПрдХ рднрдпрд╛рдирдХ рдХрд╛рдо рд╣реИ рдЬреЛ рд╣рд▓ рд╣реЛрдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИред

рдХреНрдпрд╛ lib.es5.d.ts рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рд╢рд╛рдирджрд╛рд░ рддрд░реАрдХрд╛ рд╣реИ рдпрд╛ рдкреЛрд╕реНрдЯрдЗрдВрд╕реНрдЯреЙрд▓ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЬрд╛рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рд╣реИ?

@ рдирд┐рдХреБ-chiciuc https://www.npmjs.com/package/patch-package рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рд╛рде рдПрдХ рд╡рд┐рдзрд░реНрдореА рдХреЗ рдкрд┐рдЯрд╛рд░реЗ рдореЗрдВ рдлрд┐рдЯ рдмреИрдарддрд╛ рд╣реИ https://www.npmjs.com/package/yalc тЬМя╕П

рдХреНрдпрд╛ lib.es5.d.ts рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рд╢рд╛рдирджрд╛рд░ рддрд░реАрдХрд╛ рд╣реИ рдпрд╛ рдкреЛрд╕реНрдЯрдЗрдВрд╕реНрдЯреЙрд▓ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЬрд╛рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рд╣реИ?

рд╣рдорд╛рд░реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ global.d.ts рдлрд╝рд╛рдЗрд▓ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣рдо 1 рдХреЗ рд▓рд┐рдП рдХрд░рддреЗ рд╣реИрдВ) рдмрд┐рд▓реНрдЯ-рдЗрди рдПрдкреАрдЖрдИ рдХреЗ рд▓рд┐рдП рдЯрд╛рдЗрдк рдкрд░рд┐рднрд╛рд╖рд╛рдПрдБ рдЬреЛрдбрд╝рдирд╛ рдЬреЛ рдЕрднреА рддрдХ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреА рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдкреНрд░рдХрд╛рд░ рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдирд╣реАрдВ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд╡реЗрдмрдЖрд░рдЯреАрд╕реА-рд╕рдВрдмрдВрдзрд┐рдд рдПрдкреАрдЖрдИ рдЬреЛ рд▓рдЧрд╛рддрд╛рд░ рдмрджрд▓ рд░рд╣реЗ рд╣реИрдВ рдФрд░ рд╕рднреА рдмреНрд░рд╛рдЙрдЬрд╝рд░реЛрдВ рдореЗрдВ рдЕрд╕рдВрдЧрдд рд╣реИрдВ) ) рдФрд░ 2) рдЯрд╛рдЗрдкрдкреНрд░рддрд┐ рдХреЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдкреНрд░рдХрд╛рд░ рдкрд░рд┐рднрд╛рд╖рд╛рдПрдВ рдореЗрдВ рд╕реЗ рдХреБрдЫ рдЕрдзрд┐рднрд╛рд╡реА (рдЬреИрд╕реЗ рдХреЗ рдкреНрд░рдХрд╛рд░ рдЕрдзрд┐рднрд╛рд╡реА Object.entries рдЗрддрдирд╛ рд╣реИ рдХрд┐ рдпрд╣ рдпреБрдХреНрдд рд╕рд░рдгрд┐рдпреЛрдВ рд░рд┐рдЯрд░реНрди unknown рдХреЗ рдмрдЬрд╛рдп any )ред

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

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

рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдЖрдк рдЙрди рд╕рднреА lib.*.d.ts рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдХреЙрдкреА-рдкреЗрд╕реНрдЯ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рдирдХрд╛ рдЙрдкрдпреЛрдЧ рдЖрдк рдЕрдкрдиреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, tsconfig.json рдХреЗ files рдпрд╛ include , рдлрд┐рд░ рдЙрдиреНрд╣реЗрдВ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ рдЖрдк рдХреНрдпрд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдЪреВрдВрдХрд┐ рдЙрдирдореЗрдВ /// <reference no-default-lib="true"/> , /// <reference lib="..."/> рдХреЛ рд╣рдЯрд╛рдирд╛ рд╣реЛрдЧрд╛ рдпрд╛ рдирд╣реАрдВред рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╕рднреА рд╕реНрдкрд╖реНрдЯ рд░рдЦрд░рдЦрд╛рд╡ рдХрд╛рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдмреБрд░рд╛ рд╣реИред

@butchler рд╣рдо рднреА рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрдВрдбреЗрдХреНрд╕рд┐рдВрдЧ рдСрдкрд░реЗрдЯрд░ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рдерд╛, рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╣рдордиреЗ рдХреБрдЫ рдЕрдиреНрдп рдРрд░реЗ рдлрд╝рдВрдХреНрд╢рдВрд╕ ( filter рдЯрд╛рдЗрдк рдЧрд╛рд░реНрдб рдХреЗ рд╕рд╛рде) рдХреЛ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░ рджрд┐рдпрд╛ рд╣реИред

рдЗрдВрдбреЗрдХреНрд╕рд┐рдВрдЧ рдСрдкрд░реЗрдЯрд░ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рдЕрдЬреАрдм рдорд╛рдорд▓рд╛ рд╣реИ:

function test() {
  const arr: string[] = [];

  const [first] = arr;
  const zero = arr[0];

  const str1: string = first;
  const str2: string = zero;
}

Screenshot 2020-02-05 at 10 39 20 AM

рджреВрд╕рд░рд╛ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдЧрд▓рдд рдХрд░рддрд╛ рд╣реИ (рдЬреИрд╕рд╛ рдХрд┐ рдЗрд╕реЗ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП), рдлрд┐рд░ рднреА рдкрд╣рд▓рд╛ рд╡рд╛рд▓рд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред
рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдЕрдЬреАрдм рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ first рдкрд░ рдордБрдбрд░рд╛рддреЗ рд╣реБрдП рдЗрд╕реЗ рдирд╖реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рдпрд╣ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдореЗрдВ string | undefined рдХрд╛ рдПрдХ рдкреНрд░рдХрд╛рд░ рд╣реИ, рдлрд┐рд░ рднреА рдЗрд╕реЗ рд╕реМрдВрдкрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рдпрд╣ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдореЗрдВ string рдХрд╛ рдПрдХ рдкреНрд░рдХрд╛рд░ рд╣реИ
Screenshot 2020-02-05 at 10 40 25 AM
Screenshot 2020-02-05 at 10 40 32 AM

рдХреНрдпрд╛ рд╕рд░рдгреА рд╡рд┐рдирд╛рд╢рдХрд╛рд░реА рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рдкреНрд░рдХрд╛рд░ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рд╣реИ?

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

{ [index: string]: string | undefined } рдЬреИрд╕реЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рдХреЛрдИ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ Object.values(x).forEach(...) рдЬреИрд╕реЗ рдЗрдЯрд░реЗрдЯрд░реНрд╕ рдХреЗ рд▓рд┐рдП рдЯрд╛рдЗрдкрд┐рдВрдЧ рдХреЛ рдЧрдбрд╝рдмрдбрд╝ рдХрд░ рджреЗрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдХрднреА рднреА undefined рдорд╛рди рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реЛрдВрдЧреЗред

рдЬрдм рдореИрдВ someObject[someKey] рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рдХреА рдЬрд╛рдВрдЪ рдирд╣реАрдВ рдХрд░рддрд╛, рд▓реЗрдХрд┐рди Object.values(someObject).forEach(...) рдХрд░рддреЗ рд╕рдордп рдирд╣реАрдВ, рддреЛ рдореИрдВ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЙрддреНрдкрдиреНрди рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред

@danielnixon рдпрд╣ рдХреЛрдИ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рд╣реИ, рдпрд╣ рдПрдХ рд╕рдорд╛рдзрд╛рди рд╣реИред рд╕рдорд╛рди рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рднрд╛рд╖рд╛ рдХреЗ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдЯреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЖрдкрдХреЛ рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рдбреЗрд╡рд▓рдкрд░ рдХреЛ рдЧрд▓рддреА рд╕реЗ (рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рдРрд╕рд╛ рднреА рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ) рд░реЛрдХ рдирд╣реАрдВ рд╕рдХрддреЗ рд╣реИрдВред рдореЗрд░рд╛ рдорддрд▓рдм рд╣реИ, рдореИрдВ рдЗрд╕ рд╕рд╛рдорд╛рди рдХреЗ рд▓рд┐рдП fp-ts рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдЕрднреА рднреА рдорд╛рдиреНрдп рд╣реИ рдФрд░ рдЗрд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдЬрдмрдХрд┐ рдореИрдВ @RyanCavanaugh рд╕реЗ рд╡рд┐рдкрд░реАрдд рддрд░реНрдХреЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ:

for (let i = 0; i < arr.length; i++) {
  // TypeScript makes me use ! with my arrays, sad.
  console.log(arr[i]!.name);

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

1. рд╕рд╛рдВрдЦреНрдпрд┐рдХреАрдп рд░реВрдк рд╕реЗ рдЙрди рдирд┐рд░реНрдорд╛рдгреЛрдВ рдХреА рдкрд╣рдЪрд╛рди рдХрд░реЗрдВ рдЬрд┐рдирдореЗрдВ рддреНрд░реБрдЯрд┐ рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИред

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

рддрдХрдиреАрдХреА рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ, рдирд┐рд░реНрдорд╛рдг рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИрдВ:

const x = ['a', 'b', 'c']
console.log(x[3]) // type: string, reality: undefined

рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдкрд╣рд▓рд╛ рд▓рдХреНрд╖реНрдп рддреЛрдбрд╝рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдРрд╕рд╛ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ рдпрджрд┐ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рдкреНрд░рдХрд╛рд░ рдЬрд╛рдирддрд╛ рд╣реИ:

const x = ['a', 'b', 'c'] as const
console.log(x[3]) // compile error: Tuple type 'readonly ["a", "b", "c"]' of length '3' has no element at index '3'.ts(2493)

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

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

рдпрд╣ рдПрдХ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рд╣реИ, рдмрд▓реНрдХрд┐ рд╕рд┐рд░реНрдл рдПрдХ рдкреНрд░рдпреЛрдЧ рд╣реИ: рдореИрдВрдиреЗ рдЕрдкрдиреЗ node_modules рдЕрдВрджрд░ рдПрдХ рдореМрдЬреВрджрд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдкрд░ lib.es5.d.ts рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ рдЬреЛ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдпрд╣ рдХреИрд╕рд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ _did_ рдПрдХ рдХрдВрдкрд╛рдЗрд▓рд░ рд╣реИ рдЗрд╕рдХреЗ рд▓рд┐рдП рд╡рд┐рдХрд▓реНрдкред рдореИрдВрдиреЗ Array рдФрд░ ReadonlyArray рд╕рдВрд╢реЛрдзрд┐рдд рдХрд┐рдпрд╛:

interface ReadonlyArray<T> {
  ...
  [n: number]: T | undefined; // was just T
}

interface Array<T> {
  ...
  [n: number]: T | undefined; // was just T
}

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

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

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

  3. рдореЗрд░реЗ рдкрд╛рд╕ for (let i = 0; i < array.length; i++) рд▓реВрдк рдХреЗ рдЕрдВрджрд░ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рддреНрд░реБрдЯрд┐ рдереА рдЬреЛ рдордирдорд╛рдиреЗ рдврдВрдЧ рд╕реЗ Array<T> рдкрд░ рд▓реВрдкрд┐рдВрдЧ рдХрд░ рд░рд╣реА рдереАред рдореИрдВ рдХреЗрд╡рд▓ undefined рдЬрд╛рдВрдЪ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЧрд╛рд░реНрдб рдирд╣реАрдВ рдЬреЛрдбрд╝ рд╕рдХрд╛, рдХреНрдпреЛрдВрдХрд┐ T рд╕реНрд╡рдпрдВ undefined рд╢рд╛рдорд┐рд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдПрдХрдорд╛рддреНрд░ рд╕рдорд╛рдзрд╛рди рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореИрдВ рд╕реЛрдЪ рд╕рдХрддрд╛ рдерд╛ рдХрд┐ рдП) рдЯрд╛рдЗрдк рдПрд░рд░ рдпрд╛ @ts-ignore рдЯрд╛рдЗрдк рдПрд░рд░ рдХреЛ рд╢рд╛рдВрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдпрд╛ рдмреА) рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдлреЙрд░-рдСрдл рд▓реВрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдореБрдЭреЗ рдпрд╣ рдмрд╣реБрдд рдмреБрд░рд╛ рдирд╣реАрдВ рд▓рдЧрддрд╛ рд╣реИ (рд╢рд╛рдпрдж рдХреБрдЫ рдРрд╕реЗ рдорд╛рдорд▓реЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рдХрд┐рд╕реА рд╕рд░рдгреА рдкрд░ рдкреБрдирд░рд╛рд╡реГрддрд┐ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлреЙрд░-рдСрдлрд╝ рд▓реВрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╡реИрд╕реЗ рднреА рдмреЗрд╣рддрд░ рдирд╣реАрдВ рд╣реИ), рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд┐рд╡рд╛рджрд╛рд╕реНрдкрдж рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

  4. рдРрд╕реЗ рдХрдИ рдорд╛рдорд▓реЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рдореМрдЬреВрджрд╛ рдХреЛрдб рдкрд╣рд▓реЗ рд╕реЗ рд╣реА .length рдХреЗ рдореВрд▓реНрдп рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рджрд╛рд╡рд╛ рдХрд░ рд░рд╣рд╛ рдерд╛ рдФрд░ рдлрд┐рд░ рд╕рд░рдгреА рдореЗрдВ рдПрдХ рддрддреНрд╡ рддрдХ рдкрд╣реБрдВрдЪ рд░рд╣рд╛ рдерд╛ред рдпреЗ рдЕрдм .length рдЪреЗрдХ рдХреЗ рдмрд╛рд╡рдЬреВрдж рдЯрд╛рдЗрдк рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХрд╛ рдХрд╛рд░рдг рдмрдиреЗ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ .length рдЪреЗрдХ рдкрд░ рдирд┐рд░реНрднрд░ рди рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдмрджрд▓рдирд╛ рдкрдбрд╝рд╛ рдпрд╛ рдХреЗрд╡рд▓ рдПрдХ рдЕрдирд╛рд╡рд╢реНрдпрдХ !== undefined рдЪреЗрдХ рдЬреЛрдбрд╝рдирд╛ рдкрдбрд╝рд╛ред рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдЪреНрдЫрд╛ рд╣реИ, рддреЛ рдЯрд╛рдЗрдкрдкреНрд░рддрд┐ рдХрд┐рд╕реА рддрд░рд╣ рдПрдХ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреА рдЕрдиреБрдорддрд┐ рд╕рдХрддрд╛ рд╣реИ .length рдХреЗ рд▓рд┐рдП рдЬрд░реВрд░рдд рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рдБрдЪ !== undefined рдЬрд╛рдВрдЪред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдорд╛рдореВрд▓реА рдирд╣реАрдВ рд╣реЛрдЧрд╛, рд╣рд╛рд▓рд╛рдВрдХрд┐ред

  5. рдЬреЗрдиреЗрд░рд┐рдХ рд╕рд░рдгреА рдкреНрд░рдХрд╛рд░ рдХреЗ рддрддреНрд╡реЛрдВ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдХреЛрдб A[number] рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рдереЗред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рдЕрдм рдХреЗрд╡рд▓ T рдмрдЬрд╛рдп T | undefined рд╡рд╛рдкрд╕ рдЖ рдЧрдпрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдХрд╣реАрдВ рдФрд░ рдЯрд╛рдЗрдк рддреНрд░реБрдЯрд┐рдпрд╛рдВ рд╣реЛ рд░рд╣реА рд╣реИрдВред рдореИрдВрдиреЗ рдЗрд╕рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╣рд╛рдпрдХ рдмрдирд╛рдпрд╛:

    type ArrayValueType<A extends { [n: number]: unknown }> = (
      A extends Array<infer T> ? T :
      A extends ReadonlyArray<infer T> ? T :
      A[number] // Fall back to old way of getting array element type
    );
    

    рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдЗрд╕ рд╕рд╣рд╛рдпрдХ рдХреЗ рд╕рд╛рде рд╕рдВрдХреНрд░рдордг рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдЕрднреА рднреА рдПрдХ рдмрдбрд╝рд╛ рдмреНрд░реЗрдХрд┐рдВрдЧ рдкрд░рд┐рд╡рд░реНрддрди рд╣реИред рд╢рд╛рдпрдж рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ A[number] рд▓рд┐рдП рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрджрд┐ рд╕рдВрднрд╡ рд╣реЛ рддреЛ рдЕрдЬреАрдм рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓реЛрдВ рд╕реЗ рдмрдЪрдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред

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

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

@butchler рдореИрдВрдиреЗ рдЗрдирдореЗрдВ рд╕реЗ рдХреБрдЫ рдореБрджреНрджреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рднреА рднрд╛рдЧ рд▓рд┐рдпрд╛ рд╣реИ, рдореИрдВрдиреЗ something[i] рдХреЛ something(i) рд░реВрдк рдореЗрдВ рджреЗрдЦрдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛ рд╣реИ, рдпрд╛рдиреА, рдореИрдВ рдХреЗрд╡рд▓ if (Meteor.user() && Meteor.user()._id) {...} рдЬреИрд╕реА рдХрд┐рд╕реА рдЪреАрдЬрд╝ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдирд╣реАрдВ рдХрд░рддрд╛' рдЯреА рд╕рд░рдгреА рдЕрдиреБрдХреНрд░рдордг рдХреЗ рд▓рд┐рдП рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреА рдЙрдореНрдореАрдж рд╣реИ; рдореБрдЭреЗ рдкрд╣рд▓реЗ рд╡рд╣ рдорд╛рди рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдЬрд┐рд╕реЗ рдореИрдВ рд╕рд░рдгреА рд╕реЗ рдирд┐рд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдореИрдВ рдЬреЛ рдХрд╣рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рдЯреАрдПрд╕ рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рд▓рдВрдмрд╛рдИ рдХреА рд╕рдВрдкрддреНрддрд┐ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдирд╛ рдФрд░ рдЙрд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХреБрдЫ рджрд╛рд╡рд╛ рдХрд░рдирд╛ рдЯрд╛рдЗрдк рд╕рд┐рд╕реНрдЯрдо рдкрд░ рдмрд╣реБрдд рдЕрдзрд┐рдХ рддрдирд╛рд╡ рдбрд╛рд▓ рд╕рдХрддрд╛ рд╣реИред рдПрдХ рдЪреАрдЬ рдЬрд┐рд╕рдиреЗ рдореБрдЭреЗ рд╕рдВрдХреНрд░рдордг рд╕реЗ рджреВрд░ рдХрд░ рджрд┐рдпрд╛ (рдЗрд╕ рддрдереНрдп рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХрд┐ рдХреБрдЫ рдЕрдиреНрдп рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдореЗрдВ рднреА рддреНрд░реБрдЯрд┐рдпрд╛рдВ рд╣реИрдВ, рдЬреИрд╕рд╛ рдЖрдкрдиреЗ рдХрд╣рд╛ рд╣реИ) рдпрд╣ рд╣реИ рдХрд┐ рд╕рд░рдгреА рд╡рд┐рдирд╛рд╢ рдЕрднреА рддрдХ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ рдФрд░ рдореВрд▓реНрдп рдирд╖реНрдЯ рдирд╣реАрдВ рд╣реЛрдЧрд╛ T | undefined рд▓реЗрдХрд┐рди T (рдореЗрд░реА рдЕрдиреНрдп рдЯрд┐рдкреНрдкрдгреА рджреЗрдЦреЗрдВ)ред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ lib.es5.d.ts рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдирд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рд╣реИред рднрд▓реЗ рд╣реА рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЪреАрдЬреЗрдВ рдмрджрд▓ рдЬрд╛рдПрдВрдЧреА, рдкрд░рд┐рд╡рд░реНрддрди рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рд╕реЗ рдЕрддрд┐рд░рд┐рдХреНрдд рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдирд╣реАрдВ рдЖрдПрдВрдЧреА, рд▓реЗрдХрд┐рди рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рд╣реЛрдЧрд╛ рдХрд┐ рдХреБрдЫ рдПрдЬ-рдХреЗрд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрд╡рд░ рдХрд┐рдП рдЧрдП рд╣реИрдВред
рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛ рд╣реИ patch-package рдмрджрд▓рд╛рд╡ рдХреЗ рд▓рд┐рдП рдореЗрдВ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛рдПрдБ react рдФрд░ рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛рдо рдареАрдХ рд▓рдЧрддрд╛ рд╣реИред

рдореИрдВ рдЗрдирдореЗрдВ рд╕реЗ рдХреБрдЫ рдореБрджреНрджреЛрдВ рд╕реЗ рднреА рдЧреБрдЬрд░рд╛ рд╣реВрдВ, рдореИрдВрдиреЗ рдХреБрдЫ [i] рдХреЛ рдХреБрдЫ (i) рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦрдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛ рд╣реИ, рдпрд╛рдиреА, рдореИрдВ рдмрд╕ рдХреБрдЫ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рдЬреИрд╕реЗ if (Meteor.user() && Meteor.user()._id) { ...}, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рд╕рд░рдгреА рдЕрдиреБрдХреНрд░рдордг рдХреЗ рд▓рд┐рдП рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдирд╣реАрдВ рд╣реИ; рдореБрдЭреЗ рдкрд╣рд▓реЗ рд╡рд╣ рдорд╛рди рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдЬрд┐рд╕реЗ рдореИрдВ рд╕рд░рдгреА рд╕реЗ рдирд┐рд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред

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

if (array[i]) {
  array[i].doSomething(); // causes a type error with our modified Array types
}

рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рдмрджрд▓рдирд╛ рдкрдбрд╝рд╛:

const arrayValue = array[i]
if (arrayValue) {
  arrayValue.doSomething();
}

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

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

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

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

рд╕рд░рдгрд┐рдпреЛрдВ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рдирд╛, рдФрд░ рдПрдХ рдкрд▓ рдХреЗ рд▓рд┐рдП Record<string, T> рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░рдирд╛, рдореЗрд░реА рд╡реНрдпрдХреНрддрд┐рдЧрдд рдЗрдЪреНрдЫрд╛ рд╕реВрдЪреА рдпрд╣ рд╣реИ рдХрд┐ рд▓реЗрдЦрди рдХреЗрд╡рд▓ T рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдкрдврд╝рдирд╛ T|undefined рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

declare const obj : Record<string, T>;
declare const t : T;
obj["k"] = t; //ok
obj["k"] = undefined; //error, undefined not assignable to T

//T|undefined inferred,
//since we don't know if "k2" is an "ownProperty" of obj
const v = obj["k2"];

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

//Shouldn't just be string[]
//Should also be something like (keyof valueof obj)[],
//A dependent type
const keys = Object.keys(obj);

рд╕рд░рдгрд┐рдпреЛрдВ рдкрд░ рд╡рд╛рдкрд╕ рдЬрд╛рдиреЗ рдкрд░, рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕реВрдЪрдХрд╛рдВрдХ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд╛ рдЗрд░рд╛рджрд╛ рд╕рдорд╛рди рдирд╣реАрдВ рд╣реИ Record<number, T> ред

рддреЛ, рдЖрдкрдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рдирд┐рд░реНрднрд░ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЧрд╛рд░реНрдб рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдЬреИрд╕реЗ,

for (let i=0; i<arr.length; ++i) {
  //i is not just number
  //i should also be something like keyof valueof arr 
}

рддреЛ, рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ Record<number, T> ред рдпрд╣ Record<(int & (0 <= i < this["length"]), T> (рдПрдХ рд╢реНрд░реЗрдгреА рдФрд░ рд╕рдВрдЦреНрдпрд╛-рд╕рдорд░реНрдерд┐рдд рдкреВрд░реНрдгрд╛рдВрдХ рдкреНрд░рдХрд╛рд░) рдЬреИрд╕рд╛ рд╣реИ


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

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

рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ forEach , map , filter , рдЖрджрд┐ рдЬреИрд╕реЗ рдХрд╛рд░реНрдп рдореМрдЬреВрдж рд╣реИрдВ (рдФрд░ IMHO рдЕрдзрд┐рдХ рдмреЗрд╣рддрд░ рд╣реИрдВ), рдореИрдВ TS рдЯреАрдо рд╕реЗ рдЕрдкрдиреЗ рдЕрдиреБрдорд╛рди рдЗрдВрдЬрди рдХреЛ рдмрд╣реБрдд рдЬрдЯрд┐рд▓ рдХрд░рдиреЗ рдХреА рдЙрдореНрдореАрдж рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛ рдирд┐рдпрдорд┐рдд рд░реВрдк рд╕реЗ рд▓реВрдк рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд░рдгреА рдкрд░ рд▓реВрдкрд┐рдВрдЧ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░реЗрдВред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рд╕реЗ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рдЬрдЯрд┐рд▓рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЪреВрдВрдХрд┐ i рд╕реНрдерд┐рд░ рдирд╣реАрдВ рд╣реИ, рддреЛ рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдХреЛрдИ рд▓реВрдк рдХреЗ рдЕрдВрджрд░ i рдХрд╛ рдорд╛рди рдмрджрд▓ рджреЗрддрд╛ рд╣реИ? рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдпрд╣ рдПрдХ рдмрдврд╝рдд рдХрд╛ рдорд╛рдорд▓рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдХреБрдЫ рдРрд╕рд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЙрдиреНрд╣реЗрдВ (рдЙрдореНрдореАрдж рд╕реЗ) рд╕рд╣рдЬ рддрд░реАрдХреЗ рд╕реЗ рд╕рдВрднрд╛рд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЗрдВрдбреЗрдХреНрд╕ рд╕рд┐рдЧреНрдиреЗрдЪрд░ рдХреЛ рдареАрдХ рдХрд░рдирд╛ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рд╕рд░рд▓ (ish) рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬреИрд╕рд╛ рдХрд┐ рдЙрдкрд░реЛрдХреНрдд рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдиреЗ рджрд┐рдЦрд╛рдпрд╛ рд╣реИред

4. рдРрд╕реЗ рдХрдИ рдорд╛рдорд▓реЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рдореМрдЬреВрджрд╛ рдХреЛрдб рдкрд╣рд▓реЗ рд╕реЗ рд╣реА .length рдХреЗ рдореВрд▓реНрдп рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рджрд╛рд╡рд╛ рдХрд░ рд░рд╣рд╛ рдерд╛ рдФрд░ рдлрд┐рд░ рд╕рд░рдгреА рдореЗрдВ рдПрдХ рддрддреНрд╡ рддрдХ рдкрд╣реБрдВрдЪ рд░рд╣рд╛ рдерд╛ред рдпреЗ рдЕрдм .length рдЪреЗрдХ рдХреЗ рдмрд╛рд╡рдЬреВрдж рдЯрд╛рдЗрдк рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХрд╛ рдХрд╛рд░рдг рдмрдиреЗ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ .length рдЪреЗрдХ рдкрд░ рдирд┐рд░реНрднрд░ рди рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдмрджрд▓рдирд╛ рдкрдбрд╝рд╛ рдпрд╛ рдХреЗрд╡рд▓ рдПрдХ рдЕрдирд╛рд╡рд╢реНрдпрдХ !== undefined рдЪреЗрдХ рдЬреЛрдбрд╝рдирд╛ рдкрдбрд╝рд╛ред рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдЪреНрдЫрд╛ рд╣реИ, рддреЛ рдЯрд╛рдЗрдкрдкреНрд░рддрд┐ рдХрд┐рд╕реА рддрд░рд╣ рдПрдХ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреА рдЕрдиреБрдорддрд┐ рд╕рдХрддрд╛ рд╣реИ .length рдХреЗ рд▓рд┐рдП рдЬрд░реВрд░рдд рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рдБрдЪ !== undefined рдЬрд╛рдВрдЪред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдорд╛рдореВрд▓реА рдирд╣реАрдВ рд╣реЛрдЧрд╛, рд╣рд╛рд▓рд╛рдВрдХрд┐ред

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

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

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

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

const noNext = !items[currentIndex + 1];

рдЗрд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк noNext рдХреЛ false рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред рдХреНрдпрд╛ рдЧрд▓рдд рд╣реИред рдпрд╣ рд╕рдЪ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рдореИрдВ items рдХреЛ Array<Item | undefined> рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЧрд▓рдд рдЕрдкреЗрдХреНрд╖рд╛ рджреЗрддрд╛ рд╣реИред
рдпрджрд┐ рдХреЛрдИ рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рд╣реИ рддреЛ рд╡рд╣ рдХрднреА рднреА undefined рдирд╣реАрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдк рдЧрд▓рдд рдЗрдВрдбреЗрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдпрд╣ _is_ undefined ред
рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдЙрдкрд░реЛрдХреНрдд рдХреЛ рд╕рдВрднрд╡рддрдГ .length рдЪреЗрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдпрд╛ noNext рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ boolean рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдХреЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рд▓реЗрдХрд┐рди рдЕрдВрдд рдореЗрдВ рдпрд╣ рдХреБрдЫ рдРрд╕рд╛ рд╣реИ рдЬреЛ рдореБрдЭреЗ рддрдм рд╕реЗ рдкрд░реЗрд╢рд╛рди рдХрд░рддрд╛ рд╣реИ рдЬрдм рд╕реЗ рдореИрдВрдиреЗ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛ рдФрд░ рдореБрдЭреЗ рдХрднреА рд╕рдордЭ рдирд╣реАрдВ рдЖрдпрд╛ рдХрд┐ | undefined рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд╢рд╛рдорд┐рд▓ рдХреНрдпреЛрдВ рдирд╣реАрдВ рд╣реИред

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

рдорд╛рдорд▓реЗ рдореЗрдВ рдпрд╣ рдХрд┐рд╕реА рдХреЗ рд╣рд┐рдд рдореЗрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдкрд┐рдЫрд▓реА рдЯрд┐рдкреНрдкрдгреА рдореЗрдВ рдореИрдВрдиреЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдерд╛ рдХрд┐ Array рдЕрдиреБрдХреНрд░рдордг рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЛ lib.es5.d.ts рдореЗрдВ рдкреИрдЪ рдХрд░рдиреЗ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдореЗрдВ рд╕рд░рдгреА рд╡рд┐рдирд╛рд╢рдХрд╛рд░реА рдкрд░ рдХреБрдЫ рдЕрдЬреАрдм рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдкрд░рд┐рд╡рд░реНрддрди рд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рдерд╛ред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ target рдореЗрдВ tsconfig.json рд╡рд┐рдХрд▓реНрдк рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдпрд╣ es5 рд╣реЛрдиреЗ рдкрд░ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ (https://github.com/microsoft/TypeScript/issues/37045 )

рд╣рдорд╛рд░реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдпрд╣ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╣рдо noEmit рд╡рд┐рдХрд▓реНрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдФрд░ рдЯреНрд░рд╛рдВрд╕рдкрд┐рд▓реЗрд╢рди рдХреЛ meteor рджреНрд╡рд╛рд░рд╛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЙрди рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЬрд╣рд╛рдВ рдпрд╣ рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ, рдПрдХ рд╕рдорд╛рдзрд╛рди рдЬреЛ рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИ рд╡рд╣ рд╣реИ safe-array-destructuring (https://github.com/typescript-eslint/typescript-eslint/pull/1645)ред
рдпрд╣ рдЕрднреА рднреА рдПрдХ рдорд╕реМрджрд╛ рд╣реИ рдФрд░ рдпрд╣ рддрдм рдореВрд▓реНрдпрд╡рд╛рди рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬрдм рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрдВрдкрд╛рдЗрд▓рд░ рдореЗрдВ рдкреВрд░рд╛ рдореБрджреНрджрд╛ рддрдп рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдкрдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рддреЛ typescript-eslint рдирд┐рдпрдо рдкреАрдЖрд░ рдореЗрдВ рдХрд┐рд╕реА рднреА рдЪрд┐рдВрддрд╛/рд╕реБрдзрд╛рд░ рдХреЛ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рдорд╣рд╕реВрд╕ рдХрд░реЗрдВ

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

const example = (args: string[]) => {
  const [userID, nickname] = args
}

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

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

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

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

@caseyhoward рдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓реЗ рдЗрд╕ рдореБрджреНрджреЗ рдореЗрдВ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдпрд╣ рд╡рд┐рднрд┐рдиреНрди Array.prototype рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдЕрд╡рд╛рдВрдЫрд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИ:

x.forEach( (i: string) => { ... } )  // Error because i has type string | undefined

рдЗрд╕реЗ array.prototype рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдареАрдХ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рд╕рд░рдгреА рд╡рд┐рдирд╛рд╢рдХрд╛рд░реА рдХреЗ рд▓рд┐рдП рдпрд╣ рдПрдХ рдмрдбрд╝рд╛ рдореБрджреНрджрд╛ рд╣реИ!

рдЗрд╕рдореЗрдВ рдЖрдЬ рдлрд┐рд░ рднрд╛рдЧ рдЧрдпрд╛ред рдореБрдЭреЗ рдЕрднреА рднреА рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рд╣реА рд╕рдордЭреМрддрд╛ рдпрд╣ рд╣реИ , рдЬрд┐рд╕ рдкрд░ рдореБрдЭреЗ рдХреБрдЫ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рд▓рдЧреЗрдЧрд╛ред

рдЗрд╕ рдореБрджреНрджреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рдЙрдкрдпреЛрдЧ рдХрд╛ рдорд╛рдорд▓рд╛- рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ-рдПрд╕реНрд▓рд┐рдиреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдФрд░ no-unnecessary-condition рд╕рдХреНрд╖рдо рдХрд░рддреЗ рд╕рдордп рдореИрдВ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдореЗрдВ рднрд╛рдЧ рдЧрдпрд╛ред рдЕрддреАрдд рдореЗрдВ, рдЙрд╕ рдЗрдВрдбреЗрдХреНрд╕ рдкрд░ рддрддреНрд╡ рдкрд░ рдХреБрдЫ рдСрдкрд░реЗрд╢рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдВрдбреЗрдХреНрд╕ рджреНрд╡рд╛рд░рд╛ рдХрд┐рд╕реА рд╕рд░рдгреА рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдкрд░, рд╣рдо рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡реИрдХрд▓реНрдкрд┐рдХ рдЪреЗрдирд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдЗрдВрдбреЗрдХреНрд╕ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ (рдпрджрд┐ рдЗрдВрдбреЗрдХреНрд╕ рд╕реАрдорд╛ рд╕реЗ рдмрд╛рд╣рд░ рд╣реИ), рдЬреИрд╕рд╛ рдХрд┐ array[i]?.doSomething() ред рдЗрд╕ рдореБрджреНрджреЗ рдореЗрдВ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рд╕рдорд╕реНрдпрд╛ рдХреЗ рд╕рд╛рде, рд╣рд╛рд▓рд╛рдВрдХрд┐, no-unnecessary-condition рд╡реИрдХрд▓реНрдкрд┐рдХ рдЪреЗрдирд┐рдВрдЧ рдХреЛ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рддрд╛ рд╣реИ (рдЬреИрд╕рд╛ рдХрд┐ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдкреНрд░рдХрд╛рд░ рдЕрд╢рдХреНрдд рдирд╣реАрдВ рд╣реИ) рдФрд░ рдСрдЯреЛрдлрд┐рдХреНрд╕ рд╡реИрдХрд▓реНрдкрд┐рдХ рдЪреЗрдирд┐рдВрдЧ рдХреЛ рд╣рдЯрд╛ рджреЗрддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рд░рдирдЯрд╛рдЗрдо рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рд╕рд░рдгреА рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣реЛрддрд╛ рд╣реИ рд╕реВрдЪрдХрд╛рдВрдХ i рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реИред

рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рдмрд┐рдирд╛ рдЕрдкрдиреЗ рдЖрд╡реЗрджрди рдмрд╣реБрдд рдЧрд╛рдбрд╝реА рдХреЗ рд░реВрдк рдореЗрдВ рдореИрдВ рдмрд╣реБ-рдЖрдпрд╛рдореА рд╕рд░рдгреА рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реВрдБ, рдореИрдВ рд╣рдореЗрд╢рд╛ рдЦреБрдж рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рдкрд╣реБрдБрдЪ рддрддреНрд╡реЛрдВ рдХреЛ рдпрд╛рдж рджрд┐рд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ рдмрди рдЧрдпрд╛ xs[i]?.[j] рдХреЗ рдмрдЬрд╛рдп xs[i][j] , рдпрд╣ рднреА рдореИрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдбрд╛рд▓реА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ рдкреНрд░рдХрд╛рд░ рдХреА рд╕реБрд░рдХреНрд╖рд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП const element = xs[i]?.[j] as Element | undefined рдЬреИрд╕реЗ рдПрдХреНрд╕реЗрд╕ рдХрд┐рдП рдЧрдП рддрддреНрд╡ред

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

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

рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИрдВ рдХрд┐ рдЖрдкрдХрд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИ рдХреНрдпрд╛ рдЖрдк рд╕рдорд╕реНрдпрд╛ рдХреЛ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдЙрджрд╛рд╣рд░рдг рджрд┐рдЦрд╛ рд╕рдХрддреЗ рд╣реИрдВ?

рдмреБрдзрд╡рд╛рд░, 29 рдЕрдкреНрд░реИрд▓, 2020 рдХреЛ рджреЛрдкрд╣рд░ 2:41 рдмрдЬреЗ рдХрд┐рд░рд┐рд▓ рдЧреНрд░реЛрд╢рдХреЛрд╡ рд╕реВрдЪрдирд╛рдПрдВ @github.com
рд▓рд┐рдЦрд╛ рдерд╛:

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

-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдиреЗ рдЯрд┐рдкреНрдкрдгреА рдХреА рдереАред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рд╕реАрдзреЗ рдЙрддреНрддрд░ рджреЗрдВ, рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/microsoft/TypeScript/issues/13778#issuecomment-621096030 ,
рдпрд╛ рд╕рджрд╕реНрдпрддрд╛ рд╕рдорд╛рдкреНрдд рдХрд░реЗрдВ
https://github.com/notifications/unsubscribe-auth/AAAGFJJT37N54I7EH2QLBYDRO7Y4NANCNFSM4C6KEKAA
.

@alangpierce

рдПрдХ рд╡рд┐рдЪрд╛рд░ рдЬреЛ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЖрд╢рд╛рдЬрдирдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ: рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдЖрдк рдЗрдВрдбреЗрдХреНрд╕ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╕рдордп ?: рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╣ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдЖрдк рд╕рд╛рдорд╛рдиреНрдп рдЙрдкрдпреЛрдЧ рдХреЗ рддрд╣рдд рдХрднреА-рдХрднреА рдореВрд▓реНрдпреЛрдВ рдХреЗ рдЧрд╛рдпрдм рд╣реЛрдиреЗ рдХреА рдЙрдореНрдореАрдж рдХрд░рддреЗ рд╣реИрдВ? рдпрд╣ рдКрдкрд░ рд╡рд░реНрдгрд┐рдд | undefined рддрд░рд╣ рдХрд╛рд░реНрдп рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди рдЕрдЬреАрдм рдбрд╛рдЙрдирд╕рд╛рдЗрдбреНрд╕ рдХреЗ рдмрд┐рдирд╛ред рдЗрд╕реЗ рд╕реНрдкрд╖реНрдЯ undefined рдорд╛рдиреЛрдВ рдХреЛ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдЬреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рд╛рдорд╛рдиреНрдп ?: рд╕реЗ рдПрдХ рдЕрдВрддрд░ рд╣реИред

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

type AlwaysDefined = {[key: string]!: string};
const t: AlwaysDefined = {};

t['foo'] // Has type string

рдФрд░ !: рдмрд┐рдирд╛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рдорд▓рд╛ рдРрд╕рд╛ рд▓рдЧреЗрдЧрд╛ рдЬреИрд╕реЗ рд╣рдо рдЗрд╕реЗ рдЬрд╛рдирддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реЛрдЧрд╛:

type MaybeUndefined = {[key: string]: string};
const t: MaybeUndefined = {};

t['foo'] // Has type string | undefined

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

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

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

рдореИрдВ рдЕрдкрдиреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП index.d.ts рдирд╣реАрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрд╛ рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕рд╕реЗ рдирд┐рдкрдЯрдирд╛ рдирд╣реАрдВ рдЪрд╛рд╣рддрд╛ рдерд╛ред

рдореИрдВрдиреЗ рдпрд╣ рдЫреЛрдЯрд╛ рд╣реИрдХ рдмрдирд╛рдпрд╛ рд╣реИ рдЬреЛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЧрд╛рд░реНрдб рдХреЛ рдордЬрдмреВрд░ рдХрд░рддрд╛ рд╣реИ:

 const firstNode = +!undefined && nodes[0];

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдкреНрд░рдХрд╛рд░ рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ: 0 | T , рдпрд╣ рдЕрднреА рднреА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

const firstNode = nodes?.[0] рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛?

@ricklove рдХрд┐рд╕реА рднреА рдХрд╛рд░рдг рд╕реЗ рдЖрдкрдиреЗ +!undefined рдХреЛ рдХреЗрд╡рд▓ 1 ?

const firstNode = nodes?.[0] рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛?

рдирд╣реАрдВ, рдЬреИрд╕рд╛ рдХрд┐ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ (рдЧрд▓рдд рддрд░реАрдХреЗ рд╕реЗ, рдореЗрд░реА рд░рд╛рдп рдореЗрдВ) рдЗрд╕реЗ рд╡реИрдХрд▓реНрдкрд┐рдХ рдирд╣реАрдВ рдорд╛рдиреЗрдЧрд╛ (рджреЗрдЦреЗрдВ #35139)ред

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

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

var obj: { [number]: string } = {};
obj[42].length; // No type error, but will throw at runtime

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

TS рдХрд╛ рдПрдХ рдлрд╛рдпрджрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рд╕рдВрдХрд▓рдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреА рдмрдЧ рдмрдирд╛рдиреЗ рд╕реЗ рд░реЛрдХрддрд╛ рд╣реИред рдЗрд╕ рд╕реВрддреНрд░ рдореЗрдВ рд╕рднреА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЛ рдкрдврд╝рдХрд░, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣рд╛рдВ рдХреЗ рд╡рд┐рд╢рд╛рд▓ рдмрд╣реБрдордд рдХреЛ рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рдкрд╕рдВрдж рдЖрдПрдЧреАред рдХреНрдпрд╛ TS рдЯреАрдо рдЕрднреА рднреА рдЗрд╕рдХреЗ рдЦрд┐рд▓рд╛рдл 100% рд╣реИ?

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

[#38470 рд╕реЗ рдпрд╣рд╛рдВ рдкрд░ рдЪрд▓ рд░рд╣реА рдЪрд░реНрдЪрд╛]
рд╕рднреА рддрд░реНрдХреЛрдВ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдирд╛ рдХрд┐ рдпрд╣ рд╕рд░рдгреА рдХреЗ рд▓рд┐рдП рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдХреНрдпреЛрдВ рдирд╣реАрдВ рд╣реЛрдЧрд╛ ..
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЯреБрдкрд▓реНрд╕ рдХреЗ рд▓рд┐рдП рд╕рдВрдмреЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП:

// tuple 
var str = '';
var num = 100
var aa = [str, num] as const

// Awesome
var shouldBeString = aa[0] // string
var shouldBeNumber = aa[1] // number
var shouldError = aa[10000]; // type error

// Not so awesome 
var foo = aa[num] // string | number

foo string | number | undefined рдХреНрдпреЛрдВ рдирд╣реАрдВ рдмрдирд╛рддреЗ?

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

рдЗрдирд╕реЗ рднреА рдорджрдж рдорд┐рд▓ рд╕рдХрддреА рд╣реИ

var notString1 = aa[Infinity]; // no error, not undefined
var notString2 = aa[NaN]; // no error, not undefined

рдЬреЛ рдореВрд▓ рд░реВрдк рд╕реЗ рдореЗрд░реА рд░рдирдЯрд╛рдЗрдо рддреНрд░реБрдЯрд┐ рдХреЗ рдХрд╛рд░рдг рд╣реЛрддрд╛ рд╣реИ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ number рдмрди рдЧрдпрд╛ рдПрдХ NaN , рддреЛ рд▓реМрдЯ рдЖрдП рдПрдХ undefined рдПрдХ рдЯрдкрд▓ рд╕реЗ ..
рдЬрд┐рдирдореЗрдВ рд╕реЗ рд╕рднреА рдкреНрд░рдХрд╛рд░ рд╕реЗ рд╕реБрд░рдХреНрд╖рд┐рдд рдереЗ

рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЯреБрдкрд▓реНрд╕ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрддрдиреЗ рдЕрд▓рдЧ рд╣реИрдВред рдЙрдиреНрд╣реЗрдВ рдмрд╛рдХреА рдкреНрд░рдХрд╛рд░реЛрдВ (рдЬреИрд╕реЗ [str, ...num[]] ) рдХреЛ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдФрд░ рддрдХрдиреАрдХреА рд░реВрдк рд╕реЗ aa[Infinity] рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдорд╛рдиреНрдп рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рджреЗрдЦ рд╕рдХрддрд╛ рдерд╛ рдХрд┐ рдЙрдирдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓рд╛ рдмрдирд╛рдирд╛ рдЬрдЯрд┐рд▓ рд╣реЛ рд░рд╣рд╛ рд╣реИред

рдЖрдкрдХреА рдкреЛрд╕реНрдЯ рдиреЗ рдореБрдЭреЗ рдпрд╣ рд╕реЛрдЪрдиреЗ рдкрд░ рдордЬрдмреВрд░ рдХрд░ рджрд┐рдпрд╛ рдХрд┐ рдЕрдЧрд░ рд╣рдореЗрдВ рдЗрдВрдбреЗрдХреНрд╕-рд░рд┐рдЯрд░реНрди рдХреЛ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рдорд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╕рдорд░реНрдерди рдорд┐рд▓рддрд╛ рддреЛ рдпрд╣ рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ред рдпрджрд┐, рдЖрдкрдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рдЕрдиреБрд╕рд╛рд░, aa[num] рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ string | number | undefined рд░реВрдк рдореЗрдВ рдЯрд╛рдЗрдк рдХрд┐рдпрд╛ рдерд╛, рддреЛ рдХреНрдпрд╛ рдореБрдЭреЗ for (let i = 0; i < 2; i++) { foo(aa[i]!); } рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рд╕реВрдЪрдХрд╛рдВрдХ рд╕реАрдорд╛ рдореЗрдВ рд░рд╣реЗрдЧрд╛? рдореЗрд░реЗ рд▓рд┐рдП, рдЬрдм рд╕рдЦреНрдд рдЕрд╢рдХреНрдд рдЪреЗрдХ рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдЦреА рдЧрдИ рдХрд┐рд╕реА рдЪреАрдЬрд╝ рдХреЛ рдлрд╝реНрд▓реИрдЧ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдореИрдВ рдЗрд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдБ рдпрд╛ рддреЛ рдЪреАрдЬреЛрдВ рдХреЛ рдкрд╣рд▓реЗ рд╕реНрдерд╛рди рдкрд░ рдмреЗрд╣рддрд░ рддрд░реАрдХреЗ рд╕реЗ рдЯрд╛рдЗрдк рдХрд░рдХреЗ, рдпрд╛ рд░рдирдЯрд╛рдЗрдо рдЧрд╛рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ - рдЕрдЧрд░ рдореБрдЭреЗ рдПрдХ рдЧреИрд░-рд╢реВрдиреНрдп рдЕрднрд┐рдХрдерди рдХрд╛ рд╕рд╣рд╛рд░рд╛ рд▓реЗрдирд╛ рд╣реИ, рддреЛ рдореИрдВ рдЖрдо рддреМрд░ рдкрд░ рдЗрд╕реЗ рдореЗрд░реА рдУрд░ рд╕реЗ рд╡рд┐рдлрд▓рддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦреЗрдВред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдореБрдЭреЗ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдЗрд╕рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХреЛрдИ рд░рд╛рд╕реНрддрд╛ рдирд╣реАрдВ рджрд┐рдЦ рд░рд╣рд╛ рд╣реИ, рдФрд░ рдпрд╣ рдореБрдЭреЗ рдкрд░реЗрд╢рд╛рди рдХрд░рддрд╛ рд╣реИред

рдпрджрд┐ tuple[number] рд╣рдореЗрд╢рд╛ T | undefined рдЯрд╛рдЗрдк рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЖрдк рдЙрд╕ рдорд╛рдорд▓реЗ рдХреЛ рдХреИрд╕реЗ рд╕рдВрднрд╛рд▓рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ рдЬрд╣рд╛рдВ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдмрдВрдзреА рд╣реБрдИ рд╣реИ?

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

(рдореЗрд░реА рдореВрд▓ рдЯрд┐рдкреНрдкрдгреА: https://github.com/microsoft/TypeScript/issues/13778#issuecomment-517759210)

рдУрд╣ рд╕рднреА рдИрдорд╛рдирджрд╛рд░реА рдореЗрдВ, рдореИрдВ рднреА рд╢рд╛рдпрдж рд╣реА рдХрднреА рдлреЙрд░-рд▓реВрдк рдХреЗ рд╕рд╛рде рдЗрдВрдбреЗрдХреНрд╕ рдХрд░рддрд╛ рд╣реВрдВред рдореИрдВ Object.entries рдпрд╛ Array#map рд╡реНрдпрд╛рдкрдХ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рд╣рд░ рдмрд╛рд░ рдПрдХ рд╕рдордп рдореЗрдВ рдореБрдЭреЗ рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдЗрдВрдбреЗрдХреНрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдВрдЬрд┐рдпреЛрдВ рдХреЛ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдпрд╛ (рд╢рд╛рдпрдж рдХрдо рдЕрдХреНрд╕рд░ рдЕрднреА рднреА) рдЗрдВрдбреЗрдХреНрд╕ рдХреЛ рдПрдХ рд╕рд░рдгреА рдпрд╛ рдЯрдкрд▓ рдореЗрдВред for рд▓реВрдк рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рдХрд╛рд▓реНрдкрдирд┐рдХ рдЙрджрд╛рд╣рд░рдг рдерд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдЗрд╕ рдмрд┐рдВрджреБ рдХреЛ рдЙрдард╛рддрд╛ рд╣реИ рдХрд┐ рдпрд╛ рддреЛ рд╡рд┐рдХрд▓реНрдк ( undefined рдпрд╛ рдирд╣реАрдВ) рдореЗрдВ рдХрдорд┐рдпрд╛рдВ рд╣реИрдВред

рд▓реЗрдХрд┐рди рдпрд╣ рдЗрд╕ рдмрд╛рдд рдХреЛ рдмрдврд╝рд╛рддрд╛ рд╣реИ рдХрд┐ рдпрд╛ рддреЛ рд╡рд┐рдХрд▓реНрдк ( undefined рдпрд╛ рдирд╣реАрдВ) рдореЗрдВ рдХрдорд┐рдпрд╛рдВ рд╣реИрдВред

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

рдУрд╣ рд╕рднреА рдИрдорд╛рдирджрд╛рд░реА рдореЗрдВ, рдореИрдВ рднреА рд╢рд╛рдпрдж рд╣реА рдХрднреА рдлреЙрд░-рд▓реВрдк рдХреЗ рд╕рд╛рде рдЗрдВрдбреЗрдХреНрд╕ рдХрд░рддрд╛ рд╣реВрдВред рдореИрдВ Object.entries рдпрд╛ Array#map рд╡реНрдпрд╛рдкрдХ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рд╣рд░ рдмрд╛рд░ рдПрдХ рд╕рдордп рдореЗрдВ рдореБрдЭреЗ рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдЗрдВрдбреЗрдХреНрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдВрдЬрд┐рдпреЛрдВ рдХреЛ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдпрд╛ (рд╢рд╛рдпрдж рдХрдо рдЕрдХреНрд╕рд░ рдЕрднреА рднреА) рдЗрдВрдбреЗрдХреНрд╕ рдХреЛ рдПрдХ рд╕рд░рдгреА рдпрд╛ рдЯрдкрд▓ рдореЗрдВред

рдЙрди рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЬрд╣рд╛рдВ рдЖрдкрдХреЛ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЖрдк Array#entries рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

for (const [index, foo] of array.entries()) {
    bar(index, foo)
}

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

рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЯреБрдкрд▓реНрд╕ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрддрдиреЗ рдЕрд▓рдЧ рд╣реИрдВред рдЙрдиреНрд╣реЗрдВ рдмрд╛рдХреА рдкреНрд░рдХрд╛рд░реЛрдВ (рдЬреИрд╕реЗ [str, ...num[]] ) рдХреЛ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдФрд░ рддрдХрдиреАрдХреА рд░реВрдк рд╕реЗ aa[Infinity] рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдорд╛рдиреНрдп рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рджреЗрдЦ рд╕рдХрддрд╛ рдерд╛ рдХрд┐ рдЙрдирдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓рд╛ рдмрдирд╛рдирд╛ рдЬрдЯрд┐рд▓ рд╣реЛ рд░рд╣рд╛ рд╣реИред

рдЖрдкрдХреА рдкреЛрд╕реНрдЯ рдиреЗ рдореБрдЭреЗ рдпрд╣ рд╕реЛрдЪрдиреЗ рдкрд░ рдордЬрдмреВрд░ рдХрд░ рджрд┐рдпрд╛ рдХрд┐ рдЕрдЧрд░ рд╣рдореЗрдВ рдЗрдВрдбреЗрдХреНрд╕-рд░рд┐рдЯрд░реНрди рдХреЛ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рдорд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╕рдорд░реНрдерди рдорд┐рд▓рддрд╛ рддреЛ рдпрд╣ рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ред рдпрджрд┐, рдЖрдкрдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рдЕрдиреБрд╕рд╛рд░, aa[num] рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ string | number | undefined рд░реВрдк рдореЗрдВ рдЯрд╛рдЗрдк рдХрд┐рдпрд╛ рдерд╛, рддреЛ рдХреНрдпрд╛ рдореБрдЭреЗ for (let i = 0; i < 2; i++) { foo(aa[i]!); } рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рд╕реВрдЪрдХрд╛рдВрдХ рд╕реАрдорд╛ рдореЗрдВ рд░рд╣реЗрдЧрд╛? рдореЗрд░реЗ рд▓рд┐рдП, рдЬрдм рд╕рдЦреНрдд рдЕрд╢рдХреНрдд рдЪреЗрдХ рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдЦреА рдЧрдИ рдХрд┐рд╕реА рдЪреАрдЬрд╝ рдХреЛ рдлрд╝реНрд▓реИрдЧ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдореИрдВ рдЗрд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдБ рдпрд╛ рддреЛ рдЪреАрдЬреЛрдВ рдХреЛ рдкрд╣рд▓реЗ рд╕реНрдерд╛рди рдкрд░ рдмреЗрд╣рддрд░ рддрд░реАрдХреЗ рд╕реЗ рдЯрд╛рдЗрдк рдХрд░рдХреЗ, рдпрд╛ рд░рдирдЯрд╛рдЗрдо рдЧрд╛рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ - рдЕрдЧрд░ рдореБрдЭреЗ рдПрдХ рдЧреИрд░-рд╢реВрдиреНрдп рдЕрднрд┐рдХрдерди рдХрд╛ рд╕рд╣рд╛рд░рд╛ рд▓реЗрдирд╛ рд╣реИ, рддреЛ рдореИрдВ рдЖрдо рддреМрд░ рдкрд░ рдЗрд╕реЗ рдореЗрд░реА рдУрд░ рд╕реЗ рд╡рд┐рдлрд▓рддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦреЗрдВред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдореБрдЭреЗ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдЗрд╕рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХреЛрдИ рд░рд╛рд╕реНрддрд╛ рдирд╣реАрдВ рджрд┐рдЦ рд░рд╣рд╛ рд╣реИ, рдФрд░ рдпрд╣ рдореБрдЭреЗ рдкрд░реЗрд╢рд╛рди рдХрд░рддрд╛ рд╣реИред

рдпрджрд┐ tuple[number] рд╣рдореЗрд╢рд╛ T | undefined рдЯрд╛рдЗрдк рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЖрдк рдЙрд╕ рдорд╛рдорд▓реЗ рдХреЛ рдХреИрд╕реЗ рд╕рдВрднрд╛рд▓рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ рдЬрд╣рд╛рдВ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдмрдВрдзреА рд╣реБрдИ рд╣реИ?

рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЯреБрдкрд▓реНрд╕ рдкрд░ рдЗрддрдирд╛ рдЕрдзрд┐рдХ for(let i..) рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рд╣реЛ рд░рд╣рд╛ рд╣реИ ..
рдпрджрд┐ рдЯрдкрд▓ рдХрд╛ рдПрдХ рд╣реА рдкреНрд░рдХрд╛рд░ рд╣реИ рддреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдПрдХ рдРрд░реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдЧрд╛,

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

var str = '';
var num = 100
var aa = [str, num] as const
for (let i = 0; i < aa.length; i++) {
 aa[i] // needs some type check anyway to determine if 'string' or 'number'
}

рдпрд╣ рднреА рдорд╛рдирддреЗ рд╣реБрдП рдХрд┐ рдпрд╣ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдкрд░рд┐рд╡рд░реНрддрди рд╣реЛрддрд╛ рд╣реИ, рд▓реЛрдЧреЛрдВ рдХреЛ рдРрд╕рд╛ рдХрд░рдиреЗ рд╕реЗ рдХреНрдпрд╛ рд░реЛрдХ рд░рд╣рд╛ рд╣реИ?

// this sucks
for (let i = 0; i < 2; i++) { 
   foo(aa[i]!); // ! required
}

// this would work
for (let i = 0 as 0 | 1; i < 2; i++) { 
   foo(aa[i]); //  ! not required 
}

рдЖрдк рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ keyof typeof aa рдХреЗ рдмрдЬрд╛рдп 0 | 1 рдЬрдм рд╡реЗ рдареАрдХ рдЗрд╕ рдореБрджреНрджреЗ

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

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ ?? рдФрд░ ?. рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЗ рд╣реЛрдиреЗ рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ Array s рддрдХ рд░реИрдВрдбрдо рдПрдХреНрд╕реЗрд╕ рдХрд░рдирд╛ рдЕрдм рдЕрдзрд┐рдХ рдмреЛрдЭрд┐рд▓ рдирд╣реАрдВ рд╣реИ ред
рд▓реЗрдХрд┐рди рд╕рд╛рде рд╣реА, рдпрд╣ рд╢рд╛рдпрдж рдХрд╣реАрдВ рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рд╣реИ

  • рдкреБрдирд░рд╛рд╡реГрддрд┐ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП .map рдпрд╛ .forEach , рдЬрд╣рд╛рдВ " T | undefined " рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдХреЙрд▓рдмреИрдХ рдХрднреА рднреА рдЖрдЙрдЯ-рдСрдл-рдмрд╛рдЙрдВрдб рдЗрдВрдбреЗрдХреНрд╕ рдкрд░ рдирд╣реАрдВ рдЪрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ) рдпрд╛
  • рд▓реВрдк рдореЗрдВ Array рдХреЛ рдкрд╛рд░ рдХрд░реЗрдВ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдХреБрдЫ рдХреЛ рд╕реНрдерд┐рд░ рд░реВрдк рд╕реЗ рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ( for...of .. рд▓рдЧрднрдЧ, _sparse arrays_ рдХреЛ рдЫреЛрдбрд╝рдХрд░, for...in рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИ)ред

рдФрд░ рд╕рд╛рде рд╣реА, рдПрдХ рдЪрд░ рдХреЛ "рд╕реБрд░рдХреНрд╖рд┐рдд рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛" рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдпрджрд┐ рдЗрд╕реЗ рдкрд╣рд▓реЗ <index> in <array> рдЪреЗрдХ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред


_Clarification_: рдореИрдВ Array<T> рдХреЗ рдореВрд▓ рдХрд╛рд░рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдЬрд┐рд╕рдореЗрдВ рдЗрдВрдбреЗрдХреНрд╕ рдкреНрд░рдХрд╛рд░ [number]: T | undefined (рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рд╕рд┐рд░реНрдл [number]: T ), рдЬреЛ рдХрд┐ рдпрд╣ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдмреЛрдЭрд┐рд▓ рд╣реЛрдЧрд╛ред
рдореЗрд░рд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЕрдм рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП undefined рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

@ vp2177 рд╕рдорд╕реНрдпрд╛ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рдирд╣реАрдВ рд╣реИрдВ (рд╣рд╛рдВ, ?. рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ), рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рд╕рдВрдХрд▓рдХ рд╣рдореЗрдВ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪреЗрддрд╛рд╡рдиреА рдирд╣реАрдВ рджреЗ рд░рд╣рд╛ рд╣реИ рдФрд░ рдЦреБрдж рдХреЛ рдкреИрд░ рдореЗрдВ рдЧреЛрд▓реА рдорд╛рд░рдиреЗ рд╕реЗ рд░реЛрдХ рд░рд╣рд╛ рд╣реИред

рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рд▓рд╛рдЗрдирд┐рдВрдЧ рдирд┐рдпрдо рдРрд╕рд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреАред

рд╣рд╛рдБ, ?. рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ

рдХреНрд╖рдорд╛ рдХрд░реЗрдВ рдореИрдВ рдЕрд╕рд╣рдордд рд╣реВрдВред ?. рдЕрдиреБрдХреНрд░рдорд┐рдд рдореВрд▓реНрдп рдкрд░ рдЧреБрдгреЛрдВ рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди рд╕рдВрдХрд▓рдХ рдЕрднреА рднреА рдХрд╣реЗрдЧрд╛ рдХрд┐ рдореВрд▓реНрдп рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЪрд╛рд╣реЗ рд╡рд╣ рд╣реИ рдпрд╛ рдирд╣реАрдВ (рджреЗрдЦреЗрдВ #35139)ред

рдЗрд╕рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЖрдк рдПрд╕реНрд▓рд┐рдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ no-unnecessary-condition рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХреНрд╕реЗрд╕ рдХреЛ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдХрдВрдкрд╛рдЗрд▓рд░ рдХрд╛ рдХрд╣рдирд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрднреА рднреА рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдЗрд╕рд╕реЗ ?. рдЕрдирд╛рд╡рд╢реНрдпрдХ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред

@martpie рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдиреЗ рдореЗрд░реА рдЯрд┐рдкреНрдкрдгреА рдХреЛ рдЧрд▓рдд рд╕рдордЭрд╛, рдПрдХ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдЬреЛрдбрд╝рд╛ред

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

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

@bradennapier Flow рдЗрдВрдбреЗрдХреНрд╕ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдореЗрдВ Array s рдХреЗ рд▓рд┐рдП T | undefined рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ (рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд╕рдорд╛рдиред)

рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рдПрдХ рдРрд╕рд╛ рддрд░реАрдХрд╛ рд╕реБрдЭрд╛рдпрд╛ рд╣реИ рдЬреЛ рд╣рд░ рдХрд┐рд╕реА рдХреЛ рдЦреБрд╢ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ рджреЛрд╣рд░рд╛рдирд╛ рдареАрдХ рд╣реИред

рдореВрд▓ рд░реВрдк рд╕реЗ рд╕реВрдЪрдХрд╛рдВрдХ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд╛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╡реНрдпрд╡рд╣рд╛рд░ рдмрджрд▓ рдЬрд╛рдПрдЧрд╛

  • рдХрд┐рд╕реА рд╕рд░рдгреА рдпрд╛ рд╡рд╕реНрддреБ рд╕реЗ рдкрдврд╝рддреЗ рд╕рдордп | undefined рд╢рд╛рдорд┐рд▓ рдХрд░реЗрдВ
  • рд▓рд┐рдЦрддреЗ рд╕рдордп | undefined рд╢рд╛рдорд┐рд▓ рди рдХрд░реЗрдВ (рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдЕрдкрдиреА рд╡рд╕реНрддреБ рдореЗрдВ рдХреЗрд╡рд▓ T рдорд╛рди рдЪрд╛рд╣рддреЗ рд╣реИрдВ)

рдкрд░рд┐рднрд╛рд╖рд╛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реЛрдЧреА:

type MaybeUndefined = {[key: string]: string};
const t: MaybeUndefined = {};

const x = t['foo'] // Has type string | undefined
t['foo'] = undefined // ERROR! 
t['foo'] = "test" // Ok

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

type AlwaysDefined = {[key: string]!: string};
const t: AlwaysDefined = {};

const x = t['foo'] // Has type string
t['foo'] = undefined // ERROR! 
t['foo'] = "test" // Ok

рдореМрдЬреВрджрд╛ рдХреЛрдб рдХреЛ рддреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рдирдпрд╛ рдХрдВрдкрд╛рдЗрд▓рд░ рд╡рд┐рдХрд▓реНрдк рдкреЗрд╢ рдХрд░рдирд╛ рднреА рдмреЗрд╣рддрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ undefined рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХрд╛ рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИ (рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ MaybeUndefined рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ)ред рдпрджрд┐ рд╡рд╣ рд╡рд┐рдХрд▓реНрдк рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рд╣реИ, рддреЛ рд╕рднреА рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдкреНрд░рдХрд╛рд░ рдРрд╕рд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддреЗ рд╣реИрдВ рдорд╛рдиреЛ ! рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдШреЛрд╖рдгрд╛ рдХреЗ рднреАрддрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реЛред

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

type MakeDefined<T> = {[K in keyof T]!: T[K]}

рдХреНрдпрд╛ рдпрд╣ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдЕрдЪреНрдЫрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рд╣реЛрдЧрд╛?

рдореБрдЭреЗ рдпрд╣ рд╡рд┐рдЪрд╛рд░ рдкрд╕рдВрдж рд╣реИ рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдкрд╣рд▓реЗ https://github.com/microsoft/TypeScript/issues/2521 рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ - рдЬреЛ рдореБрдЭреЗ рдЧрд▓рдд рдирд╣реАрдВ рд▓рдЧрддрд╛, рдореБрдЭреЗ рдЕрднреА рднреА рд╡рд┐рд╢реНрд╡рд╛рд╕ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдмрд┐рд▓реНрдХреБрд▓ рдЪрд╛рд╣рд┐рдП , рд▓реЗрдХрд┐рди рдореИрдВ ' рдореИрдВ рдЕрдкрдиреА рд╕рд╛рдВрд╕ рдирд╣реАрдВ рд░реЛрдХ рд░рд╣рд╛ рд╣реВрдБред

@bradennapier Flow рдЗрдВрдбреЗрдХреНрд╕ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдореЗрдВ Array s рдХреЗ рд▓рд┐рдП T | undefined рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ (рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд╕рдорд╛рдиред)

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

@bradennapier рдСрдмреНрдЬреЗрдХреНрдЯ рдЗрдВрдбреЗрдХреНрд╕? рдЬреИрд╕рд╛ рдХрд┐, o[4] рдЬрд╣рд╛рдВ o рдЯрд╛рдЗрдк рд╣реИ object ? рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЖрдкрдХреЛ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддрд╛...

рдкреНрд░рдХрд╛рд░ '4' рдХреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ '{}' рдкреНрд░рдХрд╛рд░ рдХреЛ рдЕрдиреБрдХреНрд░рдорд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ
рд╕рдВрдкрддреНрддрд┐ '4' рдкреНрд░рдХрд╛рд░ '{}'.ts(7053) рдкрд░ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИ

@RDGthree рд╕рднреА рдЪреАрдЬреЛрдВ рдХреЗ Microsoft рдХреЗ рд▓рд┐рдП рд╢реНрд╡реЗрдд рд╢реВрд░рд╡реАрд░ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдЖрдкрдиреЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкрд╣рд▓реЗ рдЙрддреНрддрд░ рдореЗрдВ рдореЗрд╣реЗрдЧрд╛рдЬрд╝реА рд╕реЗ рдЗрд╕ рдмрд┐рдЯ рдХреЛ рдпрд╛рдж рдХрд┐рдпрд╛:

рд╕рдЦреНрдд рдирд▓рдЪреЗрдХ рдХреЗ рдЕрдкрд╡рд╛рдж рдХреЗ рд╕рд╛рде, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдРрд╕реЗ рдЭрдВрдбреЗ рдирд╣реАрдВ рд╣реИрдВ рдЬреЛ рд╕рд┐рд╕реНрдЯрдо рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдмрджрд▓рддреЗ рд╣реИрдВред рдЭрдВрдбреЗ рдЖрдорддреМрд░ рдкрд░ рддреНрд░реБрдЯрд┐ рд░рд┐рдкреЛрд░реНрдЯрд┐рдВрдЧ рдХреЛ рд╕рдХреНрд╖рдо/рдЕрдХреНрд╖рдо рдХрд░рддреЗ рд╣реИрдВред

рдФрд░ рдереЛрдбрд╝реА рджреЗрд░ рдмрд╛рдж рд░рдпрд╛рди рдХреИрд╡рд╛рдиреБрдШ рдкрд░ рд╣реИ:

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

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

рдореИрдВ рдпрд╣рд╛рдВ рдЗрд╕рд▓рд┐рдП рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдПрдХ рд▓реЛрдХрдкреНрд░рд┐рдп рдбреАрдЯреА рдкреИрдХреЗрдЬ рдмрдирд╛рдП рд░рдЦрддрд╛ рд╣реВрдВ рдФрд░ рд▓реЛрдЧ |undefined рдХреЛ http рд╣реЗрдбрд░ рдореИрдкреНрд╕ рдЬреИрд╕реА рдЪреАрдЬреЛрдВ рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рддреЗ рд░рд╣рддреЗ рд╣реИрдВ, рдЬреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЙрдЪрд┐рдд рд╣реИ, рдЙрд╕ рдмрд┐рдЯ рдХреЛ рдЫреЛрдбрд╝рдХрд░ рдЬрд╣рд╛рдВ рдпрд╣ рд╣рд░ рдореМрдЬреВрджрд╛ рдЙрдкрдпреЛрдЧ рдХреЛ рддреЛрдбрд╝ рджреЗрдЧрд╛ , рдФрд░ рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ Object.entries() рдЬреИрд╕реЗ рдЕрдиреНрдп рд╕реБрд░рдХреНрд╖рд┐рдд рдЙрдкрдпреЛрдЧреЛрдВ рдХреЛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЦрд░рд╛рдм рдмрдирд╛рддрд╛ рд╣реИред рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд░рдЪрдирд╛рдХрд╛рд░реЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЖрдкрдХреА рд░рд╛рдп рдмреЗрд╣рддрд░ рдХреИрд╕реЗ рд╣реИ, рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рд╢рд┐рдХрд╛рдпрдд рдХрд░рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣рд╛рдВ рдЖрдкрдХрд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛ рдпреЛрдЧрджрд╛рди рд╣реИ?

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

рдПрдХ рдЖрджрд░реНрд╢ рдкрд░рд┐рджреГрд╢реНрдп рдореЗрдВ, рдореИрдВ рдПрдХ рд╕рд░рдгреА рдпрд╛ рд╡рд╕реНрддреБ рдШреЛрд╖рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдЬреИрд╕реЗ рдХрд┐, рджрд┐рдпрд╛ рдЧрдпрд╛

ts const arr: Array<T>; const n: number; const obj: {[k: K]: V}; const k: K;

рдореИрдВ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рд╕рдорд╛рдкреНрдд рдХрд░ рд╕рдХрддрд╛ рд╣реВрдБ

  • arr[n] рдкреНрд░рдХрд╛рд░ T | undefined
  • arr[n] = undefined рдПрдХ рддреНрд░реБрдЯрд┐ рд╣реИ
  • рдореЗрд░реЗ рдкрд╛рд╕ arr рдкрд░ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рддрдХ рдкрд╣реБрдВрдЪ рд╣реИ рдЬреЛ рдореБрдЭреЗ T рд░реВрдк рдореЗрдВ рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП рдорд╛рди рджреЗрддрд╛ рд╣реИ, рди рдХрд┐ T | undefined
  • obj[k] рдкреНрд░рдХрд╛рд░ V | undefined
  • obj[k] = undefined рдПрдХ рддреНрд░реБрдЯрд┐ рд╣реИ
  • рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП Object.entries() рдореБрдЭреЗ [K, V] рдЯреБрдкрд▓реНрд╕ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдХреБрдЫ рднреА рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ

рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдХреА рдЕрд╕рдордорд┐рдд рдкреНрд░рдХреГрддрд┐ рд╣реИ рдЬреЛ рдореЗрд░реЗ рд╡рд┐рдЪрд╛рд░ рдореЗрдВ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреА рд╣реИред

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

const example = (args: string[]) => {
  const [userID, duration, ...reason] = args
  // userID and duration is AUTOMATICALLy inferred to be a string here. 
 // However, if for whatever reason args is an empty array 
// userID is actually `undefined` and NOT a `string`. 

// This is valid but it should not be because userID could be undefined
userID.toUpperCase()
}

рдореИрдВ рдЗрд╕ рдореБрджреНрджреЗ рдХреЗ рдореВрд▓ рдмрд┐рдВрджреБ рд╕реЗ рдмрд╣реБрдд рджреВрд░ рдирд╣реАрдВ рдЬрд╛рдирд╛ рдЪрд╛рд╣рддрд╛, рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдлрд╝рдВрдХреНрд╢рди рддрд░реНрдХ рдХреЗ рд▓рд┐рдП рдЯрдкрд▓ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрд╕ рдЙрджрд╛рд╣рд░рдг рд╡рд┐рдзрд┐ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдПред рдпрджрд┐ рдлрд╝рдВрдХреНрд╢рди рдХреЛ ([userId, duration, ...reason]: [string, number, ...string[]]) => {} рд░реВрдк рдореЗрдВ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рддреЛ рдЖрдкрдХреЛ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрд╣рд▓реА рдмрд╛рд░ рдЪрд┐рдВрддрд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдЧреАред

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

for (let i = 0; i < array.length; i++) {
  const value = array[i] as string | undefined
}

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

const example = (args: [string | undefined, string | undefined, ...string[] | ...undefined[]]) => {

}

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

рдпрд╣ "рдХрд╛рд╕реНрдЯ" рдирд╣реАрдВ рд╣реИ, рдЬреЛ рдЖрдкрдХреЗ рдФрдкрдЪрд╛рд░рд┐рдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдареАрдХ рд╕реЗ рдЯрд╛рдЗрдк рдХрд░ рд░рд╣рд╛ рд╣реИред рдореЗрд░рд╛ рдХрд╣рдирд╛ рдерд╛ рдХрд┐ рдпрджрд┐ рдЖрдк рдЕрдкрдиреА рд╡рд┐рдзрд┐ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдЯрд╛рдЗрдк рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдХреЛрдИ рднреА рдЬреЛ рдЗрд╕реЗ рдкреБрд░рд╛рдиреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ ( args: string[] ) рдХреЗ рд╕рд╛рде рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдХреЙрд▓ рдХрд░ рд░рд╣рд╛ рдерд╛, рдЕрдм рд╕рдВрдХрд▓рди-рд╕рдордп рдкрд░ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдЧрд╛, рдЬреИрд╕рд╛ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдЪрд╛рд╣рд┐рдП , рдЬрдм рдЙрдирдХреА рдЧрд╛рд░рдВрдЯреА рдирд╣реАрдВ рд╣реИ рддрд░реНрдХреЛрдВ рдХреА рд╕рд╣реА рд╕рдВрдЦреНрдпрд╛ рдкрд╛рд╕ рдХрд░реЗрдВред рдпрджрд┐ рдЖрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рд▓реЛрдЧреЛрдВ рдХреЛ рдЖрдкрдХреА рдЬрд╝рд░реВрд░рдд рдХреЗ рд╕рднреА рддрд░реНрдХреЛрдВ рдХреЛ рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╡рд┐рдлрд▓ рд░рд╣рдиреЗ рдФрд░ рд░рди-рдЯрд╛рдЗрдо рдкрд░ рд╕реНрд╡рдпрдВ рдЙрдирдХреА рдЬрд╛рдБрдЪ рдХрд░рдиреЗ рдореЗрдВ рд╡рд┐рдлрд▓ рд░рд╣рдиреЗ рджреЗрдВ, рддреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ (args: [string?, number?, ...string[]]) рд░реВрдк рдореЗрдВ рд▓рд┐рдЦрдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИред рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕ рдореБрджреНрджреЗ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдирд╣реАрдВ рд╣реИред

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

Array Destructuring рдХреЗ рд▓рд┐рдП рдЧрд▓рдд рдЯрд╛рдЗрдкрд┐рдВрдЧ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИред

рдореИрдВ рдЗрд╕ рдореБрджреНрджреЗ рдХреЗ рдореВрд▓ рдмрд┐рдВрджреБ рд╕реЗ рдмрд╣реБрдд рджреВрд░ рдирд╣реАрдВ рдЬрд╛рдирд╛ рдЪрд╛рд╣рддрд╛

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

рдЗрд╕ рдореБрджреНрджреЗ рдХреЗ рд╕рд╛рде рдореЗрд░реА рдХреБрдЫ рдирд┐рд░рд╛рд╢рд╛рдУрдВ рдХреЛ | undefined рдХреЛ рдЙрд╕ рдкреНрд░рдХрд╛рд░ рдкрд░ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╕рд░рд▓ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рджреНрд╡рд╛рд░рд╛ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЬреЛ рдЕрдиреНрдпрдерд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдПрдХреНрд╕реЗрд╕ рд╕реЗ рдЕрдиреБрдорд╛рдирд┐рдд рд╣реЛрдЧрд╛ред рдЬреИрд╕реЗ:

const complexObject: { [key: string]: ComplexType } = { ... };
const maybeKey = 'two';

// From:
const maybeValue = complexObject[maybeKey] as
  | (Some<Complex<Type>> & Pick<WithPlentyOf, 'Utility'> & Types)
  | undefined;

// To:
const maybeValue2 = complexObject[maybeKey] as ?;

рдЗрд╕рд▓рд┐рдП рд╕рдЦреНрдд рдЯрд╛рдЗрдк-рдЪреЗрдХрд┐рдВрдЧ рдСрдкреНрдЯ-рдЗрди рд░рд╣рддреА рд╣реИред рдиреАрдЪреЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рджреЛрд╣рд░рд╛рд╡ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ (рдФрд░ рдЬрд▓реНрджреА рд╕реЗ рд╕рдорд╛рди рдорд╛рддреНрд░рд╛ рдореЗрдВ рджреГрд╢реНрдп рд╢реЛрд░ рдЬреЛрдбрд╝рддрд╛ рд╣реИ):

const maybeValue2 = complexObject[maybeKey] as
  | typeof complexObject[typeof maybeKey]
  | undefined;

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХрд╛ "рдЯрд╛рдЗрдк рдПрд╕реНрдЯрд░ рдЯреВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ" рд╕рд┐рдВрдЯреИрдХреНрд╕ ( as ? ) require-safe-index-signature-access рдПрд╕реНрд▓рд┐рдВрдЯ рдирд┐рдпрдо рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рднреА рдЖрд╕рд╛рди рдмрдирд╛ рджреЗрдЧрд╛ рдЬреЛ рдирдП рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рднреНрд░рдорд┐рдд рдирд╣реАрдВ рд╣реИред (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП "рдЖрдк рдЕрдВрдд рдореЗрдВ as ? рдЬреЛрдбрд╝рдХрд░ рд▓рд┐рдВрдЯ рддреНрд░реБрдЯрд┐ рдХреЛ рдареАрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред") рдирд┐рдпрдо рдореЗрдВ рдПрдХ рд╕реБрд░рдХреНрд╖рд┐рдд рдСрдЯреЛрдлрд┐рдХреНрд╕рд░ рднреА рд╢рд╛рдорд┐рд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдХреЗрд╡рд▓ рд╕рдВрдХрд▓рди рдХреЛ рддреЛрдбрд╝рдиреЗ рдХрд╛ рдХрд╛рд░рдг рдмрди рд╕рдХрддрд╛ рд╣реИ, рд░рдирдЯрд╛рдЗрдо рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рдХрднреА рдирд╣реАрдВред

function eh<T>(v: T): T | undefined {
    return v;
}

const arr = [0, 1, 2, 3, 4, 5];
const thing1 = arr[1]; // number
const thing2 = eh(arr[1]); // number | undefined

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

function eh<T>(v: T): T | undefined {
    return v;
}

const arr = [0, 1, 2, 3, 4, 5];
const thing1 = arr[1]; // number
const thing2 = eh(arr[1]); // number | undefined

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

рдПрдХ рдЕрдиреНрдп рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╡рд┐рдХрд▓реНрдк (рдЬреЛ рдКрдкрд░ рджрд┐рдП рдЧрдП as ? рд╕реЗ рдХрдо рдЙрдкрдпреЛрдЧ-рдорд╛рдорд▓рд╛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реЛрдЧрд╛) infer рдХреАрд╡рд░реНрдб рдХреЗ рдЙрдкрдпреЛрдЧ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЕрдиреНрдпрдерд╛-рдЕрдиреБрдорд╛рдирд┐рдд рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдкреНрд▓реЗрд╕рд╣реЛрд▓реНрдбрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЯрд╛рдЗрдк рдХрд░реЗрдВ, рдЙрджрд╛рд╣рд░рдг:

const maybeValue = complexObject[maybeKey] as infer | undefined;

рд╡рд░реНрддрдорд╛рди рдореЗрдВ infer рдШреЛрд╖рдгрд╛рдУрдВ рдХреА рдЕрдиреБрдорддрд┐ рдХреЗрд╡рд▓ рд╕рд╢рд░реНрдд рдкреНрд░рдХрд╛рд░ ( ts(1338) ) рдХреЗ extends рдЦрдВрдб рдореЗрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП infer рдХреАрд╡рд░реНрдб рдХреЛ as [...] рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдПрдХ рдЕрд░реНрде рджреЗрдирд╛

рдЕрдиреНрдп рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╕рд╛рдорд╛рдиреНрдп рд╣реЛрдиреЗ рдХреЗ рджреМрд░рд╛рди рдПрд╕реНрд▓рд┐рдВрдЯ рдирд┐рдпрдо рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ infer | undefined рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЕрднреА рднреА рдЙрдЪрд┐рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЬрд╣рд╛рдВ рдкрд░рд┐рдгрд╛рдореА рдкреНрд░рдХрд╛рд░ рдХреЛ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдкрд░рд┐рд╖реНрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

// Strange example, maybe from an unusual compiler originally written in JS:
if(someRegularExpression.test(maybeKey)) {
  /**
  * If we are inside this code block and this `maybeKey` exists on `partialObject`, 
  * we know its `regexSuccess` must also be defined, though this knowledge 
  * cannot be encoded using TypeScript's type system.
  */
  const maybeValue = partialObject[maybeKey] as (Required<Pick<infer, 'regexSuccess'>> & infer) | undefined;
  // ...
}
// Here we don't know if `regexSuccess` is defined on `maybeValue2`:
const maybevalue2 = partialObject[maybeKey] as infer | undefined;
function eh<T>(v: T): T | undefined {
    return v;
}

const arr = [0, 1, 2, 3, 4, 5];
const thing1 = arr[1]; // number
const thing2 = eh(arr[1]); // number | undefined

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

рд╣рдорд╛рд░рд╛ рд╡рд░реНрддрдорд╛рди рд╡реНрдпрд╡рд╣рд╛рд░ рдпрд╣ рд╣реИ рдХрд┐ рдЯрд╛рдЗрдк рдПрдХреНрд╕рдкреНрд░реЗрд╢рди Array<string>[number] рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рддреА рд╣реИ "рд╡рд╣ рдкреНрд░рдХрд╛рд░ рдЬреЛ рддрдм рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдЖрдк рдХрд┐рд╕реА рд╕рд░рдгреА рдХреЛ рдХрд┐рд╕реА рд╕рдВрдЦреНрдпрд╛ рд╕реЗ рдЕрдиреБрдХреНрд░рдорд┐рдд рдХрд░рддреЗ рд╣реИрдВ"ред рдЖрдкрдХреЛ рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рд╣реИ

const t: Array<string>[number] = "hello";

const t: string рд▓рд┐рдЦрдиреЗ рдХреЗ рдЧреЛрд▓ рдЪрдХреНрдХрд░ рдХреЗ рд░реВрдк рдореЗрдВред

рдЕрдЧрд░ рдпрд╣ рдЭрдВрдбрд╛ рд╣реЛрддрд╛ рддреЛ рдХреНрдпрд╛ рд╣реЛрддрд╛?

рдпрджрд┐ Array<string>[number] string | undefined , рддреЛ рдЖрдкрдХреЗ рдкрд╛рд╕ рд▓рд┐рдЦрдиреЗ рдкрд░ рдПрдХ рд╕реБрджреГрдврд╝рддрд╛ рд╕рдорд╕реНрдпрд╛ рд╣реИ:

function write<T extends Array<unknown>>(arr: T, v: T[number]) {
    arr[0] = v;
}
const arr = ["a", "b", "c"];
// Would be OK
write(arr, undefined);

рдпрджрд┐ Array<string>[number] string , рддреЛ рдЖрдкрдХреЗ рдкрд╛рд╕ рд╡рд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реИ рдЬреИрд╕рд╛ рдХрд┐ рдкрдврд╝рдиреЗ рдкрд░ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ:

function read<T extends Array<unknown>>(arr: T): T[number] {
    return arr[14];
}
const arr = ["a", "b", "c"];
// Would be OK
const k: string = read(arr);

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

рдореБрдЭреЗ рдпрд╣ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ Array<string>[number] рдХрд╛ рдЕрд░реНрде рдмрджрд▓рдирд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рдорд╕реНрдпрд╛рдЧреНрд░рд╕реНрдд рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХрд╛ рдЕрд░реНрде рдпрд╣ рд╣реЛрдЧрд╛ рдХрд┐ рдпрд╣ рдзреНрд╡рдЬ рдШреЛрд╖рдгрд╛ рдлрд╛рдЗрд▓реЛрдВ рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХреЛ рдмрджрд▓ рджреЗрддрд╛ рд╣реИред рдпрд╣ рдирд░реНрд╡рд╕ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЙрд╕ рддрд░рд╣ рдХреЗ рдЭрдВрдбреЗ рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдкрд░реНрдпрд╛рдкреНрдд рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд▓реЛрдЧ рд╕рдХреНрд╖рдо рдХрд░реЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЯрд╛рдЗрдк рдХреА рдЧрдИ рдЪреАрдЬреЛрдВ рдореЗрдВ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рд╣реЛ рд╕рдХрддреА рд╣реИрдВ / рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреА рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рд╢рд╛рдпрдж рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рд╕рдм рдХреБрдЫ рдмрдирд╛рддрд╛ рд╣реИ рджреЛрдиреЛрдВ рджрд┐рд╢рд╛рдУрдВ рдореЗрдВ рд╕рдлрд╛рдИ рд╕реЗред рдЗрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рд╕рд╛рде рд╣рдо рдЬрд┐рддрдиреЗ рдЭрдВрдбреЗ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рд╡рд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдмрд╣реБрдд рдХрдо рд╣реИ (рд╣рдо рд╣рд░ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреИрдХреЗрдЬ рдХреЗ 64 рдЕрд▓рдЧ-рдЕрд▓рдЧ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ) рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ Array<T>[number] рдХреЛ T рд░реВрдк рдореЗрдВ рдЫреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ред

@RyanCavanaugh рдЖрдкрдХреЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ write(arr, undefined) , write рдХреЙрд▓ рд╕реНрд╡реАрдХрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рд▓реЗрдХрд┐рди рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ arr[0] = v; рдЕрдм рд╕рдВрдХрд▓рд┐рдд рдирд╣реАрдВ рд╣реЛрдЧрд╛?

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

рд╕рд╛рде рд╣реА, рдЬрдмрдХрд┐ рдореБрдЭреЗ рдЕрдкрдиреЗ рд╕рд┐рд░ рдХреЗ рдКрдкрд░ рд╕реЗ рдХреЛрдИ рдареЛрд╕ рдЙрджрд╛рд╣рд░рдг рдирд╣реАрдВ рдорд┐рд▓ рд░рд╣рд╛ рд╣реИ, рдореБрдЭреЗ рдЕрдкрдиреЗ рдРрдк рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ skipLibCheck рд╕реЗрдЯ рдХрд░рдирд╛ рдкрдбрд╝рд╛ рд╣реИред рдЬрдм рднреА рдХреЛрдИ рдирдпрд╛ TS рд░реЗрдкреЛ рдмрдирд╛рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рд╣рдорд╛рд░реЗ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдореЗрдВ рдПрдХ рдорд╛рдирдХ tsconfig рд╡рд┐рдХрд▓реНрдк рд╣реЛрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЗрд╕рдХреЗ рд╕рд╛рде рдмрд╣реБрдд рд╕рд╛рд░реЗ рдореБрджреНрджреЗ рд╣реИрдВред

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

рдЕрдЧрд░ рд╕рд░рдгреА[рд╕рдВрдЦреНрдпрд╛] рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╣реИ | рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд, рддреЛ рдЖрдкрдХреЗ рдкрд╛рд╕ рд▓рд┐рдЦрдиреЗ рдкрд░ рдПрдХ рд╕реБрджреГрдврд╝рддрд╛ рд╕рдорд╕реНрдпрд╛ рд╣реИ:

рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, Array<string>[number] рд╣рдореЗрд╢рд╛ string|undefined рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рд╡рд╛рд╕реНрддрд╡рд┐рдХрддрд╛ рд╣реИ, рдЕрдЧрд░ рдореИрдВ рдХрд┐рд╕реА рднреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд░рдгреА рдореЗрдВ рдЕрдиреБрдХреНрд░рдорд┐рдд рдХрд░рддрд╛ рд╣реВрдВ, рддреЛ рдореБрдЭреЗ рдпрд╛ рддреЛ рд╕рд░рдгреА рдХрд╛ рдЖрдЗрдЯрдо рдкреНрд░рдХрд╛рд░ рдпрд╛ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рдорд┐рд▓ рдЬрд╛рдПрдЧрд╛ред рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╡рд╣рд╛рдВ рдФрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдЬрдм рддрдХ рдХрд┐ рдЖрдк рдЯреБрдкрд▓реНрд╕ рдХреЗ рд╕рд╛рде рд╕рд░рдгреА рд▓рдВрдмрд╛рдИ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реЛрдВред рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХрд╛ рдЙрджрд╛рд╣рд░рдг рдЪреЗрдХ рдЯрд╛рдЗрдк рдирд╣реАрдВ рдХрд░реЗрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рдХрд┐рд╕реА рд╕рд░рдгреА рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рдХреЛ string|undefined рдЕрд╕рд╛рдЗрди рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

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

рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рд╡реИрд╕рд╛ рд╣реА рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ рдЬреИрд╕рд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЪреАрдЬреЗрдВ рд╣реИрдВред рдХрд┐рд╕реА рднреА рд╕рд░рдгреА рдореЗрдВ рдХрднреА рднреА рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рд╣реЛрдЧреА, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЗ рдкрд╛рд╕ рд╣рдореЗрд╢рд╛ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реЛрдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реЛрдЧреАред Array<string>[number] рдХрд╛ рдкреНрд░рдХрд╛рд░ string|undefined ред рдпрд╣ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдЖрдк T рдХреЛ Array<T> , рдПрдХ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдирд╛рдордХрд░рдг рдорд╣рд╛рди рдирд╣реАрдВ): ArrayItemType<Array<string>> = string ред рдпрд╣ Record рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рдорджрдж рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП RecordValue<Record<string, number>, string> = string рдЬреИрд╕реА рдХрд┐рд╕реА рдЪреАрдЬрд╝ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред

рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣рд╛рдВ рдХреЛрдИ рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдкреВрд░рд╛ рдпрдХреАрди рд╣реИ рдХрд┐ рдореИрдВ рдЗрдВрдбреЗрдХреНрд╕ рдкрдврд╝рдиреЗ рдкрд░ рд╕реБрджреГрдврд╝рддрд╛ рдкрд╕рдВрдж рдХрд░реВрдВрдЧрд╛ред

рдореИрдВ рд╕рд░рдгрд┐рдпреЛрдВ рдкрд░ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рджреГрдврд╝рддрд╛ рд╕реЗ рдорд╣рд╕реВрд╕ рдирд╣реАрдВ рдХрд░рддрд╛, рдХреНрдпреЛрдВрдХрд┐ рдХрдИ рдЕрдиреНрдп рднрд╛рд╖рд╛рдПрдВ ("рд╕реБрд░рдХреНрд╖рд┐рдд" рдЬреИрд╕реЗ рд░рд╕реНрдЯ рд╕рд╣рд┐рдд) рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рд╕реАрдорд╛ рдЬрд╛рдВрдЪ рдХреЗ рд▓рд┐рдП рдЫреЛрдбрд╝ рджреЗрддреА рд╣реИрдВ, рдФрд░ рдЗрд╕рд▓рд┐рдП рдореИрдВ рдФрд░ рдХрдИ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕реЗ рдХрд░рдиреЗ рдХреЗ рдЖрджреА рд╣реИрдВред . рд╕рд╛рде рд╣реА, рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЗрди рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЗрд╕реЗ рдХрд╛рдлреА рд╕реНрдкрд╖реНрдЯ рдмрдирд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ _always_ foo[i] рдЬреИрд╕реЗ рдмреНрд░реИрдХреЗрдЯ рдиреЛрдЯреЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред

рдЙрд╕ рдиреЗ рдХрд╣рд╛, рдореИрдВ _do_ рдЗрд╕реЗ рд╕реНрдЯреНрд░рд┐рдВрдЧ-рдЕрдиреБрдХреНрд░рдорд┐рдд рд╡рд╕реНрддреБрдУрдВ рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рджреГрдврд╝рддрд╛ рд╕реЗ рдорд╣рд╕реВрд╕ рдХрд░рддрд╛ рд╣реВрдВ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдмрддрд╛рдирд╛ рдмрд╣реБрдд рдореБрд╢реНрдХрд┐рд▓ рд╣реИ рдХрд┐ рдХреНрдпрд╛ foo.bar рдХрд╛ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рд╕рд╣реА рд╣реИ (рдХреНрд╖реЗрддреНрд░ bar рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реЛрдиреЗ рдХреЗ рдХрд╛рд░рдг), рдпрд╛ рд╕рдВрднрд╡рддрдГ undefined (рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдХ рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ)ред рдпрджрд┐ рдпрд╣ рдорд╛рдорд▓рд╛ (рдЬреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдореВрд▓реНрдп рд╡рд╛рд▓рд╛ рд╣реИ) рд╣рд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╕рд░рдгреА рдорд╛рдорд▓рд╛ рд╕рдВрднрд╡рддрдГ рдЫреЛрдЯрд╛ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рд╢рд╛рдпрдж рдХрд░рдиреЗ рд▓рд╛рдпрдХ рднреА рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред


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

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

const foo = {
  _bar: "",
  get bar(): string {
    return this._bar;
  },
  set bar(value: string) {
    this._bar = value;
  }
}

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

рдпрджрд┐ TS рдХреЛ рд╕рднреА рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ "рдкреНрд░рд╛рдкреНрдд" рдФрд░ "рд╕реЗрдЯ" рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдирд╛ рдерд╛ (рдЬрд┐рд╕рдХреА рдХреБрдЫ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреНрд░рджрд░реНрд╢рди рд▓рд╛рдЧрддреЗрдВ рд╣реЛ рд╕рдХрддреА рд╣реИрдВ) рддреЛ рдпрд╣ рдЗрди рд╡рд┐рдЪрд┐рддреНрд░рддрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░реЗрдЧрд╛, рдФрд░ рдЗрд╕ рдореБрджреНрджреЗ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рддрдВрддреНрд░ рднреА рдкреНрд░рджрд╛рди рдХрд░реЗрдЧрд╛:

type foo = {
  [key: string]: string
}

рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрд╢реБрд▓рд┐рдкрд┐ рдмрди рдЬрд╛рдПрдЧрд╛:

type foo = {
  get [key: string](): string | undefined;
  set [key: string](string): string;
}

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

рдпрджрд┐ рдЬреЗрдирд░реЗрдЯ рдХреА рдЧрдИ рдШреЛрд╖рдгрд╛ рдлрд╛рдЗрд▓реЗрдВ рд╣рдореЗрд╢рд╛ рдкреВрд░реНрдг рдЧреЗрдЯрд░ + рд╕реЗрдЯрд░ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИрдВ, рддреЛ рдпрд╣ _only_ рд╣рд╕реНрддрд▓рд┐рдЦрд┐рдд рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реЛрдЧреАред рд╡рд░реНрддрдорд╛рди рдирд┐рдпрдореЛрдВ рдХреЛ рд╢реЗрд╖ рд╢реЙрд░реНрдЯрд╣реИрдВрдб рд╕рд┐рдВрдЯреИрдХреНрд╕ рдкрд░ рд▓рд╛рдЧреВ рдХрд░рдирд╛ _in definition files only_ рдпрд╣рд╛рдВ рдПрдХ рд╕рдорд╛рдзрд╛рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╕рдВрдЧрддрддрд╛ рдореБрджреНрджреЛрдВ рдХреЛ рд╣рд▓ рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди .ts рдлрд╝рд╛рдЗрд▓реЛрдВ рдмрдирд╛рдо .d.ts рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдкрдврд╝рдиреЗ рдХреА рдорд╛рдирд╕рд┐рдХ рд▓рд╛рдЧрдд рдХреЛ рднреА рдЬреЛрдбрд╝ рджреЗрдЧрд╛ред


рдПрдХ рддрд░рдл:

рдЕрдм рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдпрд╣ рдЧреЗрдЯрд░реНрд╕/рд╕реЗрдЯрд░реНрд╕ рдХреЗ рд╕рд╛рде рд╕реВрдХреНрд╖реНрдо рдЪреЗрддрд╛рд╡рдирд┐рдпреЛрдВ рдХреЛ _all_ рд╕рдВрдмреЛрдзрд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ:

foo.bar = "hello"

// TS assumes that bar is now a string, which technically isn't guaranteed when
// custom setters and getters are used.
const result: string = foo.bar

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

рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореБрдЭреЗ рдмрд╕ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рд╣рд░ рджреЛ рдкрдиреНрдиреЛрдВ рдореЗрдВ рдкреЙрдк рдХрд░рдирд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рд╕реЗ # 2521 рдкрд░ рдПрдХ рд▓рд┐рдВрдХ рдЫреЛрдбрд╝рдирд╛ рд╣реИред

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

рдирд╣реАрдВ! рдФрд░ рдХрдо рд╕реЗ рдХрдо (рдХреНрд▓рд┐рдХ рд▓рд┐рдВрдХ...) рдпрд╣рд╛рдВ 116 рдЕрдиреНрдп рд▓реЛрдЧ рдореБрдЭрд╕реЗ рд╕рд╣рдордд рд╣реИрдВред рдореБрдЭреЗ рдХрдо рд╕реЗ рдХрдо рдкрдврд╝рдиреЗ рдФрд░ рд▓рд┐рдЦрдиреЗ рдХрд╛ рд╡рд┐рдХрд▓реНрдк рдЕрд▓рдЧ-рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдореЗрдВ рдмрд╣реБрдд рдЦреБрд╢реА рд╣реЛрдЧреАред рдпрд╣ рдЙрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП рдЕрднреА рддрдХ рдПрдХ рдФрд░ рдмрдврд╝рд┐рдпрд╛ рдЙрдкрдпреЛрдЧ рдХрд╛ рдорд╛рдорд▓рд╛ рд╣реИред

рдХрдо рд╕реЗ рдХрдо рдкрдврд╝рдиреЗ рдФрд░ рд▓рд┐рдЦрдиреЗ рдХрд╛ рд╡рд┐рдХрд▓реНрдк рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╣реЛрдиреЗ рд╕реЗ рдореБрдЭреЗ рдмрд╣реБрдд рдЦреБрд╢реА рд╣реЛрдЧреАред рдпрд╣ рдЙрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП рд╕рд┐рд░реНрдл _рдЕрднреА рддрдХ рдПрдХ рдФрд░_ рдорд╣рд╛рди рдЙрдкрдпреЛрдЧ рдХрд╛ рдорд╛рдорд▓рд╛ рд╣реИред

рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рдЗрд░рд╛рджрд╛ рдпрд╣ рд╕рд╡рд╛рд▓ рдХрд░рдирд╛ рдерд╛ рдХрд┐ рдкрдврд╝рдиреЗ рдФрд░ рд▓рд┐рдЦрдиреЗ рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд▓рд┐рдЦрдиреЗ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП Array<string>[number]= рдЬреИрд╕рд╛ рдХреБрдЫ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП?

рдореБрдЭреЗ #2521 рдФрд░ рдЗрд╕ рдореБрджреНрджреЗ рджреЛрдиреЛрдВ рдХреЗ рд╕рдорд╛рдзрд╛рди рд╕реЗ рдЦреБрд╢реА рд╣реЛрдЧреА рдпрджрд┐ рджреЛ рдЪреАрдЬреЗрдВ рд╣реЛрддреА рд╣реИрдВ:

  • рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, #2521 . рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЧреЗрдЯрд░реНрд╕ рдФрд░ рд╕реЗрдЯрд░реНрд╕ рдХреЛ рдЕрд▓рдЧ рддрд░рд╣ рд╕реЗ рдЯрд╛рдЗрдк рдХрд░реЗрдВ
  • рдлрд┐рд░, рдЗрд╕ рдореБрджреНрджреЗ рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдПрдХ рдзреНрд╡рдЬ рдмрдирд╛рдПрдВ, рдЬреИрд╕реЗ рдХрд┐ Array<string>[number] рдХрд╛ "рд▓рд┐рдЦрдиреЗ рдХрд╛ рдкреНрд░рдХрд╛рд░" string рдЬрдмрдХрд┐ "рдкрдврд╝рдиреЗ рдХрд╛ рдкреНрд░рдХрд╛рд░" string | undefined ред

рдореИрдВ (рдЧрд▓рддреА рд╕реЗ?) рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рдкреВрд░реНрд╡ рдмрд╛рдж рдХреЗ рд▓рд┐рдП рдЖрдзрд╛рд░ рддреИрдпрд╛рд░ рдХрд░реЗрдЧрд╛, рджреЗрдЦреЗрдВ https://github.com/microsoft/TypeScript/issues/13778#issuecomment -630770947ред рдореБрдЭреЗ "рд▓рд┐рдЦрдиреЗ рдХреЗ рдкреНрд░рдХрд╛рд░" рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрдкрд╖реНрдЯ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреА рдХреЛрдИ рд╡рд┐рд╢реЗрд╖ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

@RyanCavanaugh рддреНрд╡рд░рд┐рдд рдореЗрдЯрд╛-рдкреНрд░рд╢реНрди: рдХреНрдпрд╛ рдпрд╣ рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдмрд╣рд╕ рдХрд░рдиреЗ рдФрд░ рдЕрдкрдиреА рддрд╛рдХрдд/рдХрдордЬреЛрд░рд┐рдпреЛрдВ/рд▓рд╛рдЧрддреЛрдВ рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдХреЗ рдЙрджреНрджреЗрд╢реНрдп рд╕реЗ рдПрдХ рдЕрд▓рдЧ рдореБрджреНрджреЗ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрд░реЛрдХреНрдд рдореЗрд░реЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕реБрдЭрд╛рд╡ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ (рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдкреВрд░реНрдг рд▓рд╛рдЧрдд рдЕрдиреМрдкрдЪрд╛рд░рд┐рдХ рд╣реЛрдЧреА)? рдпрд╛ рдпрд╣ рд╕рд┐рд░реНрдл рд╢реЛрд░ рдЬрд╛рд░реА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬреЛрдбрд╝ рджреЗрдЧрд╛?

@RyanCavanaugh

const t: Array<string>[number] = "hello";

const t: string рд▓рд┐рдЦрдиреЗ рдХреЗ рдЧреЛрд▓ рдЪрдХреНрдХрд░ рдХреЗ рд░реВрдк рдореЗрдВред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЯреБрдкрд▓реНрд╕ рдХреЗ рд▓рд┐рдП рднреА рдпрд╣реА рддрд░реНрдХ рд╣реИ?

const t : [string][number] = 'hello' // const t: string

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЯреБрдкрд▓реНрд╕ рд╕реАрдорд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирддреЗ рд╣реИрдВ рдФрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдВрдЦреНрдпрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП undefined рдареАрдХ рд╕реЗ рд▓реМрдЯрд╛рддреЗ рд╣реИрдВ:

const t0: [string][0] = 'hello' // ok
const t1: [string][1] = 'hello' // Type '"hello"' is not assignable to type 'undefined'.

// therefore this is already true!
const t2: [string][0|1] // string | undefined 

number рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рдХрд╛рд░реНрдп рдХреНрдпреЛрдВ рдХрд░реЗрдВрдЧреЗ?

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЗ рдкрд╛рд╕ рддрдВрддреНрд░ рдореМрдЬреВрдж рд╣реИ: https://github.com/microsoft/TypeScript/issues/38779

рдпрд╣ рдЕрддрд┐рд░рд┐рдХреНрдд рдзреНрд╡рдЬ рдЬреЛрдбрд╝реЗ рдмрд┐рдирд╛ рдореЗрд░реА рдЬрд░реВрд░рддреЛрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░реЗрдЧрд╛ред

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

https://github.com/danielnixon/eslint-plugin-total-functions

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

@RyanCavanaugh

рд╣рдордиреЗ рдпрд╣ рднреА рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдХреИрд╕реА рджрд┐рдЦрддреА рд╣реИ рдФрд░ рдореИрдВ рдЖрдкрдХреЛ рдмрддрд╛ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рд╕реБрдВрджрд░ рдирд╣реАрдВ рд╣реИ

рдмрд╕ рдЬрд┐рдЬреНрдЮрд╛рд╕реБ, рдХреНрдпрд╛ рдЖрдк рд╣рдореЗрдВ рдмрддрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдиреЙрдЯ рдмреНрдпреВрдЯреАрдлреБрд▓ рдкрд╛рд░реНрдЯ рдХреНрдпрд╛ рд╣реИ? рдпрджрд┐ рдЖрдк рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рд╕рд╛рдЭрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддреЛ рд╢рд╛рдпрдж рд╣рдо рдЗрд╕реЗ рд╕реБрд▓рдЭрд╛ рд╕рдХреЗрдВред

рдпрд╣ рдПрдХ рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдпрд╣ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

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

  • Array рдХреЛ рдЕрдиреБрдХреНрд░рдордгрд┐рдд рдХрд░рдирд╛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ undefined рд▓реМрдЯрд╛ рд╕рдХрддрд╛ рд╣реИ (рд╕реВрдЪрдХрд╛рдВрдХ рд╕реАрдорд╛ рдпрд╛ рд╡рд┐рд░рд▓ рд╕рд░рдгреА рд╕реЗ рдмрд╛рд╣рд░), рдЗрд╕рд▓рд┐рдП рд╕рд╣реА рдкрдврд╝рд╛ рдЧрдпрд╛ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ T | undefined ред
  • Array рдореЗрдВ рдПрдХ рдЗрдВрдбреЗрдХреНрд╕ рдХреЛ "рдХрд╛рд░рдг" рдХрд░рдирд╛ undefined рд╣реЛрдирд╛ рднреА delete рдХреАрд╡рд░реНрдб рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рдВрднрд╡ рд╣реИред

рдЬреИрд╕рд╛ рдХрд┐ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ 4 рд░реЛрдХрддрд╛ рд╣реИ

const a = [1, 2]
delete a[1]

a[1] = undefined рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП рднреА рдПрдХ рдЕрдЪреНрдЫрд╛ рдорд╛рдорд▓рд╛ рд╣реИред
рдпрд╣ рд╕реБрдЭрд╛рд╡ рджреЗрддрд╛ рд╣реИ рдХрд┐ Array<T>[number] рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкрдврд╝рдиреЗ рдФрд░ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдпрд╣ "рдЬрдЯрд┐рд▓" рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдпрд╣ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рд░рди-рдЯрд╛рдЗрдо рд╕рдВрднрд╛рд╡рдирд╛рдУрдВ рдХреЛ рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рд░реВрдк рд╕реЗ рдореЙрдбрд▓ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛;
рдХреМрди рд╕рд╛ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ _рдХреЗ рд▓рд┐рдП рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛, рд╣реИ рдирд╛?

| undefined рдХреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╡реНрдпрд╡рд╣рд╛рд░ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд╡рд┐рдЪрд╛рд░ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИ - рд╡реЗ рдХрднреА рднреА рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдПрдХ рд╕рдВрд╕реНрдХрд░рдг рдЬрд╛рд░реА

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореИрдВ рдмрд╛рдХреА рдкреЛрд╕реНрдЯ рд╕реЗ рд╕рд╣рдордд рд╣реВрдВред

| undefined рдХреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╡реНрдпрд╡рд╣рд╛рд░ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд╡рд┐рдЪрд╛рд░ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИ - рд╡реЗ _never_ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдПрдХ рд╕рдВрд╕реНрдХрд░рдг рдЬрд╛рд░реА рдХрд░реЗрдВрдЧреЗ рдЬреЛ рдПрдХ рдХрдВрдкрд╛рдЗрд▓рд░ рдЕрдкрдбреЗрдЯ рдХреЗ рдХрд╛рд░рдг рд╡рд┐рд░рд╛рд╕рдд рдХреЛрдб рдХреА рд▓рд╛рдЦреЛрдВ рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рд╡рд┐рд╕реНрдлреЛрдЯ рдХрд░ рджреЗрддрд╛ рд╣реИред рдЗрд╕ рддрд░рд╣ рдХрд╛ рдПрдХ рдмрджрд▓рд╛рд╡ рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рдЕрдм рддрдХ рдХреА рдЧрдИ рдХрд┐рд╕реА рднреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рд╕рдмрд╕реЗ рдЬреНрдпрд╛рджрд╛ рддреЛрдбрд╝рдиреЗ рд╡рд╛рд▓рд╛ рдмрджрд▓рд╛рд╡ рд╣реЛрдЧрд╛ред

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореИрдВ рдмрд╛рдХреА рдкреЛрд╕реНрдЯ рд╕реЗ рд╕рд╣рдордд рд╣реВрдВред

рдирд╣реАрдВ рдЕрдЧрд░ рдпрд╣ рдПрдХ рд╡рд┐рдиреНрдпрд╛рд╕ рд╡рд┐рдХрд▓реНрдк рд╣реИред

рдирд╣реАрдВ рдЕрдЧрд░ рдпрд╣ рдПрдХ рд╡рд┐рдиреНрдпрд╛рд╕ рд╡рд┐рдХрд▓реНрдк рд╣реИред

рдпрд╣ рдЙрдЪрд┐рдд рд╣реИ, рд▓реЗрдХрд┐рди рдХрдо рд╕реЗ рдХрдо рдореИрдВ рдПрдХ рд▓рдВрдмреА "рд▓реАрдб рдЗрди" рдЕрд╡рдзрд┐ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реВрдВ рдЬрд╣рд╛рдВ рдпрд╣ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдмрдВрдж рд╣реИ, рд▓реЛрдЧреЛрдВ рдХреЛ рд╡рд┐рд░рд╛рд╕рдд рдХреЛрдб рдХреЛ рдЪрд╛рд▓реВ рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕рдордп (6 рдорд╣реАрдиреЗ? рдПрдХ рд╡рд░реНрд╖? рдЕрдзрд┐рдХ?) -рдЪреВрдХ рдЬрд╛рдирд╛ред рдЬреИрд╕реЗ, v4.0 рдореЗрдВ рдзреНрд╡рдЬ рдЬреЛрдбрд╝реЗрдВ, рдЗрд╕реЗ v5.0 рдореЗрдВ рдСрди-рдмрд╛рдп-рдбрд┐рдлреЙрд▓реНрдЯ рдкрд░ рд╕реЗрдЯ рдХрд░реЗрдВ, рдЙрд╕ рддрд░рд╣ рдХреА рдЪреАрдЬред

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

| undefined рдХреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╡реНрдпрд╡рд╣рд╛рд░ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд╡рд┐рдЪрд╛рд░ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИ - рд╡реЗ _never_ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдПрдХ рд╕рдВрд╕реНрдХрд░рдг рдЬрд╛рд░реА рдХрд░реЗрдВрдЧреЗ рдЬреЛ рдПрдХ рдХрдВрдкрд╛рдЗрд▓рд░ рдЕрдкрдбреЗрдЯ рдХреЗ рдХрд╛рд░рдг рд╡рд┐рд░рд╛рд╕рдд рдХреЛрдб рдХреА рд▓рд╛рдЦреЛрдВ рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рд╡рд┐рд╕реНрдлреЛрдЯ рдХрд░ рджреЗрддрд╛ рд╣реИред рдЗрд╕ рддрд░рд╣ рдХрд╛ рдПрдХ рдмрджрд▓рд╛рд╡ рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рдЕрдм рддрдХ рдХреА рдЧрдИ рдХрд┐рд╕реА рднреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рд╕рдмрд╕реЗ рдЬреНрдпрд╛рджрд╛ рддреЛрдбрд╝рдиреЗ рд╡рд╛рд▓рд╛ рдмрджрд▓рд╛рд╡ рд╣реЛрдЧрд╛ред

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореИрдВ рдмрд╛рдХреА рдкреЛрд╕реНрдЯ рд╕реЗ рд╕рд╣рдордд рд╣реВрдВред

рдЖрдкрдХреА рдмрд╛рдд рдкрд░ @thw0rted рдореИрдВрдиреЗ рдпрд╣рд╛рдВ рдПрдХ рд╕рдордЭреМрддрд╛ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд┐рдпрд╛: https://github.com/microsoft/TypeScript/issues/38779

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

рдХреЗ рд▓рд┐рдП "strict" рд╕реНрдерд┐рд░рддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ Array<T> рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП "a list of type T that is infinitly long with no gaps" рдХрднреА рднреА рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рдкрдбрд╝рддреА рдЖрдк tuples рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП ..

рд╣рд╛рдВ, рдЗрд╕рдореЗрдВ рдХреБрдЫ рдХрдорд┐рдпрд╛рдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдПрдХ рдмрд╛рд░ рдлрд┐рд░ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рдмреАрдЪ рдПрдХ рдЙрдЪрд┐рдд "рд╕рдордЭреМрддрд╛" рд╣реИ рдЬрд┐рд╕реЗ рдХрднреА рднреА рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ рдФрд░ рдареАрдХ рдЙрд╕реА рддрд░рд╣ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬреИрд╕рд╛ рд╣рдо рдпрд╣рд╛рдВ рдкреВрдЫ рд░рд╣реЗ рд╣реИрдВред

рдЕрдЧрд░ рдЖрдк рд╕рд╣рдордд рд╣реИрдВ рддреЛ рдЕрдкрд╡реЛрдЯ рдХрд░реЗрдВ

рдореИрдВ рдЕрд╕рд╣рдордд рд╣реВрдВ рдХрд┐ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдмрд┐рд▓реНрдХреБрд▓ рдирдП рд╡рд┐рдХрд▓реНрдк/рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

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

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

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

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

@RyanCavanaugh

рдЖрдкрдХреЗ рд╕рд╛рд░рд╛рдВрд╢ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред

рдЕрднреВрддрдкреВрд░реНрд╡ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреА рд╡рдХрд╛рд▓рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣рд╛рдВ рдЖрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдХреГрдкрдпрд╛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рджреАрд░реНрдШрдХрд╛рд▓рд┐рдХ рдбрд┐рдЬрд╛рдЗрди рд▓рдХреНрд╖реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдЕрдзрд┐рдХ рдЬреБрдбрд╝рд╛рд╡ рд░рдЦреЗрдВ

рдореИрдВрдиреЗ рдЕрдкрдиреА рдЯрд┐рдкреНрдкрдгреА рд╣рдЯрд╛ рджреА рд╣реИ рдФрд░ рдпрджрд┐ рдЖрдк рдЪрд╛рд╣реЗрдВ рддреЛ рдореИрдВ рдЗрд╕ рдЯрд┐рдкреНрдкрдгреА рдХреЛ рднреА рд╣рдЯрд╛ рд╕рдХрддрд╛ рд╣реВрдВред рд▓реЗрдХрд┐рди рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рдкрд╣рд▓реЗ рд▓рдХреНрд╖реНрдп рдХреЛ рдХреИрд╕реЗ рд╕рдордЭреЗрдВ:

1. рд╕рд╛рдВрдЦреНрдпрд┐рдХреАрдп рд░реВрдк рд╕реЗ рдЙрди рдирд┐рд░реНрдорд╛рдгреЛрдВ рдХреА рдкрд╣рдЪрд╛рди рдХрд░реЗрдВ рдЬрд┐рдирдореЗрдВ рддреНрд░реБрдЯрд┐ рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИред

(рд╕реНрд░реЛрдд: https://github.com/Microsoft/TypeScript/wiki/TypeScript-Design-Goals)

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

рдареАрдХ рд╣реИ рдЕрдм рдЬрдм рдЖрдк рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рд╕реЗ рд░рдЦрддреЗ рд╣реИрдВ рддреЛ рдореБрдЭреЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ

рдмреЗрд╢рдХ, рдЖрдк рдореБрдЦреНрдп рдЕрдиреБрд░рдХреНрд╖рдХреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИрдВ рдФрд░ рдЯреАрдПрд╕ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдФрд░ рдЯреАрдо рдФрд░ рдпреЛрдЧрджрд╛рдирдХрд░реНрддрд╛рдУрдВ рдХреЛ рдзрдиреНрдпрд╡рд╛рдж рджреЗрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдпрд╣ рдЕрдм рдЖрдкрдХреЗ рдмрд╕ рдХреА рдмрд╛рдд рдирд╣реАрдВ рд╣реИред рдЕрдкрд╡реЛрдЯ рдХреА рддреБрд▓рдирд╛ рдХрд░реЗрдВ: 365 рдбрд╛рдЙрдирд╡реЛрдЯреНрд╕ рдХреЗ рд╕рд╛рде: 6! рдХреЗрд╡рд▓ рем! рдпрд╣ рдЯрд╛рдЗрдкрд╕реЗрдлреНрдЯреА рдХреА рднрд╛рд░реА рдорд╛рдВрдЧ рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИред

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

рдХреНрдпрд╛ рдЖрдк рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ ts-ignore рд╕рд╛рде рдХреНрдпрд╛ рдЧрд▓рдд рд╣реИ, рдЗрд╕ рдкрд░ рдереЛрдбрд╝рд╛ рдФрд░ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? рдореЗрд░рд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЗрд╕реЗ рдХреЛрдбрдореЙрдб рдЬреИрд╕реЗ рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рд╡рд░реНрддрдорд╛рди рдХреЛрдб рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдирд╣реАрдВ рдмрджрд▓рддрд╛ рд╣реИред рдмреЗрд╢рдХ рдпрд╣ рд╕реБрдВрджрд░ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдареАрдХ рд╣реИ, рдпрд╣ рдмрд┐рдирд╛ рдЭрдВрдбреЗ рдХреЗ рдЗрд╕ рдмрджрд▓рд╛рд╡ рдХреЛ рдкреЗрд╢ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рд╕рдВрднрд╛рд╡рд┐рдд рддрд░реАрдХрд╛ рд╣реИред

рдЖрдк ts рдХреЗ рдкреИрдЪ рдХрд┐рдП рдЧрдП рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдкреНрд░рдХрд╛рд╢рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рд╕реЛрдЪрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП 4.0.0-breaking ? рдпрд╣ рд╕рдВрдШрд░реНрд╖реЛрдВ рдкрд░ рдХреБрдЫ (рдмрд╣реБрдд?) рдХрд╛рдо рдкреЗрд╢ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕рднреА рдХреЛ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдФрд░ рдХреЛрдб рдЖрдзрд╛рд░ рддреИрдпрд╛рд░ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ (рди рдХреЗрд╡рд▓ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдЕрдиреБрд░реЛрдз рдХреЗ рд▓рд┐рдП)ред рдпрд╣ рдХреБрдЫ рд╕реАрдорд┐рдд рд╕рдордпрд╛рд╡рдзрд┐ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреИрд╕реЗ 3-6 рдорд╣реАрдиреЗред рд╣рдо рдкрд╣рд▓реЗ рд╣реЛрдВрдЧреЗ, рдЬреЛ рдЗрд╕ рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред

рдЕрдм рдФрд░ред рдЕрдкрд╡реЛрдЯ рдХреА рддреБрд▓рдирд╛ рдХрд░реЗрдВ: 365 рдбрд╛рдЙрдирд╡реЛрдЯреНрд╕ рдХреЗ рд╕рд╛рде: 6! рдХреЗрд╡рд▓ рем! рдпрд╣ рдЯрд╛рдЗрдкрд╕реЗрдлреНрдЯреА рдХреА рднрд╛рд░реА рдорд╛рдВрдЧ рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИред
- @ рдмреЗрд╕реЛрдиреЛрд╡

рд╣рд╛-рд╣рд╛ред
рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореИрдВ @RyanCavanaugh рдХреА рдкреВрд░реА рдкреЛрд╕реНрдЯ рд╕реЗ рд╕рд╣рдордд рд╣реВрдВ .. рд▓реЗрдХрд┐рди тАж рдЪрд▓реЛ ..
рд╡рд╣рд╛рдБ рдХреНрдпрд╛ рд▓рд╛рдЦреЛрдВ рд╣реИрдВ? рдЯреАрдПрд╕ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╡рд╣рд╛рдБ рд╕реЗ рдмрд╛рд╣рд░ рд╣реИрдВ?!? рейремрел рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рдЗрд╕ рдереНрд░реЗрдб рдореЗрдВ рдЯрд┐рдкреНрдкрдгреА рдФрд░ рдЕрдкрд╡реЛрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ...

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

@RyanCavanaugh рд╣рдореЗрдВ рдЗрд╕рдХреЗ рд╕рд╛рде рдЦреЗрд▓рдиреЗ рдХрд╛ рдореМрдХрд╛ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд-рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рджред рдореИрдВ рдЗрд╕реЗ рдПрдХ рдмрд╣реБрдд рдЫреЛрдЯреЗ (~ 105 ts (x) рдлрд╛рдЗрд▓реЛрдВ) рдХреЛрдб рдмреЗрд╕ рдХреЗ рдЦрд┐рд▓рд╛рдл рдЪрд▓рд╛рддрд╛ рд╣реВрдВ рдФрд░ рдЗрд╕рдХреЗ рд╕рд╛рде рдереЛрдбрд╝рд╛ рд╕рд╛ рдЦреЗрд▓рд╛ред рдореБрдЭреЗ рдХреЛрдИ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдореБрджреНрджрд╛ рдирд╣реАрдВ рдорд┐рд▓рд╛ред рдПрдХ рдкрдВрдХреНрддрд┐ рдЬрд┐рд╕реЗ рд╕реЗ рдмрджрд▓ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛:

const refHtml = useRef(useMemo(() => document.getElementsByTagName('html')[0], []))

рдкреНрд░рддрд┐:

const refHtml = useRef(useMemo(() => document.getElementsByTagName('html')[0] ?? null, []))

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

@ lonewarrior556 рдпрд╣ 60 рдЧреБрдирд╛ рдЕрдзрд┐рдХ рд╣реИ рдФрд░ рдпрджрд┐ рдЖрдк upvotes рджреНрд╡рд╛рд░рд╛ рдХреНрд░рдордмрджреНрдз рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдпрд╣ рдкрд╣рд▓реЗ рдкреГрд╖реНрда рдкрд░ рд╣реИ :)

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

рдЖрдкрдХреЗ рдкрд╛рд╕ рдкрд╢реНрдЪрдЧрд╛рдореА рд╕рдВрдЧрддрддрд╛ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдСрдкреНрдЯ рдЗрди/рдЖрдЙрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╝реНрд▓реИрдЧ рднреА рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред

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

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

рдПрдХ рдзреНрд╡рдЬ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЧрд▓рдд рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣реИ, рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рд╕рдВрдпреЛрдЬрди рдХреЗ рдХрд╛рд░рдг
рд╕рдВрдХрдЯред рд╣рдореЗрдВ рдмрд╕ рдЗрд╕ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ v5... рдЙрд╕ рддрд░рд╣ рдХрд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╣рдирд╛ рдЪрд╛рд╣рд┐рдП
рдкрд░реАрдХреНрд╖рдг рдпреЛрдЧреНрдп рд╕рдВрдпреЛрдЬрдиреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ 2^N рд╕реЗ рдХреЗрд╡рд▓ N рдореЗрдВ рдмрджрд▓ рджреЗрддрд╛ рд╣реИ...

рд╢рдирд┐рд╡рд╛рд░, 15 рдЕрдЧрд╕реНрдд 2020 рдХреЛ 15:56 рдмрдЬреЗ, рдорд╛рдЗрдХрд▓ рдмрд░реНрдХрдореИрди рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди @github.com
рд▓рд┐рдЦрд╛ рдерд╛:

@MatthiasKunnen https://github.com/MatthiasKunnen рдЕрдЧрд░ рдпрд╣ рдХреБрдЫ рдереЗ
рдЫреЛрдЯреЗ рдХрд┐рдирд╛рд░реЗ рдХреЗ рдорд╛рдорд▓реЗ рдХреА рд╕реБрд╡рд┐рдзрд╛ рддреЛ рдореИрдВ рд╕рд╣рдордд рд╣реВрдБ рдХрд┐ рдпрд╣ рдПрдХ рд╡реНрдпрд╡рд╣рд╛рд░реНрдп рдХрд╛рд░рдг рдирд╣реАрдВ рд╣реИ
рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдЭрдВрдбрд╛ рдЬреЛрдбрд╝реЗрдВред рд▓реЗрдХрд┐рди рдбрд╛рдпрд░реЗрдХреНрдЯ рдРрд░реЗ рдПрдХреНрд╕реЗрд╕ рдХреЛрдб рдореЗрдВ рдХрд╛рдлреА рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИ
рдЕрдХреНрд╕рд░, рдФрд░ рджреЛрдиреЛрдВ рдкреНрд░рдХрд╛рд░ рдХреА рдкреНрд░рдгрд╛рд▓реА рдореЗрдВ рдПрдХ рдЪрдордХрджрд╛рд░ рдЫреЗрдж рд╣реИ рдФрд░ рдПрдХ
рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рд╡рд░реНрддрди рдХреЛ рддреЛрдбрд╝рдирд╛, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдзреНрд╡рдЬ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред

-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдиреЗ рдЗрд╕ рдереНрд░реЗрдб рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реА рд╣реИред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рд╕реАрдзреЗ рдЙрддреНрддрд░ рджреЗрдВ, рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/microsoft/TypeScript/issues/13778#issuecomment-674408067 ,
рдпрд╛ рд╕рджрд╕реНрдпрддрд╛ рд╕рдорд╛рдкреНрдд рдХрд░реЗрдВ
https://github.com/notifications/unsubscribe-auth/AAADY5AXEY65S5HDGNGIPZDSA2O3FANCNFSM4C6KEKAA
.

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

рдЕрдЧрд▓реЗ резреж рд▓реЛрдЧреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬреЛ рдпрд╣рд╛рдВ рдЯрд┐рдкреНрдкрдгреА рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдкреАрдЖрд░ #рейрепрелремреж рдХреЗ рдорд╕реМрджреЗ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░реЗрдВ?

рдпрд╣ рдмрд╣реБрдд рдХрд╖реНрдЯрдкреНрд░рдж рд╣реИ рдпрджрд┐ рдЖрдк ESLint рдХреЗ @typescript-eslint/no-unnecessary-condition рдирд┐рдпрдо рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рддрдм рд╕рднреА рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╢рд┐рдХрд╛рдпрдд рдХрд░рддрд╛ рд╣реИ

if (some_array[i] === undefined) {

рдпрд╣ рд╕реЛрдЪрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдЕрдирд╛рд╡рд╢реНрдпрдХ рд╢рд░реНрдд рд╣реИ (рдХреНрдпреЛрдВрдХрд┐ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╣рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╣реИ!) рд▓реЗрдХрд┐рди рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИред рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдкрдиреЗ рдХреЛрдбрдмреЗрд╕ рдореЗрдВ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition рдЬреЛрдбрд╝рдирд╛ рдирд╣реАрдВ рдЪрд╛рд╣рддрд╛ред

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

if (some_array[?i] === undefined) {

(рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рд╕реБрдЭрд╛рд╡; рд╡рд┐рдХрд▓реНрдк рд╕реНрд╡рд╛рдЧрдд рд╣реИ)

@Timmmm рдХреГрдкрдпрд╛ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдХреА рдЧрдИ рдЯрд┐рдкреНрдкрдгреА рдХреЗ рдареАрдХ рдКрдкрд░ рдкрдврд╝реЗрдВред рдПрдХ рдРрд╕рд╛ рдирд┐рд░реНрдорд╛рдг рд╣реИ рдЬрд┐рд╕реЗ рдЖрдк рдЖрдЬрдорд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЗрд╕ рд╕реБрдЭрд╛рд╡ рдХреЗ рдПрдХ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ -- рдпрджрд┐ рдпрд╣ рдЖрдкрдХреА eslint рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХрд░рддрд╛ рд╣реИ рддреЛ рдЖрдк рд╣рдореЗрдВ рд╡рд╣рд╛рдВ рдмрддрд╛ рд╕рдХрддреЗ рд╣реИрдВред

@ the0rted рдореИрдВрдиреЗ рд╡рд╣ рдЯрд┐рдкреНрдкрдгреА рдкрдврд╝реАред рдпрд╣ рдореЗрд░реЗ рд╕реБрдЭрд╛рд╡ рдХреЗ рдПрдХ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рдкрдврд╝рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рдЬрдм рдореИрдВрдиреЗ "рдпрд╣" рд╕реБрдЭрд╛рд╡ рдХрд╣рд╛ рддреЛ рдореЗрд░рд╛ рдорддрд▓рдм рдУрдкреА рдореЗрдВ рдХреНрд╖рдорддрд╛ рдерд╛, рдпрд╛рдиреА array_of_T[i] рдХреЛ T | undefined ред рдореИрдВ рджреЗрдЦрддрд╛ рд╣реВрдВ рдХрд┐ рдЖрдк рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЗрдВрдбреЗрдХреНрд╕ рдСрдкрд░реЗрдЯрд░ рдХреЛ "рд╢рд╛рдпрдж рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд" рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкреВрдЫ рд░рд╣реЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрдк рд░рдпрд╛рди рдХреЗ рдкреАрдЖрд░ рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдЧреА, рдХреНрдпреЛрдВрдХрд┐ рд╕рднреА рдЗрдВрдбреЗрдХреНрд╕ рдСрдкрд░реЗрдЯрд░ "рд╢рд╛рдпрдж рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд" рд╣реЛрдВрдЧреЗред . рдХреНрдпрд╛ рдпрд╣ рдЖрдкрдХреА рдЬрд░реВрд░рдд рдХреЛ рдкреВрд░рд╛ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛?

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

рдЗрд╕рд▓рд┐рдП рдореИрдВ рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╕реБрдЭрд╛рд╡ рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдЬрд╛рд╣рд┐рд░ рддреМрд░ рдкрд░ рд▓реЛрдЧ рдЗрд╕рд╕реЗ рдирдлрд░рдд рдХрд░рддреЗ рд╣реИрдВред :-/

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

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

рдореИрдВрдиреЗ рдКрдкрд░ рдЗрд╕рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдирд╣реАрдВ рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдПрдХрдмрд╛рд░рдЧреА рдУрд╡рд░рд░рд╛рдЗрдб рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рд╣реИ: if ((some_array[i] as MyType | undefined) === undefined) ред рдпрд╣ рдПрдХ рдирдП рдЖрд╢реБрд▓рд┐рдкрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдРрд╕рд╛ рдирд┐рд░реНрдорд╛рдг рдирд╣реАрдВ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЖрдкрдХреЛ рдмрд╣реБрдд рдмрд╛рд░ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

_рдореВрд▓ рд░реВрдк рд╕реЗ @osyrisrblx рджреНрд╡рд╛рд░рд╛ https://github.com/microsoft/TypeScript/issues/40435#issuecomment -690017567_ рдореЗрдВ рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛

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

рд╢рд╛рдпрдж !: рд╣рдореЗрд╢рд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ?

interface X {
    [index: string]!: number; // -> number
}

interface Y {
    [index: string]: number; // -> number | undefined
}

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

рдЖрдк рдЗрд╕реЗ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ 4.1 рдмреАрдЯрд╛ рдореЗрдВ рдЖрдЬрд╝рдорд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд▓реНрдж рд╣реА рдЖ рд░рд╣рд╛ рд╣реИ тДв (рдпрд╛ рдЖрдЬ рд░рд╛рдд рдХреА рд░рд╛рдд рдЕрдЧрд░ рдЖрдкрдХреЛ рдЕрднреА рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ! ЁЯЩВ)

рдХреНрд╖рдорд╛ рдХрд░реЗрдВ рдпрджрд┐ рдпрд╣ рдкрд╣рд▓реЗ рдкреЗрд╢ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдХреНрдпрд╛ {[index: string]?: number} // -> number | undefined рд╕рдорд░реНрдерд┐рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ? рдпрд╣ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╡реИрдХрд▓реНрдкрд┐рдХ рдЧреБрдг рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реИ - рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдЖрд╡рд╢реНрдпрдХ, рд╕рдВрднрд╡рддрдГ "?" рдХреЗ рд╕рд╛рде рдЕрдкрд░рд┐рднрд╛рд╖рд┐рддред

4.1 рдореЗрдВ рдХрдВрдкрд╛рдЗрд▓рд░ рд╡рд┐рдХрд▓реНрдк рдЕрдЪреНрдЫрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдзрд┐рдХ рджрд╛рдиреЗрджрд╛рд░ рдирд┐рдпрдВрддреНрд░рдг рднреА рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред

рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рдЕрдкрдиреЗ рд░реЗрдкреЛ рдореЗрдВ рдЖрдЬрд╝рдорд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ (рдореБрдЭреЗ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рд╕рдордп рд▓рдЧрд╛):

  1. рдЯрд╛рдЗрдкрдкреНрд░рддрд┐ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ yarn (add|upgrade) typescript@next
  2. рдЭрдВрдбрд╛ рдЬреЛрдбрд╝реЗрдВ (рдореЗрд░реЗ рд▓рд┐рдП tsconfig.json рдореЗрдВ) "noUncheckedIndexedAccess": true

рдЗрд╕ рдирд┐рдпрдо рдХреЛ рдЕрдкрдиреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдкрд░ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ, рдореБрдЭреЗ рдпрд╣ рджрд┐рд▓рдЪрд╕реНрдк рддреНрд░реБрдЯрд┐ рдорд┐рд▓реА:

type MyRecord = { a: number; b: string };

declare const myRecord: MyRecord;

declare const key: 'a' | 'b';
const value = myRecord[key]; // string | number тЬЕ

// тЭМ Unexpected error
// Type 'MyRecord[Key] | undefined' is not assignable to type 'MyRecord[Key]'
const fn = <Key extends keyof MyRecord>(key: Key): MyRecord[Key] => myRecord[key];

рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдореБрдЭреЗ myRecord[key] рдкреНрд░рдХрд╛рд░ MyRecord[Key] | undefined рд╡рд╛рдкрд╕ рдЖрдиреЗ рдХреА рдЙрдореНрдореАрдж рдирд╣реАрдВ рдереА, рдХреНрдпреЛрдВрдХрд┐ key keyof MyRecord рд╕реАрдорд┐рдд рд╣реИред

рдЕрджреНрдпрддрди : рджрд╛рдпрд░ рдореБрджреНрджрд╛ https://github.com/microsoft/TypeScript/issues/40666

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рд╢рд╛рдпрдж рдПрдХ рдмрдЧ/рдирд┐рд░реАрдХреНрд╖рдг рд╣реИ!

рдЗрд╕ рдирд┐рдпрдо рдХреЛ рдЕрдкрдиреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдкрд░ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ, рдореБрдЭреЗ рдпрд╣ рджрд┐рд▓рдЪрд╕реНрдк рддреНрд░реБрдЯрд┐ рдорд┐рд▓реА:

type MyRecord = { a: number; b: string };

declare const myRecord: MyRecord;

declare const key: 'a' | 'b';
const value = myRecord[key]; // string | number тЬЕ

// тЭМ Unexpected error
// Type 'MyRecord[Key] | undefined' is not assignable to type 'MyRecord[Key]'
const fn = <Key extends keyof MyRecord>(key: Key): MyRecord[Key] => myRecord[key];

рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдореБрдЭреЗ myRecord[key] рдкреНрд░рдХрд╛рд░ MyRecord[Key] | undefined рд╡рд╛рдкрд╕ рдЖрдиреЗ рдХреА рдЙрдореНрдореАрдж рдирд╣реАрдВ рдереА, рдХреНрдпреЛрдВрдХрд┐ key keyof MyRecord рд╕реАрдорд┐рдд рд╣реИред

рдореИрдВ рдХрд╣реВрдВрдЧрд╛ рдХрд┐ рдпрд╣ рдПрдХ рдмрдЧ рд╣реИред рдореВрд▓ рд░реВрдк рд╕реЗ рдпрджрд┐ keyof Type рдХреЗрд╡рд▓ рд╕реНрдЯреНрд░рд┐рдВрдЧ/рд╕рдВрдЦреНрдпрд╛ рд╢рд╛рдмреНрджрд┐рдХ рдкреНрд░рдХрд╛рд░ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ (рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ string рдпрд╛ number ), рддреЛ Type[Key] рдЬрд╣рд╛рдВ Key extends keyof Type рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ undefined рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

#13195 рд╕реЗ рдХреНрд░реЙрд╕-рд▓рд┐рдВрдХрд┐рдВрдЧ, рдЬреЛ "рдпрд╣рд╛рдВ рдХреЛрдИ рд╕рдВрдкрддреНрддрд┐ рдирд╣реАрдВ рд╣реИ" рдФрд░ "рдпрд╣рд╛рдВ рдПрдХ рд╕рдВрдкрддреНрддрд┐ рд╣реИ рд▓реЗрдХрд┐рди рдпрд╣ undefined " рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдФрд░ рд╕рдорд╛рдирддрд╛ рдХреЛ рднреА рджреЗрдЦрддрд╛ рд╣реИред

рдбрд┐рдЬрд╝рд╛рдЗрди рдХреА рд╕реАрдорд╛рдУрдВ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдХреБрдЫ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рдпрд╣рд╛рдБ рдЯреНрд░реИрдХ рдХрд░рдирд╛

  • #41612

рдПрдлрд╡рд╛рдИрдЖрдИ: рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдХреЛрдбрдмреЗрд╕ рдореЗрдВ рджреЛ рдмрдЧ рдкрдХрдбрд╝реЗ рдЗрд╕ рдзреНрд╡рдЬ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдмрд╣реБрдд рдмрдбрд╝рд╛ рдзрдиреНрдпрд╡рд╛рдж!
рдпрд╣ рдереЛрдбрд╝рд╛ рдХрд╖реНрдЯрдкреНрд░рдж рд╣реИ рдХрд┐ рдЬрд╛рдБрдЪ arr.length > 0 рд░рдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИ arr[0] , рд▓реЗрдХрд┐рди рд╡рд╣ рдПрдХ рдЫреЛрдЯреА рд╕реА рдЕрд╕реБрд╡рд┐рдзрд╛ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реБрд░рдХреНрд╖рд╛ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ, IMO (рдореИрдВ tsc рдЦреБрд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рдВрдЪ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдиреЗ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ) рд╣реИред

@rubenlg рдореИрдВ arr.length рдмрд╛рд░реЗ рдореЗрдВ рд╕рд╣рдордд рд╣реВрдВред рдкрд╣рд▓реЗ рддрддреНрд╡ рдХреА рдЬрд╛рдБрдЪ рдХреЗ рд▓рд┐рдП рдореИрдВрдиреЗ рдЕрдкрдирд╛ рдХреЛрдб рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрд╛ рд╣реИ рдЬреИрд╕реЗ

const firstEl = arr[0];
if (firstEl !== undefined) {
  ...
}

рд▓реЗрдХрд┐рди рдХреБрдЫ рдЬрдЧрд╣реЗрдВ рдРрд╕реА рднреА рд╣реИрдВ рдЬрд╣рд╛рдВ рд╣рдо if (arr.length > 2) рдпрд╛ рдЗрд╕рд╕реЗ рдЬреНрдпрд╛рджрд╛ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдереЛрдбрд╝рд╛ рдЕрдЬреАрдм рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЪреЗрдХрд┐рдВрдЧ .length рд╡реИрд╕реЗ рднреА рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реЛрдЧреА рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рдЗрд╕реЗ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

const a: number[] = [];

a.length = 1;

if (a.length > 0) {
    const b: number = a[0];
    console.log(b);
}

undefined рдкреНрд░рд┐рдВрдЯ рдХрд░рддрд╛ рд╣реИред

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЪреЗрдХрд┐рдВрдЧ .length рд╡реИрд╕реЗ рднреА рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реЛрдЧреА рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рдЗрд╕реЗ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

const a: number[] = [];

a.length = 1;

if (a.length > 0) {
    const b: number = a[0];
    console.log(b);
}

undefined рдкреНрд░рд┐рдВрдЯ рдХрд░рддрд╛ рд╣реИред

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

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

const a: number[] = [1]
if (a.length > 0) {
    a.pop();
    console.log(a[0])
}
рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

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

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

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

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

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

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