Typescript: ์ œ์•ˆ: ์ธ๋ฑ์Šค ์„œ๋ช…์— undefined๋ฅผ ํฌํ•จํ•˜๋Š” ์˜ต์…˜

์— ๋งŒ๋“  2017๋…„ 01์›” 31์ผ  ยท  242์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: microsoft/TypeScript

์—…๋ฐ์ดํŠธ : ๋‚ด ์ตœ์‹  ์ œ์•ˆ์€ https://github.com/Microsoft/TypeScript/issues/13778#issuecomment -406316164 ์˜๊ฒฌ

strictNullChecks ํ™œ์„ฑํ™”๋˜๋ฉด TypeScript๋Š” ์ธ๋ฑ์Šค ์„œ๋ช…(์˜ˆ: ๊ฐœ์ฒด ๋˜๋Š” ๋ฐฐ์—ด)์— undefined ๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ž˜ ์•Œ๋ ค์ง„ ๊ฒฝ๊ณ ์ด๋ฉฐ ์—ฌ๋Ÿฌ ๋ฌธ์ œ, ์ฆ‰ https://github.com/Microsoft/TypeScript/issues/9235 , https://github.com/Microsoft/TypeScript/issues/13161 , https://github ์—์„œ ๋…ผ์˜๋˜์—ˆ์Šต๋‹ˆ๋‹ค https://github.com/Microsoft/TypeScript/pull/7140#issuecomment -192606629.

์˜ˆ์‹œ:

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

๊ทธ๋Ÿฌ๋‚˜ ์œ„์˜ ๋ฌธ์ œ๋ฅผ ์ฝ์œผ๋ฉด ๋งŽ์€ TypeScript ์‚ฌ์šฉ์ž๊ฐ€ ๊ทธ๋ ‡์ง€ ์•Š๊ธฐ๋ฅผ ๋ฐ”๋ผ๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค. ๋ฌผ๋ก  ์ธ๋ฑ์Šค ์„œ๋ช…์— undefined ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฉด ์ฝ”๋“œ์— ํ›จ์”ฌ ๋” ๋งŽ์€ ๋ณดํ˜ธ๊ฐ€ ํ•„์š”ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ผ๋ถ€์˜ ๊ฒฝ์šฐ ์ด๋Š” ์œ ํ˜• ์•ˆ์ „์„ฑ์„ ๋†’์ด๊ธฐ ์œ„ํ•ด ํ—ˆ์šฉ๋˜๋Š” ์ ˆ์ถฉ์•ˆ์ž…๋‹ˆ๋‹ค.

undefined ํฌํ•จํ•œ ์ƒ‰์ธ ์„œ๋ช…์˜ ์˜ˆ:

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

์ด ๋™์ž‘์ด strictNullChecks ์œ„์— ์ถ”๊ฐ€ ์ปดํŒŒ์ผ๋Ÿฌ ์˜ต์…˜์œผ๋กœ ๊ฐ„์ฃผ๋  ์ˆ˜ ์žˆ๋Š”์ง€ ์•Œ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฐฉ์‹์œผ๋กœ ์šฐ๋ฆฌ๋Š” ๋ชจ๋“  ์‚ฌ์šฉ์ž ๊ทธ๋ฃน์„ ๋งŒ์กฑ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: ์ธ๋ฑ์Šค ์„œ๋ช…์— undefined๊ฐ€ ์žˆ๊ฑฐ๋‚˜ ์—†๋Š” ์—„๊ฒฉํ•œ null ๊ฒ€์‚ฌ๋ฅผ ์›ํ•˜๋Š” ์‚ฌ์šฉ์ž.

Committed Suggestion

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

์šฐ๋ฆฌ๋Š” ์‹ค์ œ๋กœ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์ด ํ”Œ๋ž˜๊ทธ๋กœ ์–ด๋–ค ์ด์ ์„ ์–ป์„ ์ˆ˜ ์žˆ์„์ง€์— ๋Œ€ํ•ด ๋งค์šฐ ํšŒ์˜์ ์ž…๋‹ˆ๋‹ค. ์ง€๋„ ๋ฐ ์ง€๋„์™€ ์œ ์‚ฌํ•œ ์‚ฌ๋ฌผ์€ ์ด๋ฏธ ์ •์˜ ์‚ฌ์ดํŠธ์—์„œ | undefined ์— ์˜ตํŠธ์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

TypeScript์˜ ๋ชฉํ‘œ ์ค‘ ํ•˜๋‚˜๋Š” ํŠน์ • ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ์ž๊ฐ€ ๊ธฐ์–ตํ•˜๊ฑฐ๋‚˜ ์•Œ๋„๋ก ์˜์กดํ•˜๊ธฐ๋ณด๋‹ค "์ปดํŒŒ์ผ" ์‹œ๊ฐ„์— ์˜ค๋ฅ˜๋ฅผ ํฌ์ฐฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ฒƒ ์•„๋‹™๋‹ˆ๊นŒ? ์ด๊ฒƒ์€ ๊ทธ ๋ชฉํ‘œ์— ์–ด๊ธ‹๋‚˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ถฉ๋Œ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ฌด์–ธ๊ฐ€๋ฅผ ์š”๊ตฌํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋งŽ์€ ๊ธฐ๋Šฅ์— ๋Œ€ํ•ด์„œ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž๊ฐ€ ํ•ญ์ƒ x๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. TypeScript์˜ ๋ชฉํ‘œ๋Š” (์•„๋งˆ๋„) ์ž‘์—…์„ ๋” ์‰ฝ๊ฒŒ ๋งŒ๋“ค๊ณ  ์ด๋Ÿฌํ•œ ๊ฒƒ๋“ค์„ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ธฐ์กด ์ฝ”๋“œ์—์„œ strictNullChecks ๋ฅผ ํ™œ์„ฑํ™”ํ•˜๊ณ  ์ด๋ฏธ ๋น„๊ต๋ฅผ ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด ๋ฒ„๊ทธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์™„์ „ํžˆ ์ƒˆ๋กœ์šด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ–ˆ๋‹ค๋ฉด ์•„๋งˆ ์—ฌ๊ธฐ์„œ ๋ฌธ์ œ๋ฅผ ๊นจ๋‹ซ์ง€ ๋ชปํ–ˆ์„ ๊ฒƒ์ด๊ณ (์œ ํ˜• ์‹œ์Šคํ…œ์€ ํ•ญ์ƒ ๊ฐ’์„ ์–ป๊ณ  ์žˆ๋‹ค๊ณ  ๋‚˜์—๊ฒŒ ๋งํ•˜๊ณ  ์žˆ์Œ) ๋Ÿฐํƒ€์ž„ ์˜ค๋ฅ˜๋กœ ๋๋‚ฌ์Šต๋‹ˆ๋‹ค. TS ๊ฐœ๋ฐœ์ž๊ฐ€ | undefined ๋ชจ๋“  ์ง€๋„๋ฅผ ์„ ์–ธํ•ด์•ผ ํ•œ๋‹ค๋Š” ์‚ฌ์‹ค์„ ๊ธฐ์–ต(๋˜๋Š” ๋” ๋‚˜์˜๊ฒŒ๋Š” ์•Œ๊ณ  ์žˆ์Œ)ํ•˜๋Š” ๊ฒƒ์€ TypeScript๊ฐ€ ์‚ฌ๋žŒ๋“ค์ด ์‹ค์ œ๋กœ ์›ํ•˜๋Š” ๊ฒƒ์„ ์ˆ˜ํ–‰ํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋Š๊ปด์ง‘๋‹ˆ๋‹ค.

๋ชจ๋“  242 ๋Œ“๊ธ€

strictNullChecks๋ฅผ ์ œ์™ธํ•˜๊ณ  ์œ ํ˜• ์‹œ์Šคํ…œ ๋™์ž‘์„ ๋ณ€๊ฒฝํ•˜๋Š” ํ”Œ๋ž˜๊ทธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ํ”Œ๋ž˜๊ทธ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์˜ค๋ฅ˜ ๋ณด๊ณ ๋ฅผ ํ™œ์„ฑํ™”/๋น„ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค.
| undefined ๋ชจ๋“  ์ธ๋ฑ์„œ๋ฅผ ์ •์˜ํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์‚ฌ์šฉ์ž ์ •์˜ ๋ฒ„์ „์„ ํ•ญ์ƒ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ์ƒ๋Œ€๋กœ ์ž‘๋™ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@mhegazy ํฅ๋ฏธ๋กœ์šด ์•„์ด๋””์–ด์ž…๋‹ˆ๋‹ค. ๋ฐฐ์—ด/๊ฐ์ฒด์˜ ํ˜•์‹ ์„œ๋ช…์„ ์žฌ์ •์˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ง€์นจ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

์ด interface Array<T> ์— lib.d.ts . ๋‹ค๋ฅธ ์ธ๋ฑ์‹ฑ ์„œ๋ช…๋„ ์ฐพ๊ธฐ ์œ„ํ•ด ์ •๊ทœ ํ‘œํ˜„์‹ \[\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 ํŒŒ์ผ์„ ๋ถ„๊ธฐํ•˜๊ณ  ์œ ์ง€ ๊ด€๋ฆฌํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด ๊ธฐ๋Šฅ์ด ์–ด๋–ค ์ข…๋ฅ˜์˜ ์˜ต์…˜์„ ์ฆ‰์‹œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์„ ๋งŒํผ ์ถฉ๋ถ„ํžˆ ์š”๊ตฌ๋˜๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ ๋กœ ES6 ์ปฌ๋ ‰์…˜( Map / Set )์˜ get ๋ฉ”์„œ๋“œ์— ๋Œ€ํ•œ ํ˜•์‹ ์„œ๋ช…์ด Array ๋•Œ T | undefined ๋ฐ˜ํ™˜ํ•œ๋‹ค๋Š” ์ ์€ ํฅ๋ฏธ๋กญ์Šต๋‹ˆ๋‹ค Map 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์™€ ์œ ์‚ฌํ•œ ๋™์ž‘์„ ์‹œํ–‰ํ•˜๋Š” ๊ฒƒ์€ ์Šน๋ฆฌ์ฒ˜๋Ÿผ ๋ณด์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์„ ๋ง›์žˆ๊ฒŒ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด์„œ๋Š” CFA์™€ ํƒ€์ž… ๊ฐ€๋“œ๋ฅผ ์ƒ๋‹นํžˆ ๊ฐœ์„ ํ•ด์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์ž์‹ ์˜ lib.d.ts๋ฅผ ์ˆ˜์ •ํ•˜๊ณ  ์ž์‹ ์˜ ์ฝ”๋“œ์—์„œ ๋ชจ๋“  ๋‹ค์šด์ŠคํŠธ๋ฆผ ์ค‘๋‹จ์„ ์ˆ˜์ •ํ•˜๊ณ  ์ด๊ฒƒ์ด ๊ฐ€์น˜ ์ œ์•ˆ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Œ์„ ๋ณด์—ฌ์ฃผ๊ธฐ ์œ„ํ•ด ์ „์ฒด diff๊ฐ€ ์–ด๋–ป๊ฒŒ ๋ณด์ด๋Š”์ง€ ๋ณด์—ฌ์ฃผ๊ณ  ์‹ถ๋‹ค๋ฉด ์šฐ๋ฆฌ๋Š” ํ•ด๋‹น ๋ฐ์ดํ„ฐ์— ์—ด๋ ค ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜๋Š” ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ์ ‘๋ฏธ์‚ฌ ! ๋” ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์–ดํ•˜์ง€๋งŒ ์•„์ง ๊ทธ๋Ÿด ๊ธฐํšŒ๊ฐ€ ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ์ด ํ”Œ๋ž˜๊ทธ๊ฐ€ ์˜ต์…˜์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ์‹ค์ œ๋กœ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์ด ํ”Œ๋ž˜๊ทธ๋กœ ์–ด๋–ค ์ด์ ์„ ์–ป์„ ์ˆ˜ ์žˆ์„์ง€์— ๋Œ€ํ•ด ๋งค์šฐ ํšŒ์˜์ ์ž…๋‹ˆ๋‹ค. ์ง€๋„ ๋ฐ ์ง€๋„์™€ ์œ ์‚ฌํ•œ ์‚ฌ๋ฌผ์€ ์ด๋ฏธ ์ •์˜ ์‚ฌ์ดํŠธ์—์„œ | undefined ์— ์˜ตํŠธ์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

TypeScript์˜ ๋ชฉํ‘œ ์ค‘ ํ•˜๋‚˜๋Š” ํŠน์ • ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ์ž๊ฐ€ ๊ธฐ์–ตํ•˜๊ฑฐ๋‚˜ ์•Œ๋„๋ก ์˜์กดํ•˜๊ธฐ๋ณด๋‹ค "์ปดํŒŒ์ผ" ์‹œ๊ฐ„์— ์˜ค๋ฅ˜๋ฅผ ํฌ์ฐฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ฒƒ ์•„๋‹™๋‹ˆ๊นŒ? ์ด๊ฒƒ์€ ๊ทธ ๋ชฉํ‘œ์— ์–ด๊ธ‹๋‚˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ถฉ๋Œ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ฌด์–ธ๊ฐ€๋ฅผ ์š”๊ตฌํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋งŽ์€ ๊ธฐ๋Šฅ์— ๋Œ€ํ•ด์„œ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž๊ฐ€ ํ•ญ์ƒ x๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. TypeScript์˜ ๋ชฉํ‘œ๋Š” (์•„๋งˆ๋„) ์ž‘์—…์„ ๋” ์‰ฝ๊ฒŒ ๋งŒ๋“ค๊ณ  ์ด๋Ÿฌํ•œ ๊ฒƒ๋“ค์„ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ธฐ์กด ์ฝ”๋“œ์—์„œ strictNullChecks ๋ฅผ ํ™œ์„ฑํ™”ํ•˜๊ณ  ์ด๋ฏธ ๋น„๊ต๋ฅผ ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด ๋ฒ„๊ทธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์™„์ „ํžˆ ์ƒˆ๋กœ์šด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ–ˆ๋‹ค๋ฉด ์•„๋งˆ ์—ฌ๊ธฐ์„œ ๋ฌธ์ œ๋ฅผ ๊นจ๋‹ซ์ง€ ๋ชปํ–ˆ์„ ๊ฒƒ์ด๊ณ (์œ ํ˜• ์‹œ์Šคํ…œ์€ ํ•ญ์ƒ ๊ฐ’์„ ์–ป๊ณ  ์žˆ๋‹ค๊ณ  ๋‚˜์—๊ฒŒ ๋งํ•˜๊ณ  ์žˆ์Œ) ๋Ÿฐํƒ€์ž„ ์˜ค๋ฅ˜๋กœ ๋๋‚ฌ์Šต๋‹ˆ๋‹ค. TS ๊ฐœ๋ฐœ์ž๊ฐ€ | undefined ๋ชจ๋“  ์ง€๋„๋ฅผ ์„ ์–ธํ•ด์•ผ ํ•œ๋‹ค๋Š” ์‚ฌ์‹ค์„ ๊ธฐ์–ต(๋˜๋Š” ๋” ๋‚˜์˜๊ฒŒ๋Š” ์•Œ๊ณ  ์žˆ์Œ)ํ•˜๋Š” ๊ฒƒ์€ TypeScript๊ฐ€ ์‚ฌ๋žŒ๋“ค์ด ์‹ค์ œ๋กœ ์›ํ•˜๋Š” ๊ฒƒ์„ ์ˆ˜ํ–‰ํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋Š๊ปด์ง‘๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ์‹ค์ œ๋กœ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์ด ํ”Œ๋ž˜๊ทธ๋กœ ์–ด๋–ค ์ด์ ์„ ์–ป์„ ์ˆ˜ ์žˆ์„์ง€์— ๋Œ€ํ•ด ๋งค์šฐ ํšŒ์˜์ ์ž…๋‹ˆ๋‹ค. ์ง€๋„ ๋ฐ ์ง€๋„์™€ ์œ ์‚ฌํ•œ ์‚ฌ๋ฌผ์€ ์ด๋ฏธ ์˜ตํŠธ์ธ ๊ฐ€๋Šฅ | ์ •์˜ ์‚ฌ์ดํŠธ์—์„œ ์ •์˜๋˜์ง€ ์•Š์Œ
TypeScript์˜ ๋ชฉํ‘œ ์ค‘ ํ•˜๋‚˜๋Š” ํŠน์ • ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ์ž๊ฐ€ ๊ธฐ์–ตํ•˜๊ฑฐ๋‚˜ ์•Œ๋„๋ก ์˜์กดํ•˜๊ธฐ๋ณด๋‹ค "์ปดํŒŒ์ผ" ์‹œ๊ฐ„์— ์˜ค๋ฅ˜๋ฅผ ํฌ์ฐฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ฒƒ ์•„๋‹™๋‹ˆ๊นŒ?

์‹ค์ œ๋กœ ๋ชฉํ‘œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

1) ์˜ค๋ฅ˜๊ฐ€ ๋  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋Š” ๊ตฌ์„ฑ์„ ์ •์ ์œผ๋กœ ์‹๋ณ„ํ•ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ ๋…ผ์˜๋˜๋Š” ๊ฒƒ์€ ์˜ค๋ฅ˜ ๊ฐ€๋Šฅ์„ฑ(TypeScript ํŒ€์˜ ์˜๊ฒฌ์œผ๋กœ๋Š” ๋‚ฎ์Œ)๊ณผ ์–ธ์–ด์˜ ์ผ๋ฐ˜์ ์ธ ์ƒ์‚ฐ์  ์œ ์šฉ์„ฑ์ž…๋‹ˆ๋‹ค. CFA์— ๋Œ€ํ•œ ์ดˆ๊ธฐ ๋ณ€๊ฒฝ ์‚ฌํ•ญ ์ค‘ ์ผ๋ถ€๋Š” ์ด๋Ÿฌํ•œ ์‚ฌํ•ญ์„ ๋ณด๋‹ค ์ง€๋Šฅ์ ์œผ๋กœ ๊ฒฐ์ •ํ•˜๊ธฐ ์œ„ํ•ด ๋œ ๊ฒฝ๊ณ„ ํ•˜๊ฑฐ๋‚˜ CFA ๋ถ„์„์„ ๊ฐœ์„ ํ•˜๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

TypeScript ํŒ€์˜ ์งˆ๋ฌธ์€ ์ด๋Ÿฌํ•œ ์—„๊ฒฉํ•จ์˜ ์˜ˆ๋ฅผ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด ์—„๊ฒฉํ•œ ์ •ํ™•์„ฑ์„ ์ฃผ์žฅํ•˜๋Š” ๋Œ€์‹  ์ผ๋ฐ˜์ ์ธ ์‚ฌ์šฉ์—์„œ ์‹ค์ œ๋กœ ๋ณดํ˜ธํ•ด์•ผ ํ•˜๋Š” ์˜ค๋ฅ˜๋ฅผ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด ๋Œ“๊ธ€ 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 ์ด๋ด ๋‚œ ๊ทธ๋ƒฅ @ # % # ๊ทธ๊ฒƒ์„ ํ…Œ์ŠคํŠธ ING ๋ณด์ผ์ง€๋ผ๋„. ์ด์ œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ์Šต๊ด€์ด ์ƒ๊ฒผ์Šต๋‹ˆ๋‹ค. ์–ด๋ฆฌ์„๊ฒŒ ๋Š๊ปด์ง‘๋‹ˆ๋‹ค.

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);
  }
}

TypeScript๋Š” "์ด๋ด, ๊ทธ ์ธ๋ฑ์Šค ํ‘œํ˜„์‹์€ | 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 ๋ฅผ ๋ˆ„๋ฅด๋˜ ๋•Œ del y ๋ฅผ ๋ˆ„๋ฅด๋Š” ๋ฐฉ๋ฒ•์„ ๋งค์šฐ ๋นจ๋ฆฌ ๋ฐฐ์šฐ๊ณ  ์ค‘์š”ํ•œ ํ•ญ๋ชฉ์„ ์‚ญ์ œํ•˜์ง€ ์•Š์„ ํ™•๋ฅ ์ด ์‚ฌ์ „ ์„ค์ •์œผ๋กœ ์žฌ์„ค์ •๋ฉ๋‹ˆ๋‹ค. -๋Œ€ํ™” ๊ธฐ์ค€์„ . ํŒŒ์ผ์ด ํœด์ง€ํ†ต์œผ๋กœ ์ด๋™ํ•˜์ง€ ์•Š์„ ๋•Œ ํŒŒ์ผ์„ ์‚ญ์ œํ•  ๋•Œ๋งŒ ๋Œ€ํ™” ์ƒ์ž๊ฐ€ ํ‘œ์‹œ๋œ๋‹ค๋ฉด ์ด์ œ ์˜๋ฏธ ์žˆ๋Š” ์•ˆ์ „์„ ํ™•๋ณดํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์šฐ๋ฆฌ๋Š” ์•„๋ฌด ์ƒ๊ฐ์ด ์—†๋‹ค (๋„ ์šฐ๋ฆฌ ์ˆ˜) ๊ฐœ์ฒด์˜ ํ‚ค๋Š” ๊ทธ๋ ‡๊ฒŒ ๋ณด์—ฌ์ฃผ๋Š”, ์•ˆ์ „์ธ์ง€ ์•„๋‹Œ์ง€ "๋‹น์‹ ์€ ๋‹น์‹ ์ด ์ธ๋ฑ์Šค์— ํ•ด๋‹น ๊ฐœ์ฒด๋ฅผ ์›ํ•˜๋Š”๊ฑฐ์•ผ?" ํ•  ๋•Œ๋งˆ๋‹ค ๋Œ€ํ™” ์ƒ์ž๊ฐ€ ํ‘œ์‹œ๋˜์ง€ ์•Š๋Š” ๊ฒƒ๋ณด๋‹ค ๋” ๋‚˜์€ ์†๋„๋กœ ๋ฒ„๊ทธ๋ฅผ ์ฐพ์„ ๊ฐ€๋Šฅ์„ฑ์ด ์—†์Šต๋‹ˆ๋‹ค.

์˜ค๋ฅ˜ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋Š” ๊ตฌ์„ฑ์„ ์ •์ ์œผ๋กœ ์‹๋ณ„ํ•ฉ๋‹ˆ๋‹ค.

์•„๋งˆ๋„ ์ด๊ฒƒ์€ " ๋‹ค๋ฅธ ๊ฒƒ๋ณด๋‹ค ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ๋” ๋†’์€ ๊ตฌ๋ฌธ์„ ์ •์ ์œผ๋กœ ์‹๋ณ„ํ•ฉ๋‹ˆ๋‹ค."๋ผ๊ณ  ์ˆ˜์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. : ์œ™ํฌ :. ๋ณธ์งˆ์ ์œผ๋กœ " / ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•  ๋•Œ * ๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. make * a warning์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?"์™€ ๊ฐ™์€ ๋ฒ„๊ทธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ๋ฅผ ๊ธฐ์–ต

์ดํ•ดํ•˜์ง€๋งŒ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚œ ์ƒ‰์ธ์€ ์‹ค์ œ์ ์ด๊ณ  ์ผ๋ฐ˜์ ์ธ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ์‚ฌ๋žŒ๋“ค์ด ์ด๊ฒƒ์„ ํ•  ์ˆ˜ ์—†๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ฐฐ์—ด์„ ์—ด๊ฑฐํ•˜๋„๋ก ๊ฐ•์š”ํ•˜๋Š” ๊ฒƒ์€ ๋‚˜์œ ์ผ์ด ์•„๋‹™๋‹ˆ๋‹ค.

! ์ €๋„ ์‚ฌ์‹ค ์‹ซ์–ดํ•ฉ๋‹ˆ๋‹ค. ๋ˆ„๊ตฐ๊ฐ€ ์™€์„œ ๊ฐ€์ •์ด ๋ฌดํšจ๊ฐ€ ๋˜๋„๋ก ๋ณ€๊ฒฝํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”? ์›์ ์œผ๋กœ ๋Œ์•„๊ฐ”์Šต๋‹ˆ๋‹ค(์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์žก์•„์•ผ ํ•˜๋Š” ์ž ์žฌ์ ์ธ ๋Ÿฐํƒ€์ž„ ์˜ค๋ฅ˜). ์œ ํ˜•์— ๋Œ€ํ•ด ๊ฑฐ์ง“๋ง์„ ํ•˜๊ฑฐ๋‚˜ ! ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์— ์˜์กดํ•˜์ง€ ์•Š๋Š” ์•ˆ์ „ํ•œ ๋ฐฐ์—ด์„ ์—ด๊ฑฐํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(์˜ˆ: array.forEach(i => console.log(i.name) ์™€ ๊ฐ™์€ ๊ฒƒ์„ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๊นŒ?).

์ด๋ฏธ ์ฝ”๋“œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์œ ํ˜•์„ ์ขํ˜€ ์ด๋ก ์ƒ์œผ๋กœ๋Š” ์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ์— | undefined ๋ฅผ ์ œ๊ฑฐํ•˜์—ฌ ๋‘ ๊ฐ€์ง€ ์žฅ์ ์„ ๋ชจ๋‘ ์ œ๊ณตํ•˜๋Š” ์•ˆ์ „ํ•œ ์œ ํ˜•์„ ์ขํž ์ˆ˜ ์žˆ๋Š” ํŒจํ„ด์„ ์ฐพ์„ ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๊นŒ? ์œ ํšจํ•œ ์š”์†Œ์— ์•ก์„ธ์Šคํ•˜๊ณ  ์žˆ์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์„ ์ปดํŒŒ์ผ๋Ÿฌ์— ์‰ฝ๊ฒŒ ์ „๋‹ฌํ•  ์ˆ˜ ์—†๋‹ค๋ฉด ๋ณด์ฆ์ด ์œ ํšจํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ๋‚˜์ค‘์— ์‹ค์ˆ˜๋กœ ์‰ฝ๊ฒŒ ๊นจ์งˆ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ฃผ์žฅํ•ฉ๋‹ˆ๋‹ค.

์ฆ‰, ๋‚˜๋Š” ํ•˜๋‚˜์˜ ํ”„๋กœ์ ํŠธ์—์„œ๋งŒ TS๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ ๊ถ๊ทน์ ์œผ๋กœ Dart๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜๋˜๋ฏ€๋กœ ๋‚˜์—๊ฒŒ ์‹ค์งˆ์ ์ธ ์ฐจ์ด๋ฅผ ๋งŒ๋“ค์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์†Œํ”„ํŠธ์›จ์–ด์˜ ์ผ๋ฐ˜์ ์ธ ํ’ˆ์งˆ์ด ์ข‹์ง€ ์•Š๊ณ  ํŽธ์˜์ƒ ๋ฌด์‹œ๋˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๋Š” ์˜ค๋ฅ˜๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋  ๊ธฐํšŒ๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด ์•ˆํƒ€๊น์Šต๋‹ˆ๋‹ค. ์œ ํ˜• ์‹œ์Šคํ…œ์ด ๊ฒฌ๊ณ ํ•˜๊ฒŒ ๋งŒ๋“ค์–ด์ง€๊ณ  ์ด๋Ÿฌํ•œ ๊ตฌ๋ฉ์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š” ๋ฐฉ์‹์œผ๋กœ ์ผ๋ฐ˜์ ์ธ ์„ฑ๊ฐ€์‹ฌ์ด ํ•ด๊ฒฐ๋  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค.

์–ด์จŒ๋“ , ๊ทธ๊ฒƒ์€ ๋‹จ์ง€ ๋‚ด 2 ์„ผํŠธ์ž…๋‹ˆ๋‹ค.. ๋‚˜๋Š” ์ด๊ฒƒ์„ ๋Œ๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์–ด๋””์—์„œ ์™”๋Š”์ง€ ์ดํ•ดํ•˜๊ณ  ๋‹น์‹ ์ด ๋‚˜๋ณด๋‹ค ํ›จ์”ฌ ๋” ๋‚˜์€ ๊ฒฐ์ •์„ ๋‚ด๋ฆด ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค :-)

๋ช‡ ๊ฐ€์ง€ ๊ณ ๋ คํ•ด์•ผ ํ•  ์‚ฌํ•ญ์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์š”์†Œ ์ˆ˜๋ฅผ ๊ณ ๋ คํ•˜์—ฌ ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๋ฐฐ์—ด์„ ๋ฐ˜๋ณตํ•˜๊ธฐ ์œ„ํ•œ ๋งŽ์€ ํŒจํ„ด์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐฐ์—ด์˜ ์ธ๋ฑ์Šค์— ๋ฌด์ž‘์œ„๋กœ ์•ก์„ธ์Šคํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•œ ํŒจํ„ด์ด์ง€๋งŒ ์‹ค์ œ๋กœ๋Š” ๋งค์šฐ ๋“œ๋ฌธ ํŒจํ„ด์ด๋ฉฐ ์ •์  ์˜ค๋ฅ˜๊ฐ€ ์•„๋‹ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค . ๋ฐ˜๋ณตํ•˜๋Š” ํ˜„๋Œ€์ ์ธ ๋ฐฉ๋ฒ•์ด ์žˆ์ง€๋งŒ ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

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

์—ฌ๋ถ„์˜ ์–ด๋ ˆ์ด๊ฐ€ ํ”ํ•˜์ง€ ์•Š๋‹ค๊ณ  ๊ฐ€์ •ํ•œ๋‹ค๋ฉด(๊ทธ๋“ค์€) value ๊ฐ€ | undefined ๊ฐ€ ๋˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์€ ๊ฑฐ์˜ ๋„์›€์ด ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์•ผ์ƒ์—์„œ ์ด๊ฒƒ์ด ์œ„ํ—˜ํ•œ(๊ทธ๋ฆฌ๊ณ  ์˜ค๋ฅ˜์ผ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋Š”) ์ผ๋ฐ˜์ ์ธ ํŒจํ„ด์ด ์žˆ๋Š” ๊ฒฝ์šฐ TypeScript๊ฐ€ ์ด๋ฅผ ๊ณ ๋ คํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ํŒจํ„ด์€ ์ •์˜๋˜์ง€ ์•Š์€ ์ธ๋ฑ์Šค ์•ก์„ธ์Šค๋Š” ๋ถ„๋ช…ํžˆ ์ƒ์‚ฐ์„ฑ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” ๊ฒƒ์œผ๋กœ ์ง€์ ๋œ ๋Œ€๋กœ ์ž ์žฌ์ ์œผ๋กœ ์œ ์šฉํ•œ ์ƒํ™ฉ์— ์žˆ๋Š” ๊ฒฝ์šฐ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด์ „์— CFA๋ฅผ ๊ฐœ์„ ํ•˜์—ฌ ๊ฐ’์˜ ์ƒํ˜ธ ์˜์กด์„ฑ์„ ํ‘œํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค(์˜ˆ: Array.prototype.length๋Š” ์ธ๋ฑ์Šค ๊ฐ’๊ณผ ๊ด€๋ จ๋จ). ๊ทธ๋ž˜์„œ index out of bounds์™€ ๊ฐ™์€ ๊ฒƒ๋“ค์ด ์ •์ ์œผ๋กœ ๋ถ„์„๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ถ„๋ช…ํžˆ ๊ทธ๊ฒƒ์€ ๋‚ด๊ฐ€ ์ดํ•ดํ•˜๊ณ  ์‹ถ์ง€ ์•Š์€ ๋ชจ๋“  ์ข…๋ฅ˜์˜ ๊ทน๋‹จ์ ์ธ ๊ฒฝ์šฐ์™€ ๊ณ ๋ ค ์‚ฌํ•ญ์œผ๋กœ ์ด๋ฃจ์–ด์ง„ ์ค‘์š”ํ•œ ์ž‘์—…์ž…๋‹ˆ๋‹ค(Anders๊ฐ€ ์ด์™€ ๊ฐ™์€ ์ผ์— ์‹์€๋•€์„ ํ˜๋ฆฌ๋ฉฐ ๊นจ์–ด๋‚  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์ง€๋งŒ).

๋”ฐ๋ผ์„œ ํŠธ๋ ˆ์ด๋“œ ์˜คํ”„๊ฐ€ ๋ฉ๋‹ˆ๋‹ค... CFA ๊ฐœ์„  ์—†์ด ์ฝ”๋“œ์˜ 90%๋ฅผ ์ฒญ์–ด ๋กœ ๋ณต์žกํ•˜๊ฒŒ ๋งŒ๋“ค์–ด ์ž ์žฌ์ ์œผ๋กœ 10%์˜ ๋ถˆ๋Ÿ‰ ์ฝ”๋“œ ๋ฅผ ์žก์•„๋ƒ…๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์•ˆ์ •์„ฑ์— ๋Œ€ํ•œ ์ž์ฒด ๊ฒฐ๊ณผ์™€ ๋‹ค์‹œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์ฃผ์š” CFA ๊ฐœ์„ ์— ํˆฌ์žํ•˜์—ฌ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ๋ฅผ ์ฐพ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

TypeScript๊ฐ€ ์šฐ๋ฆฌ๋ฅผ ์šฐ๋ฆฌ ์ž์‹ ์œผ๋กœ๋ถ€ํ„ฐ ๊ตฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€ ์•„์ฃผ ๋งŽ์Šต๋‹ˆ๋‹ค.

์ด ๋ชจ๋“  ์ดˆ์ ์€ ๋ฐฐ์—ด์— ์žˆ์œผ๋ฉฐ ๊ฑฐ๊ธฐ์—์„œ ๋ฌธ์ œ๊ฐ€ ๋  ๊ฐ€๋Šฅ์„ฑ์ด ์ ๋‹ค๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ œ๊ธฐ๋œ ์›๋ž˜ ๋ฌธ์ œ์˜ ๋Œ€๋ถ€๋ถ„์€(๋‚ด ๊ฒƒ๊ณผ ๊ฐ™์€) ์ผ๋ฐ˜์ ์ธ ๊ฒฝ์šฐ๊ฐ€ ํ•ญ์ƒ ์กด์žฌํ•˜๋Š” ํ‚ค๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š๋Š” ๋งต์— ๊ด€ํ•œ ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

์ด ๋ชจ๋“  ์ดˆ์ ์€ ๋ฐฐ์—ด์— ์žˆ์œผ๋ฉฐ ๊ฑฐ๊ธฐ์—์„œ ๋ฌธ์ œ๊ฐ€ ๋  ๊ฐ€๋Šฅ์„ฑ์ด ์ ๋‹ค๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ œ๊ธฐ๋œ ์›๋ž˜ ๋ฌธ์ œ์˜ ๋Œ€๋ถ€๋ถ„์€(๋‚ด ๊ฒƒ๊ณผ ๊ฐ™์€) ์ผ๋ฐ˜์ ์ธ ๊ฒฝ์šฐ๊ฐ€ ํ•ญ์ƒ ์กด์žฌํ•˜๋Š” ํ‚ค๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š๋Š” ๋งต์— ๊ด€ํ•œ ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ๊ท€ํ•˜์˜ ์œ ํ˜•์ธ ๊ฒฝ์šฐ ์ƒ‰์ธ ์„œ๋ช…์— | undefined ๋ฅผ ์ถ”๊ฐ€ํ•˜์‹ญ์‹œ์˜ค. --noImplicitAny ์•„๋ž˜์— ์ƒ‰์ธ ์„œ๋ช…์ด ์—†๋Š” ์œ ํ˜•์œผ๋กœ ์ƒ‰์ธ์„ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์€ ์ด๋ฏธ ์˜ค๋ฅ˜์ž…๋‹ˆ๋‹ค.
ES6 Map ๋Š” ์ด๋ฏธ get(key: K): V | undefined; ๋กœ get์œผ๋กœ ์ •์˜๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” | undefined ๋ฐ˜ํ™˜ํ•˜๋Š” ์ธ๋ฑ์Šค ์„œ๋ช…์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ๋ฐฐ์—ด ๋ฐ ์ง€๋„์˜ ๋ชจ๋“  ์ •์˜๋ฅผ ๋‹ค์‹œ ์ž‘์„ฑ !

TypeScript๊ฐ€ C#์ฒ˜๋Ÿผ ๊ฒ€์‚ฌ ํ๋ฆ„์„ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค(์ธ๋ฑ์Šค ๋ฒ”์œ„ ๊ฒ€์‚ฌ๋ฅผ ์ œ๊ฑฐํ•˜์—ฌ ํ”„๋กœ์„ธ์„œ ์‹œ๊ฐ„์„ ์ ˆ์•ฝํ•˜๊ธฐ ์œ„ํ•ด). ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

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 ๋ฅผ ๋„ฃ๋Š” ๋ฐ๋Š” (์ ์–ด๋„) ๋‘ ๊ฐ€์ง€ ๋‹ค๋ฅธ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ด๋Š” ๋ถ„๋ช…ํžˆ ์˜๋„ํ•˜์ง€ ์•Š์€ ์ด๋Ÿฌํ•œ ๊ฐ์ฒด์— undefined๋ฅผ ํ• ๋‹น ํ•  ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
  • Object.values (๋˜๋Š” _.values )์™€ ๊ฐ™์€ ๋‹ค๋ฅธ ์ž‘์—…์€ ๊ฒฐ๊ณผ์—์„œ undefined ๋ฅผ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

tslint๋Š” typescript๊ฐ€ ์ž˜๋ชป๋œ ์œ ํ˜• ์ •๋ณด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์—(= | 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 ๋ฃจํ”„์—๋Š” ๋ฌธ์ œ๊ฐ€ ์—†์œผ๋ฉฐ ์ด์ „ ์Šคํƒ€์ผ์˜ for ๋ฃจํ”„๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ๋ง๋ผ๊ณ  ์•Œ๋ ค์ฃผ๋Š” 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')

์ด๊ฒƒ๋“ค์€ ์ปดํŒŒ์ผ๋Ÿฌ์— ์˜ํ•ด ๋ฐฉ์ง€๋  ์ˆ˜ ์žˆ์—ˆ๋˜ ์‹ค์ œ ๋ฒ„๊ทธ์ž…๋‹ˆ๋‹ค.

Imo ์ด๊ฒƒ์€ ํƒ€์ดํ•‘ ํŒŒ์ผ์— ์†ํ•ด์„œ๋Š” ์•ˆ ๋˜์ง€๋งŒ ์˜คํžˆ๋ ค ์œ ํ˜• ์‹œ์Šคํ…œ ๋ฉ”์นด๋‹‰์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ธ๋ฑ์Šค ์„œ๋ช…์ด ์žˆ๋Š” ํ•ญ๋ชฉ์— ์•ก์„ธ์Šคํ•  ๋•Œ undefined ๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋…ผ๋ฆฌ์—์„œ ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒƒ์œผ๋กœ ํ™•์ธ๋˜๋ฉด ! . ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด if ์ถ”๊ฐ€ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ์žกํžˆ์ง€ ์•Š์€ ๋ฒ„๊ทธ๋กœ ๋Š์Šจํ•œ ๊ฒƒ๋ณด๋‹ค ๋ช‡ ๊ฐ€์ง€ ํ•„์š”ํ•œ ์ฃผ์žฅ์— ๋Œ€ํ•ด ์—„๊ฒฉํ•œ ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ์„ ํ˜ธํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ด ํ”Œ๋ž˜๊ทธ๊ฐ€ ์ถ”๊ฐ€๋˜๋Š” ๊ฒƒ์„ ๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ ํšŒ์‚ฌ์˜ ์ฝ”๋“œ ๊ธฐ๋ฐ˜์—์„œ ๋ฐฐ์—ด ๋žœ๋ค ์•ก์„ธ์Šค๋Š” ๋“œ๋ฌธ ์˜ˆ์™ธ์ด๋ฉฐ for ๋ฃจํ”„๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ๊ณ ์ฐจ ํ•จ์ˆ˜๋กœ ๋‹ค์‹œ ์ž‘์„ฑํ•˜๋ ค๋Š” ์ฝ”๋“œ ๋ƒ„์ƒˆ์ž…๋‹ˆ๋‹ค.

@pelotom ๊ทธ๋Ÿฌ๋ฉด ์–ด๋–ค ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

@aleksey-bykov๋Š” ์ฃผ๋กœ ํƒ€์‚ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ๊ด‘๋ฒ”์œ„ํ•˜๊ฒŒ ๋ฐœ์ƒํ•˜๋Š” ๊ฐ์ฒด ์ธ๋ฑ์Šค ์„œ๋ช…์ž…๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ๊ฐ€ ์ •์˜๋˜์ง€ ์•Š์•˜์„ ์ˆ˜ ์žˆ์Œ์„ ๊ฒฝ๊ณ ํ•˜๊ธฐ ์œ„ํ•ด { [k: string]: A } ์˜ ์†์„ฑ์— ์•ก์„ธ์Šคํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ํ”Œ๋ž˜๊ทธ๊ฐ€ ์ž‘์—…ํ•˜๊ธฐ์— ๋„ˆ๋ฌด ์„ฑ๊ฐ€์‹  ์ด์œ ์— ๋Œ€ํ•œ ์‚ฌ๋ก€๋กœ ์ œ๊ธฐ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฐฐ์—ด ์ธ๋ฑ์‹ฑ์— ๋Œ€ํ•ด์„œ๋งŒ ์–ธ๊ธ‰ํ–ˆ์Šต๋‹ˆ๋‹ค.

์›ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ •ํ™•ํ•˜๊ฒŒ ๋‹ค์‹œ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ๊ณ„์‹ญ๋‹ˆ๊นŒ? (์•ฝ๊ฐ„์˜ ์ถ”๊ฐ€ ์ž‘์—…์ด ์ฃผ์–ด์ง)

์˜ˆ, ๋ชจ๋“  ์‚ฌ๋žŒ์˜ ํƒ€์ดํ•‘์„ ๋‹ค์‹œ ์ž‘์„ฑํ•˜๊ฑฐ๋‚˜ ์ปดํŒŒ์ผ๋Ÿฌ ํ”Œ๋ž˜๊ทธ๋ฅผ ์ผค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค ๐Ÿ˜œ

๊ณ„์†ํ•ด์„œ Captain O๋ฅผ ํ”Œ๋ ˆ์ดํ•˜์„ธ์š”...: ์˜ค๋Š˜ lib.d.ts ๋‹ค์‹œ ์ž‘์„ฑํ•˜๊ณ  ๋” ๋งŽ์€ ์‚ฌ์šด๋“œ ์ฝ”๋“œ๋ฒ ์ด์Šค์˜ ํ–‰๋ณตํ•œ ์†Œ์œ ์ž๊ฐ€ ๋˜๊ฑฐ๋‚˜ ๋‹ค์Œ N๋…„ ๋™์•ˆ ํ”Œ๋ž˜๊ทธ๋ฅผ ๊ธฐ๋‹ค๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@aleksey-bykov lib.d.ts ๋ฅผ ๋‹ค์‹œ ์ž‘์„ฑํ•˜์—ฌ ์–ด๋–ป๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

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

๊ทธ๋Ÿฐ ๋‹ค์Œ lib.es2015.core.d.ts ์˜ Array ์ •์˜์—์„œ ๋‹ค์Œ์„ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

[n: number]: T;

~์™€ ํ•จ๊ป˜

[n: number]: T | undefined;

@aleksey-bykov ์•„๋งˆ๋„ ๋‚ด๊ฐ€ ๋ฐฐ์—ด์— ๋Œ€ํ•ด ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š๋Š”๋‹ค๊ณ  ๋งํ•œ ๋ถ€๋ถ„์„ ๋†“์ณค์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํƒ€์‚ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ { [k: string]: T } ์œ ํ˜•์œผ๋กœ ์„ ์–ธํ•œ ์œ„์น˜์— ๊ด€์‹ฌ์ด ์žˆ์œผ๋ฉฐ ์ด๋Ÿฌํ•œ ๊ฐœ์ฒด์— ์•ก์„ธ์Šคํ•˜์—ฌ ์ •์˜๋˜์ง€ ์•Š์€ ๊ฒƒ์„ ๋ฐ˜ํ™˜ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. lib.d.ts ๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ๋งŒ์œผ๋กœ๋Š” ์ด๋ฅผ ๋‹ฌ์„ฑํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„œ๋ช…์„ ๋ณ€๊ฒฝํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํƒ€์‚ฌ ์ •์˜ ํŒŒ์ผ์„ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๊ทธ๋ ‡๋‹ค๋ฉด ๋‹น์‹ ์€ ๊ทธ๋“ค์„ ๊ณ ์น  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

๊ทธ๋ฆฌ๊ณ  ์ด์ œ ์šฐ๋ฆฌ๋Š” ๋‹ค์‹œ

์˜ˆ, ๋ชจ๋“  ์‚ฌ๋žŒ์˜ ํƒ€์ดํ•‘์„ ๋‹ค์‹œ ์ž‘์„ฑํ•˜๊ฑฐ๋‚˜ ์ปดํŒŒ์ผ๋Ÿฌ ํ”Œ๋ž˜๊ทธ๋ฅผ ์ผค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค ๐Ÿ˜œ

์‹œ๊ฐ„์€ ํ‰ํ‰ํ•œ ์›์ž…๋‹ˆ๋‹ค.

๋ฐ”๋ณด์ง“ ํ•˜์ง€๋งˆ, "๋ชจ๋‘์˜ ํƒ€์ดํ•‘"์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋‹ˆ? ๋ง ๊ทธ๋Œ€๋กœ ์ „ํ˜•์ ์ธ ํ”„๋กœ์ ํŠธ์˜ ์ตœ๋Œ€ ์ž‘์—…์ผ์ž…๋‹ˆ๋‹ค.

์˜ˆ, ํ•ญ์ƒ ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ํƒ€์ดํ•‘์„ ํŽธ์ง‘ํ•ด์•ผ ํ•˜๋ฉฐ ๋œ ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋‹น์‹ ์€ N ๋…„ ์•ˆ์—, ์•„๋งˆ๋„, ์ง€๊ธˆ ๋‹น์‹ ์€ ๊ณ ํ†ต์„ ๊ฒช๊ฑฐ๋‚˜ ์‚ฌ๋žŒ์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

๋ฏฟ์„ ์ˆ˜ ์—†์„ ์ •๋„๋กœ ๊ฑด์„ค์ ์ธ ์˜๊ฒฌ ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค ๐Ÿ‘

์ด์— ๋Œ€ํ•œ ๊ฑด์„ค์ ์ธ ์ž…๋ ฅ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ด์œ ๋กœ ์ข…๋ฃŒ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
NS. [x] ๊ฐ€ undefined ๊ฐ€ ๋  ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€์— ๋Œ€ํ•œ ๊ฒฐ์ •์€ ๊ฐœ๋ฐœ์ž์—๊ฒŒ ๋งก๊ฒจ์ง‘๋‹ˆ๋‹ค.

  • ๊ทธ๋“ค์ด ํ•ญ์ƒ ๊ทธ๋žฌ๋˜ ๊ฒƒ์ฒ˜๋Ÿผ ๋ชจ๋“  ๊ฒƒ์„ ๋จธ๋ฆฌ ์†์— ๊ฐ„์งํ•˜๊ฒŒ ๋‘์‹ญ์‹œ์˜ค.
  • ๋˜๋Š” ์ œ์•ˆ๋œ ๋Œ€๋กœ lib.d.ts ๋ฐ 3rd-party.d.ts

NS. ๋˜๋Š” #a์—์„œ ์†์œผ๋กœ ์‰ฝ๊ฒŒ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์„ ์™„ํ™”ํ•˜๋Š” ๋ฐ ํŠน์ˆ˜ ๊ตฌ๋ฌธ/์œ ํ˜•/ํ๋ฆ„ ๋ถ„์„/N๋…„์ด ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค.

๋ฌธ์ œ๋Š” ์ƒˆ๋กœ์šด ๊ตฌ๋ฌธ์ด ์ œ์•ˆ๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ ์„ ์ œ์™ธํ•˜๊ณ ๋Š” (b)์— ๋Œ€ํ•œ ์ œ์•ˆ์ด๋ฉฐ, ์ด๋Š” ๋‹จ์ง€ ์ปดํŒŒ์ผ๋Ÿฌ ํ”Œ๋ž˜๊ทธ์ž…๋‹ˆ๋‹ค.

๊ฒฐ๋ก ์€ { [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 ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์˜ˆ, ๊ฐ€์น˜ ๊ธฐ๋ฐ˜ ์œ ํ˜•์ด ์—ฌ๊ธฐ์— ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค. ๋ฆฌํ„ฐ๋Ÿด ๋ฌธ์ž์—ด ์œ ํ˜•์€ ๋งค์šฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋ฆฌํ„ฐ๋Ÿด ๋ถ€์šธ ๋ฐ ์ˆซ์ž ๋ฐ ๋ฒ”์œ„/๋ฒ”์œ„ ์ง‘ํ•ฉ ์œ ํ˜•์ด ์—†๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? TypeScript๋Š” JavaScript๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๊ฒƒ์„ ๋‹ค๋ฃจ๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค(์˜ˆ๋ฅผ ๋“ค์–ด Elm์ด ์ด๋ฅผ ์ œํ•œํ•˜๋Š” ๊ฒƒ๊ณผ ๋Œ€์กฐ์ ์œผ๋กœ).

๋ง ๊ทธ๋Œ€๋กœ ์ „ํ˜•์ ์ธ ํ”„๋กœ์ ํŠธ์˜ ์ตœ๋Œ€ ์ž‘์—…์ผ์ž…๋‹ˆ๋‹ค.

@aleksey-bykov, ๋ณ€๊ฒฝ ํ›„ ์–ด๋–ค ๊ฒฝํ—˜์ด ์žˆ์—ˆ๋Š”์ง€ ๊ถ๊ธˆํ•˜์‹ญ๋‹ˆ๊นŒ? ! ๋ฅผ ์–ผ๋งˆ๋‚˜ ์ž์ฃผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? ์‹ค์ œ ๋ฒ„๊ทธ์— ํ”Œ๋ž˜๊ทธ๋ฅผ ์ง€์ •ํ•˜๋Š” ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ์–ผ๋งˆ๋‚˜ ์ž์ฃผ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

@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

ํ”Œ๋ž˜๊ทธ๊ฐ€ lib.d.ts ํŒŒ์ผ์„ ๋ณ€๊ฒฝํ•˜๋„๋ก ์„ค๊ณ„๋˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— --strictArrayIndex ์™€ ๊ฐ™์€ ํ”Œ๋ž˜๊ทธ๋Š” ์˜ต์…˜์ด ์•„๋‹™๋‹ˆ๋‹ค. " lib": ['strict-es6'] ? ๊ฐ™์€ lib.d.ts ํŒŒ์ผ์˜ ์—„๊ฒฉํ•œ ๋ฒ„์ „์„ ๋ฆด๋ฆฌ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์—๋Š” ์—„๊ฒฉํ•œ ๋ฐฐ์—ด ์ธ๋ฑ์Šค๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์—ฌ๋Ÿฌ ๊ฐœ์„  ์‚ฌํ•ญ์ด ํฌํ•จ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ: Object.keys :

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

๋‹ค์Œ๊ณผ ๊ฐ™์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

์˜ค๋Š˜ SBS์—์„œ ์—…๋ฐ์ดํŠธ: 30๋ถ„ ๋™์•ˆ ์„œ๋กœ ์†Œ๋ฆฌ ์ง€๋ฅด๋ฉฐ ์•„๋ฌด ์ผ๋„ ์ผ์–ด๋‚˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๐Ÿคทโ€โ™‚๏ธ

@RyanCavanaugh ๊ถ๊ธˆ ํ•ด์„œ SBS๋ž€?

@radix "์ œ์•ˆ ๋ฐฑ๋กœ๊ทธ

์†”๋ฃจ์…˜์ด ๋ถ„๋ช…ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํฅ๋ฏธ๋กญ์Šต๋‹ˆ๋‹ค.
T ๋ฐ T | undefined ๋ชจ๋‘ ์ž˜๋ชป๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์œ ์ผํ•œ ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉ๋ฒ•์€ ์ง‘ํ•ฉ์—์„œ ์„ ํƒํ•˜๊ฑฐ๋‚˜ ์•Œ๋ ค์ง„ ์ˆซ์ž ๋ฒ”์œ„๋กœ ๋ฌถ์Œ์œผ๋กœ์จ ์ธ๋ฑ์Šค ๋ณ€์ˆ˜๊ฐ€ ์ปจํ…Œ์ด๋„ˆ์˜ ์šฉ๋Ÿ‰์„ ์ธ์‹ํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@RyanCavanaugh ๋‚˜๋Š” ์ด๊ฒƒ์— ๋Œ€ํ•ด ์ƒ๊ฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ํŠธ๋ฆญ์ด ๋ชจ๋“  ๊ฒฝ์šฐ์˜ 87%๋ฅผ ์ปค๋ฒ„ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.

  • values[index] ๋Š” T ์ธ๋ฑ์Šค๊ฐ€ ์„ ์–ธ๋œ ๊ฒฝ์šฐ for (HERE; ...)
  • values[somethingElse] ์ œ๊ณต T | undefined ๋ชจ๋“  ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ์™ธ๋ถ€์˜ ์„ ์–ธ for

@ ์•Œ๋ ‰์„ธ์ด-์ฝ”ํ”„ ์šฐ๋ฆฌ๋Š” ๋ฌด์–ธ๊ฐ€๋ฅผ ๋…ผ์˜์—๋„ ์Šค๋งˆํŠธ -์ด '์— ๋Œ€ํ•œ ์‹ค์ œ์˜ ํ˜•ํƒœ ๊ฐ€๋“œ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด ๋  ์ˆ˜ ์žˆ๋‹ค๊ณ  arr[index] ํ…Œ์ŠคํŠธ ํ•œ index < arr.length .ํ•˜์ง€๋งŒ์ด ๊ฒฝ์šฐ ๋„์›€์ด๋˜์ง€ ๊ฒƒ์ž…๋‹ˆ๋‹ค ์–ด๋”” pop ๋ฃจํ”„ ์ค‘๊ฐ„์—

Aleksey๊ฐ€ ๋ฐฐ์—ด์„ ๋ณ€๊ฒฝํ•œ๋‹ค๋Š” ์˜๋ฏธ๋Š” ์•„๋‹™๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ตœ๊ทผ์— Elm์—์„œ Typescript๋กœ ์•ฑ์„ ์ด์‹ํ–ˆ๊ณ  ์ธ๋ฑ์‹ฑ ์ž‘์—…์ด ์ž˜๋ชป ์ž…๋ ฅ๋œ ๊ฒƒ์€ ์•„๋งˆ๋„ ๊ฐ€์žฅ ์—„๊ฒฉํ•œ TS ์„ค์ •์ด ํ™œ์„ฑํ™”๋œ( this ๊ณผ ๊ฐ™์€ ํ•ญ๋ชฉ๋„ ์–ธ๋ฐ”์šด๋“œ๋œ) ๋‚ด๊ฐ€ ๊ฒช์€ ๊ฐ€์žฅ ํฐ ๋ฒ„๊ทธ ์†Œ์Šค ์ค‘ ํ•˜๋‚˜์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ).

  • ์ปจํ…Œ์ด๋„ˆ์— ๋Œ€ํ•œ ๋Œ์—ฐ๋ณ€์ด๋ฅผ ์ถ”์ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  • ์ธ๋ฑ์Šค ์กฐ์ž‘์„ ์ถ”์ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์œผ๋กœ ๊ฑฐ์˜ ๋ณด์žฅํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์ผ๋ฐ˜์ ์ธ ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ < array.length ๋‚ด์˜ ๋ชจ๋“  ์š”์†Œ์— ๋Œ€ํ•œ ๋ฉ์ฒญํ•œ ๋ฐ˜๋ณต์ธ ๊ฒฝ์šฐ ์™œ ์‹œ๋„ํ•˜๊ฒ ์Šต๋‹ˆ๊นŒ?

๋‚ด๊ฐ€ ํ‰์†Œ์— ๋งํ–ˆ๋“ฏ์ด

  • ์˜ค๋ฅ˜๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ for ๋ฌธ์˜ ์ ˆ ์–ด๋”˜๊ฐ€์—์„œ ์‹œ์ž‘๋˜์—ˆ์„ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค: ์ดˆ๊ธฐํ™”, ์ฆ๊ฐ€, ์ค‘์ง€ ์กฐ๊ฑด ๋ฐ ๋”ฐ๋ผ์„œ ํŠœ๋ง ์ „์ฒด ์œ ํ˜• ๊ฒ€์‚ฌ๊ฐ€ ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” ํ•ญ๋ชฉ์ด ์•„๋‹™๋‹ˆ๋‹ค.
  • for ์ ˆ ์™ธ๋ถ€์—๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์˜ค๋ฅ˜๊ฐ€ ์žˆ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์ธ๋ฑ์Šค๊ฐ€ ์–ด๋–ป๊ฒŒ๋“  ์„ ์–ธ๋˜๋Š” ํ•œ(์ž์‹ ์žˆ๊ฒŒ ๋งํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด ์—†์Œ) ๋ฃจํ”„ ๋ณธ๋ฌธ ๋‚ด์—์„œ ์ธ๋ฑ์Šค๊ฐ€ ์ •ํ™•ํ•˜๋‹ค๊ณ  ๋ฏฟ๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์œผ๋กœ ๊ณต์ •ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋ฃจํ”„ ์ค‘๊ฐ„์— ํŒ๋˜๊ฑฐ๋‚˜ ๋ฐฐ์—ด์—์„œ ์š”์†Œ๋ฅผ ์ œ๊ฑฐํ•œ ํ•จ์ˆ˜์— ๋ฐฐ์—ด์„ ์ „๋‹ฌํ•œ ๊ฒฝ์šฐ์—๋Š” ๋„์›€์ด ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์ด๊ฒƒ์— ๋Œ€ํ•œ ์ •๋ง ์•ฝํ•œ ์ฃผ์žฅ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์‚ฌ๋ก€๋Š” ์ด๋ฏธ ํŒŒ์†๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์‚ฌ๋ก€๋ฅผ ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ธฐ ์œ„ํ•œ ํ•‘๊ณ„๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์˜๋ฏธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ ์žˆ๋Š” ๋ˆ„๊ตฌ๋„ ์ด๋Ÿฌํ•œ ์‚ฌ๋ก€๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ฒ˜๋ฆฌ๋˜๊ฑฐ๋‚˜ 100% ์ •ํ™•ํ•˜๊ธฐ๋ฅผ ์š”๊ตฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ •๋ง ์ผ๋ฐ˜์ ์ธ ๊ฒฝ์šฐ์— ์ •ํ™•ํ•œ ์œ ํ˜•์„ ์›ํ•  ๋ฟ์ž…๋‹ˆ๋‹ค. TypeScript์—๋Š” ์™„๋ฒฝํ•˜๊ฒŒ ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์ƒํ•œ ์ผ์„ ํ•˜๊ณ  ์žˆ๋‹ค๋ฉด ์œ ํ˜•์ด ํ‹€๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ์šฐ๋ฆฌ๋Š” ์ด์ƒํ•œ ์ผ์„ ํ•˜์ง€ ์•Š์œผ๋ฉฐ ์œ ํ˜•์ด ์ž˜๋ชป๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜๊ธฐ ์œ„ํ•ด ์˜์‹ ์ถ”๊ฐ€ํ•˜๊ธฐ

์ด๊ฒƒ์ด "์ฝ”๋“œ ์ˆ˜์ •์„ ์œ„ํ•œ ์˜์‹ ์ถ”๊ฐ€"์ธ ์ฝ”๋“œ ์˜ˆ์ œ๋ฅผ ๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ฐฐ์—ด์— ๋Œ€ํ•œ ๊ธฐ๋ณธ for ๋ฃจํ”„๋Š” ๊ฐ์ง€/์ œํ•œํ•˜๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค. ์ž ์žฌ์ ์œผ๋กœ ๋ฒ„๊ทธ๊ฐ€ ์•„๋‹Œ ๋ถˆํŽธํ•˜๊ฒŒ ๋˜๋Š” ๋‹จ์ˆœ for ๋ฃจํ”„๊ฐ€ ์•„๋‹Œ ์‹ค์ œ ์ฝ”๋“œ

๋ฒ„๊ทธ๋ฅผ ์žก์ง€ ์•Š์œผ๋ฉด์„œ

์ด๋กœ ์ธํ•ด ์ปดํŒŒ์ผ์— ์‹คํŒจํ•œ ์ž‘์—… ์ฝ”๋“œ์™€ ์œ ํ˜•์ด ๊ฐœ๋ฐœ์ž๋ฅผ ์˜ค๋„ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋Ÿฐํƒ€์ž„์— throw๋˜๋Š” ์ฝ”๋“œ์˜ ์˜ˆ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ๋’ท๋ฐ›์นจํ•˜๋Š” ๊ฐ€์น˜๊ฐ€ 0์ด๋ผ๋Š” ๊ฒƒ์€ ๋„Œ์„ผ์Šค์ž…๋‹ˆ๋‹ค.

์™œ ์šฐ๋ฆฌ๋Š” ๋‹จ์ˆœํ•˜๊ฒŒ ์œ ์ง€ํ•˜๊ณ  ๊ตฌ์‹ for ๋ฃจํ”„ ์ฃผ์œ„์— _any_ ๋งˆ๋ฒ• ๋™์ž‘์„ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ํ•ญ์ƒ ! ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฝ”๋“œ๋ฒ ์ด์Šค๊ฐ€ ๊ตฌ์‹ for ๋ฃจํ”„๋กœ ๊ฐ€๋“ ์ฐจ ์žˆ์œผ๋ฉด ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ๋‚ด๊ฐ€ ์ž‘์—…ํ•œ ๋ชจ๋“  ์ตœ์‹  ์ฝ”๋“œ๋ฒ ์ด์Šค๋Š” forEach ๋˜๋Š” for of ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐฐ์—ด์„ ๋ฐ˜๋ณตํ•˜๋ฉฐ ์ด๋Ÿฌํ•œ ์ฝ”๋“œ๋ฒ ์ด์Šค๋Š” ์ถ”๊ฐ€ ์œ ํ˜• ์•ˆ์ „์„ฑ์˜ ์ด์ ์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ์ด์ƒํ•œ ์ง“์„ ํ•˜์ง€ ์•Š๊ณ  ์œ ํ˜•์ด ์ž˜๋ชป๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋‚˜์—๊ฒŒ ์ด ๋‹จ๋ฝ์€ ์ด ๊ธฐ๋Šฅ์ด ์—†๋Š” ์ข‹์€ ์ด์œ ์ฒ˜๋Ÿผ ์ฝํž™๋‹ˆ๋‹ค. ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚œ ๋ฐฐ์—ด์— ์•ก์„ธ์Šคํ•˜๋Š” ๊ฒƒ์€ ์ด์ƒํ•œ ์ผ์ž…๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์ด์ง€ ์•Š์€ ์ผ(OOBing)์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ์œ ํ˜•์ด "์ž˜๋ชป"๋ฉ๋‹ˆ๋‹ค. ๋ฐฐ์—ด์—์„œ ์ฝ๋Š” ๋Œ€๋ถ€๋ถ„์˜ ์ฝ”๋“œ๋Š” ๋ฒ”์œ„ ๋‚ด์—์„œ ๊ทธ๋ ‡๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ์ด ์ธ์ˆ˜์— ์˜ํ•ด ์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ์— undefined ๋ฅผ ํฌํ•จํ•˜๋Š” ๊ฒƒ์€ "์ž˜๋ชป"๋ฉ๋‹ˆ๋‹ค.

... ์ปดํŒŒ์ผ์— ์‹คํŒจํ•œ ์ž‘์—… ์ฝ”๋“œ

๋‚˜๋Š” ์ „ํ˜€ ์•Œ์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ๊ตฌ์ฒด์ ์œผ๋กœ ์ง€์ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์™œ ์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ์„ ๋‹จ์ˆœํ•˜๊ฒŒ ์œ ์ง€ํ•˜๊ณ  ๊ตฌ์‹ for ๋ฃจํ”„ ์ฃผ์œ„์— ๋งˆ์ˆ  ๋™์ž‘์„ ์ „ํ˜€ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๋‹น์‹ ์€ ํ•ญ์ƒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค! ์ผ์ด ์ž‘๋™ํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

"๋ชจ๋“  ๋ฐฐ์—ด ์•ก์„ธ์Šค ํ‘œํ˜„์‹์—๋Š” ! ํ›„ํ–‰์ด ์žˆ์–ด์•ผ ํ•จ"์ด๋ผ๋Š” TSLint ๊ทœ์น™๊ณผ ์ด ๊ทœ์น™์˜ ์œ ์šฉํ•œ ์ฐจ์ด์ ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

@RyanCavanaugh ๋‚ด ๊ฐ€์ •์€ TSLint ๊ทœ์น™์ด ์œ ํ˜•์„ ์ขํžˆ๊ฑฐ๋‚˜ ์ œ์–ด ํ๋ฆ„ ์œ ํ˜• ๋ถ„์„์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค(์˜ˆ: if ์•ก์„ธ์Šค ๋ž˜ํ•‘, ์˜ˆ์™ธ ๋ฐœ์ƒ, return ing ๋˜๋Š” continue ์„ค์ •๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ https://github.com/Microsoft/TypeScript/issues/13778#issuecomment -336265143์˜ ์˜ˆ์—์„œ ๊ตฌํ˜„์€ ์–ด๋–ป๊ฒŒ ๋ฉ๋‹ˆ๊นŒ? ! ๋ฅผ ์ ์šฉํ•˜๋ ค๋ฉด ๋ณธ์งˆ์ ์œผ๋กœ ์ด๋Ÿฌํ•œ ๋ณ€์ˆ˜์˜ ์œ ํ˜•์„ undefined ๋กœ ์ถ”์ ํ•˜๋Š” ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜์—๊ฒŒ ์ด๊ฒƒ์€ linter๊ฐ€ ์•„๋‹ˆ๋ผ type checker๊ฐ€ ํ•ด์•ผ ํ•  ์ผ์ฒ˜๋Ÿผ ๋“ค๋ฆฝ๋‹ˆ๋‹ค.

@RyanCavanaugh

๋‚˜์—๊ฒŒ ์ด ๋‹จ๋ฝ์€ ์ด ๊ธฐ๋Šฅ์ด ์—†๋Š” ์ข‹์€ ์ด์œ ์ฒ˜๋Ÿผ ์ฝํž™๋‹ˆ๋‹ค. ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚œ ๋ฐฐ์—ด์— ์•ก์„ธ์Šคํ•˜๋Š” ๊ฒƒ์€ ์ด์ƒํ•œ ์ผ์ž…๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์ด์ง€ ์•Š์€ ์ผ(OOBing)์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ์œ ํ˜•์ด "์ž˜๋ชป"๋ฉ๋‹ˆ๋‹ค.

... ์ปดํŒŒ์ผ์— ์‹คํŒจํ•œ ์ž‘์—… ์ฝ”๋“œ

๋‚˜๋Š” ์ „ํ˜€ ์•Œ์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ๊ตฌ์ฒด์ ์œผ๋กœ ์ง€์ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์ œ ๊ฒฝ์šฐ์—๋Š” ์–ด๋ ˆ์ด๊ฐ€ ์•„๋‹ˆ์—ˆ์ง€๋งŒ ์†์ž„์ˆ˜๋กœ ํ์‡„๋˜์—ˆ์œผ๋ฏ€๋กœ ์ด ๋ฌธ์ œ๋„ ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ๋‹ค๋ฃจ์–ด์•ผ ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. ๋‚ด ์›๋ž˜ ๋ฌธ์ œ๋Š” #11186์„ ์ฐธ์กฐํ•˜์„ธ์š”. ํŒŒ์ผ์„ ๋งต์œผ๋กœ ๊ตฌ๋ฌธ ๋ถ„์„ํ•œ ๋‹ค์Œ undefined ์— ๋Œ€ํ•ด ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค. IIRC ๋น„๊ต์—์„œ ์ •์˜ํ•  ์ˆ˜๋Š” ์žˆ์ง€๋งŒ ์ •์˜ํ•  ์ˆ˜๋Š” ์—†๋‹ค๋Š” ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

ํ•ญ์ƒ 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 ๊ฐ€ ์žˆ๋Š” ์œ ํ˜•๊ณผ ๊ทธ๋ ‡์ง€ ์•Š์€ ์œ ํ˜•์œผ๋กœ ์ž‘์—…ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ๋น„์šฉ์ด ๋“ ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๊ฐ€ ์ด๊ฒƒ์„ ์—†์•จ ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ •๋ง ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ์ƒ๊ฐ์„ ์ •๋ฆฌํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

JavaScript์—์„œ ๊ฐ์ฒด๋Š” ํ˜ผํ•ฉ ๋ฐฑ์ž…๋‹ˆ๋‹ค. ๋‘ ๊ฐ€์ง€ ์šฉ๋„ ๋กœ

  • ํ‚ค๋ฅผ ์•Œ ์ˆ˜ ์—†๋Š” ์‚ฌ์ „ ์ผ๋ช… ์ง€๋„
  • ํ‚ค๊ฐ€ ์•Œ๋ ค์ง„ ๋ ˆ์ฝ”๋“œ

๋ ˆ์ฝ”๋“œ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๊ฐœ์ฒด์˜ ๊ฒฝ์šฐ ์ธ๋ฑ์Šค ์„œ๋ช…์„ ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋Œ€์‹  ์•Œ๋ ค์ง„ ํ‚ค๊ฐ€ ์ธํ„ฐํŽ˜์ด์Šค ์œ ํ˜•์— ์ •์˜๋ฉ๋‹ˆ๋‹ค. ์œ ํšจํ•œ ํ‚ค ์กฐํšŒ๋Š” ํ•ด๋‹น ์œ ํ˜•์„ ๋ฐ˜ํ™˜ํ•˜๊ณ  ์œ ํšจํ•˜์ง€ ์•Š์€ ํ‚ค ์กฐํšŒ๋Š” ์ธ๋ฑ์Šค ์„œ๋ช…์œผ๋กœ ๋Œ€์ฒด๋ฉ๋‹ˆ๋‹ค. ์ •์˜๋œ ์ธ๋ฑ์Šค ์„œ๋ช…์ด ์—†๊ณ (๋ ˆ์ฝ”๋“œ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๊ฐœ์ฒด์— ๋Œ€ํ•ด ์—†์–ด์•ผ ํ•จ) noImplicitAny ๊ฐ€ ํ™œ์„ฑํ™”๋˜์–ด ์žˆ์œผ๋ฉด ์›ํ•˜๋Š” ๋Œ€๋กœ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

์‚ฌ์ „(์ผ๋ช… ๋งต) ๋ฐ ๋ฐฐ์—ด๋กœ ์‚ฌ์šฉ๋˜๋Š” ๊ฐ์ฒด์˜ ๊ฒฝ์šฐ ์ธ๋ฑ์Šค ์„œ๋ช…์ด ์‚ฌ์šฉ๋˜๋ฉฐ ๊ฐ’ ์œ ํ˜•์— | undefined ๋ฅผ ํฌํ•จํ•˜๋„๋ก ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ: { [key: index]: string | undefined } . ๋ชจ๋“  ํ‚ค ์กฐํšŒ๋Š” ์œ ํšจํ•˜๋ฉฐ(์ปดํŒŒ์ผ ์‹œ ํ‚ค๋ฅผ ์•Œ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์—) ๋ชจ๋“  ํ‚ค๋Š” ๋™์ผํ•œ ์œ ํ˜•์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค(์ด ์˜ˆ์—์„œ๋Š” T | undefined ).

์ธ๋ฑ์Šค ์„œ๋ช…์€ ์‚ฌ์ „ ๊ฐœ์ฒด ํŒจํ„ด ๋ฐ ๋ฐฐ์—ด์—๋งŒ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋ฏ€๋กœ TypeScript๊ฐ€ ์ธ๋ฑ์Šค ์„œ๋ช… ๊ฐ’ ์œ ํ˜•์—์„œ | undefined ๋ฅผ ์ ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋ฐ”๋žŒ์งํ•ฉ๋‹ˆ๋‹ค. ํ‚ค๋ฅผ ์•Œ ์ˆ˜ ์—†๊ณ  ํ‚ค ์กฐํšŒ๊ฐ€ undefined ๋ฐ˜ํ™˜ํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋Š” ๊ฒฝ์šฐ

Array.prototype.find undefined ๋ฐ˜ํ™˜ํ•˜๊ฑฐ๋‚˜ array[0] undefined ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์ด ์ด๊ฒƒ์ด ์—†์œผ๋ฉด ๋ณด์ด์ง€ ์•Š๋Š” ๋ฒ„๊ทธ์˜ ์ข‹์€ ์˜ˆ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. (๋น„๊ตฌ์กฐํ™”๋Š” ํ‚ค ์กฐํšŒ๋ฅผ ์œ„ํ•œ ์„คํƒ• ๊ตฌ๋ฌธ์ผ ๋ฟ์ž…๋‹ˆ๋‹ค.) getKey ์™€ ๊ฐ™์€ ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•˜์—ฌ ๋ฐ˜ํ™˜ ์œ ํ˜•์„ ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ์ฝ”๋“œ๋ฒ ์ด์Šค์—์„œ ์ด๋Ÿฌํ•œ ํ•จ์ˆ˜์˜ ์‚ฌ์šฉ์„ ๊ฐ•์ œํ•˜๋ ค๋ฉด ์›์น™์— ์˜์กดํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ดํ•ดํ•˜๋ฉด ๋ฌธ์ œ๋Š” ์‚ฌ์ „ ๊ฐœ์ฒด ๋ฐ ๋ฐฐ์—ด์— ๋Œ€ํ•œ ๋ฐ˜์‚ฌ์— ๊ด€ํ•œ ๊ฒƒ์ด๋ฏ€๋กœ ์‚ฌ์ „ ๊ฐœ์ฒด ๋˜๋Š” ๋ฐฐ์—ด์˜ ํ‚ค๋ฅผ ๋งคํ•‘ํ•  ๋•Œ ํ‚ค ์กฐํšŒ๊ฐ€ ์œ ํšจํ•œ ๊ฒƒ์œผ๋กœ ์•Œ๋ ค์ ธ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, undefined ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ๊ฐ’ ์œ ํ˜•์— undefined ๊ฐ€ ํฌํ•จ๋˜๋Š” ๊ฒƒ์€ ๋ฐ”๋žŒ์งํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์ œ์–ด ํ๋ฆ„ ๋ถ„์„์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ๋ฏธํ•ด๊ฒฐ ๋ฌธ์ œ์ž…๋‹ˆ๊นŒ, ์•„๋‹ˆ๋ฉด ์ œ๊ฐ€ ์˜คํ•ดํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

๋‚ด๊ฐ€ ์–ธ๊ธ‰ํ•˜์ง€ ์•Š์€ ์‚ฌ์šฉ ์‚ฌ๋ก€์™€ ๋ฌธ์ œ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

๊ฐ์ฒด ์œ ํ˜• ์ •์˜์— undefined๋ฅผ ๋„ฃ๋Š” ๋ฐ๋Š” (์ ์–ด๋„) ๋‘ ๊ฐ€์ง€ ๋‹ค๋ฅธ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ด๊ฒƒ์€ ๋ถ„๋ช…ํžˆ ์˜๋„ํ•˜์ง€ ์•Š์€ ์ด๋Ÿฌํ•œ ๊ฐ์ฒด์— undefined๋ฅผ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
  • Object.values(๋˜๋Š” _.values)์™€ ๊ฐ™์€ ๋‹ค๋ฅธ ์ž‘์—…์—์„œ๋Š” ๊ฒฐ๊ณผ์—์„œ ์ •์˜๋˜์ง€ ์•Š์€ ๊ฒƒ์„ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋งค์šฐ ์ค‘์š”ํ•œ ํฌ์ธํŠธ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

ํ˜„์žฌ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์‹คํ—˜ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

const safelyAccessProperty = <T, K extends keyof T>(object: T, key: K): T[K] | undefined => object[key]; ์ •์˜

๊ทธ๋Ÿฐ ๋‹ค์Œ myObject[myKey] ๋Œ€์‹  safelyAccessProperty(myObject, myKey) ์™€ ๊ฐ™์€ ์†์„ฑ์— ์•ก์„ธ์Šคํ•ฉ๋‹ˆ๋‹ค.

@plul ์ž˜ ์žก์•˜์Šต๋‹ˆ๋‹ค. ๋…ผ์˜๋Š” ํ˜„์žฌ ์ฝ๊ธฐ ์ž‘์—…์— ์ค‘์ ์„ ๋‘๊ณ  ์žˆ์ง€๋งŒ ์ธ๋ฑ์„œ ์œ ํ˜• ์ •์˜๋Š” ์‹ค์ œ๋กœ ๋‘ ๊ฐ€์ง€์ด๋ฉฐ | undefined ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด undefined ๊ฐ’์„ ์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‹คํ—˜ ์ค‘์ธ safelyAccessProperty ํ•จ์ˆ˜( ์œ„์—์„œ @OliverJAsh์—์„œ

์ด ๊ธฐ๋Šฅ์€ ๋ชจ๋“  ์–ด๋ ˆ์ด ์˜ค๋ธŒ์ ํŠธ ์ธ์Šคํ„ด์Šค (์ธ๋ฑ์„œ ์ž‘์—…์„ ์ œ๊ณต ๋ชจ๋“  ์œ ํ˜•)์— ์ œ๊ณต๋˜๋Š” ๊ฒฝ์šฐ, ํ™•์žฅํ–ˆ๋‹ค ++ C์—์„œ ๊ฐ™์€ ์ˆ˜ std::vector ๊ฐ–๋Š”๋‹ค .at() OOB ์•ก์„ธ์Šค ๋Ÿฐํƒ€์ž„ ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ ์–ด๋Š ๋ฐ ํ™•์ธ๋˜์ง€ ์•Š์€ [] ์—ฐ์‚ฐ์ž๋Š” ์ตœ์ƒ์˜ ๊ฒฝ์šฐ OOB ์•ก์„ธ์Šค์—์„œ SEGFAULT์™€ ์ถฉ๋Œํ•˜๊ณ  ์ตœ์•…์˜ ๊ฒฝ์šฐ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์†์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.

OOB ์•ก์„ธ์Šค ๋ฌธ์ œ๋Š” TypeScript/JavaScript์˜ ์œ ํ˜• ์ •์˜ ์ˆ˜์ค€๋งŒ์œผ๋กœ๋Š” ํ•ด๊ฒฐํ•  ์ˆ˜ ์—†์œผ๋ฉฐ ์ด ์—„๊ฒฉ์„ฑ ๊ธฐ๋Šฅ์ด ํ™œ์„ฑํ™”๋œ ๊ฒฝ์šฐ ์ž ์žฌ์ ์œผ๋กœ ์œ„ํ—˜ํ•œ ์ธ๋ฑ์„œ ์ž‘์—…์„ ์ œํ•œํ•˜๊ธฐ ์œ„ํ•ด ์–ธ์–ด ์ง€์›์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์ธ๋ฑ์„œ์˜ ์ด์ค‘ ํŠน์„ฑ์€ 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'];

์œ„์˜ DT PR์— | undefined ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์„ ๊ฑฐ๋ถ€ํ•˜์—ฌ ์—ฌ๊ธฐ๊นŒ์ง€ ์™”์Šต๋‹ˆ๋‹ค. API์˜ ๊ธฐ์กด ์‚ฌ์šฉ์ž๊ฐ€ ๋ชจ๋‘ ์ค‘๋‹จ๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋„์„œ๊ด€๋ณด๋‹ค?


์„ ํƒ์  ์†์„ฑ์— | undefined ๋„ ์ถ”๊ฐ€๋œ๋‹ค๋Š” ์ ์— ์œ ์˜ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋ช‡ ๋ฒˆ์ด๋‚˜ ์ €๋ฅผ ๊ดด๋กญํ˜”์Šต๋‹ˆ๋‹ค. ๋ณธ์งˆ์ ์œผ๋กœ TS๋Š” ๋ˆ„๋ฝ๋œ ์†์„ฑ๊ณผ ์ •์˜๋˜์ง€ ์•Š์€ ์†์„ฑ์„ ๊ตฌ๋ถ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” { foo?: T, bar?: T } ๊ฐ€ { [name: 'foo' | 'bar']: T } ์™€ ๋™์ผํ•˜๊ฒŒ ์ทจ๊ธ‰๋˜๊ธฐ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค(์œ„์˜ process.env ์ฃผ์„ ์ฐธ์กฐ).


TS๋Š” ์ˆซ์ž ๋ฐ ๋ฌธ์ž์—ด ์ธ๋ฑ์„œ์—์„œ ๋Œ€์นญ์„ ๊นจ๋Š” ๊ฒƒ์— ๋ฐ˜๋Œ€ํ•ฉ๋‹ˆ๊นŒ?

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
        }
    }
}

๊ทธ๋Ÿฌ๋‚˜ ์‹ค์ œ ์ฝ”๋“œ์—์„œ๋Š” ์˜ค๋ž˜๋œ ๋ฃจํ”„๊ฐ€ ๋ฐ˜๋ณต์„ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฐ€๋Šฅ์„ฑ์ด ํ›จ์”ฌ ์ ์Šต๋‹ˆ๋‹ค.

์ด ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ์ˆ˜์š”๊ฐ€ ์žˆ๋Š” ๊ฒƒ์€ ๋ถ„๋ช…ํ•ฉ๋‹ˆ๋‹ค. TSํŒ€์ด ํ•ด๊ฒฐ์ฑ…์„ ์ฐพ๊ธฐ๋ฅผ ์ง„์‹ฌ์œผ๋กœ ๋ฐ”๋ž๋‹ˆ๋‹ค. ์ž์ฒด ๋ฌธ์ œ๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ธ๋ฑ์„œ์— | 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 ์ ์ ˆํ•˜๊ฒŒ(์—„๊ฒฉํ•˜๊ฒŒ) ์ž…๋ ฅํ•˜๋Š” ๊ฒƒ์€ ๊ฑฐ์˜ ์˜๋ฏธ๊ฐ€ ์—†์ง€๋งŒ ์–ด๋–ป๊ฒŒ๋“  ์ผ๋ฐ˜ ๊ฐ์ฒด๋Š” ์ž์œ  ํŒจ์Šค๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค.
๊ทธ๋ž˜๋„ ์ด๊ฑด ์œ ์ € ๋žœ๋“œ์—์„œ ์‰ฝ๊ฒŒ ๊ณ ์น  ์ˆ˜ ์žˆ์–ด์„œ ๋‚˜์˜์ง€๋Š” ์•Š๋‹ค. ์–ด๋–ค ๊ฒฝ์šฐ์—๋„ ํ•ด๊ฒฐ์ฑ…์ด ์—†์Šต๋‹ˆ๋‹ค.

๋ฐฐ์—ด

์•„๋งˆ๋„ ๋‚ด๊ฐ€ ๋ญ”๊ฐ€๋ฅผ ๋†“์น˜๊ณ  ์žˆ์„์ง€ ๋ชจ๋ฅด์ง€๋งŒ "์•ˆ์ „ํ•˜์ง€ ์•Š์€ ๋ฐฉ์‹์œผ๋กœ ๋ฐฐ์—ด์— ๊ฑฐ์˜ ์•ก์„ธ์Šคํ•˜์ง€ ์•Š๋Š”๋‹ค"๋Š” ์ฃผ์žฅ์€ ํŠนํžˆ ์ƒˆ๋กœ์šด ์ปดํŒŒ์ผ๋Ÿฌ ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์–‘๋ฐฉํ–ฅ์œผ๋กœ ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ ์  ๋” ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ๋‹ค์Œ ๋‘ ๊ฐ€์ง€ ๋ชจ๋ฒ” ์‚ฌ๋ก€๋ฅผ ๋”ฐ๋ฅด๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ๊ฒฝํ–ฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๊ธฐ๋Šฅ์  ๊ธฐ๋ณธ ๋ฉ”์„œ๋“œ ๋˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐฐ์—ด์„ ๋ฐ˜๋ณตํ•˜๊ฑฐ๋‚˜ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—๋Š” ๋ธŒ๋ž˜ํ‚ท ์•ก์„ธ์Šค๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
  • ์ œ์ž๋ฆฌ์—์„œ ๋ฐฐ์—ด์„ ๋ณ€๊ฒฝํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค.

์ด๋ฅผ ์—ผ๋‘์— ๋‘๊ณ  ๋‚ฎ์€ ์ˆ˜์ค€์˜ ๋ธŒ๋ž˜ํ‚ท ์•ก์„ธ์Šค ๋…ผ๋ฆฌ๊ฐ€ ํ•„์š”ํ•œ ์œ ์ผํ•˜๊ณ  ๋“œ๋ฌธ ๊ฒฝ์šฐ๋Š” ์œ ํ˜• ์•ˆ์ „์„ฑ์˜ ์ด์ ์„ ๋ˆ„๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์•„๋ฌด ์ƒ๊ฐ์ด ์—†๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๋ฉฐ ์ „์ฒด lib.d.ts๋ฅผ ๋กœ์ปฌ๋กœ ๋ณต์‚ฌํ•˜์—ฌ ๋ถ™์—ฌ๋„ฃ๋Š” ๊ฒƒ์ด ํ—ˆ์šฉ ๊ฐ€๋Šฅํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ๋ฐฐ์—ด์˜ ์ฒซ ๋ฒˆ์งธ ํ•ญ๋ชฉ( array[0] )์„ ์–ป๊ธฐ ์œ„ํ•ด ๋ฐฐ์—ด/๊ฐ์ฒด๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์ธ๋ฑ์‹ฑํ•  ๋•Œ ๊ฒฐ๊ณผ์— undefined ๊ฐ€ ํฌํ•จ๋˜๊ธฐ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค.

์ธ๋ฑ์Šค ์„œ๋ช…์— undefined ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋‚ด๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ดํ•ดํ•œ๋‹ค๋ฉด ์ธ๋ฑ์Šค ์„œ๋ช…์— undefined ๋ฅผ ํฌํ•จํ•˜๋Š” ๋ฌธ์ œ๋Š” ๋ฐฐ์—ด ๋˜๋Š” ๊ฐœ์ฒด์— ๋งคํ•‘ํ•  ๋•Œ ๊ฐ’์— undefined ๊ฐ€ ํฌํ•จ๋˜์ง€ ์•Š๋Š” ๊ฒƒ์œผ๋กœ ์•Œ๋ ค์ ธ ์žˆ์ง€๋งŒ undefined (๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋งคํ•‘ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค).

์ธ๋ฑ์Šค ์œ ํ˜•/์‹œ๊ทธ๋‹ˆ์ฒ˜๋Š” ์ธ๋ฑ์Šค ์กฐํšŒ(์˜ˆ: array[0] ) ๋ฐ ๋งคํ•‘(์˜ˆ: for ๋ฃจํ”„ ๋ฐ Array.prototype.map ) ๋ชจ๋‘์— ์‚ฌ์šฉ๋˜์ง€๋งŒ ์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ ๊ฐ๊ฐ์— ๋Œ€ํ•ด ๋‹ค๋ฅธ ์œ ํ˜•์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

Map.get ๋Š” ํ•จ์ˆ˜์ด๊ธฐ ๋•Œ๋ฌธ์— Map ์—์„œ๋Š” ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š์œผ๋ฉฐ, ๋”ฐ๋ผ์„œ ํ•จ์ˆ˜๊ฐ€ ์•„๋‹Œ ๋ฐฐ์—ด/๊ฐ์ฒด๋กœ ์ธ๋ฑ์‹ฑํ•˜๋Š” ๊ฒƒ๊ณผ ๋‹ฌ๋ฆฌ ๋ฐ˜ํ™˜ ์œ ํ˜•์€ ๋‚ด๋ถ€ ๊ฐ’ ์œ ํ˜•๊ณผ ๋ถ„๋ฆฌ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ธ๋ฑ์Šค ์„œ๋ช…์„ ์ง์ ‘ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์งˆ๋ฌธ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์–ด๋–ป๊ฒŒ ๋‘ ๊ฒฝ์šฐ๋ฅผ ๋ชจ๋‘ ๋งŒ์กฑ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

// 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! :-(
})

์ œ์•ˆ

์ธ๋ฑ์Šค ๊ฐ’ ์œ ํ˜•์— undefined ๋ฅผ ํฌํ•จํ•˜์—ฌ Set.get ๋ฐ Map.get ๊ฐ€ ์ž…๋ ฅ๋˜๋Š” ๋ฐฉ์‹๊ณผ ์œ ์‚ฌํ•œ ์ธ๋ฑ์Šค ์กฐํšŒ(์˜ˆ: array[0] )๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์ปดํŒŒ์ผ๋Ÿฌ ์˜ต์…˜(์˜ˆ: 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 ์™€ ๊ฐ™์€ ๊ธฐ๋Šฅ์  ์Šคํƒ€์ผ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์„ ํ˜ธํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์ด ํ—ˆ์šฉ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ ์šฐ๋ฆฌ๊ฐ€ ๊ทธ๊ฒƒ๋“ค์„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค๋ฉด, ์šฐ๋ฆฌ๋Š” null์ด ์•„๋‹Œ ์ฃผ์žฅ ์—ฐ์‚ฐ์ž์™€ ํ•จ๊ป˜ ์—ฌ๊ธฐ์— ์ œ์•ˆ๋œ ์ปดํŒŒ์ผ๋Ÿฌ ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๊ธฐ์˜๊ฒŒ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

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 }

๋‚˜๋Š” ์ด ๋ฌธ์ œ๋‚˜ ์ฐฌ๋ฐ˜ ์–‘๋ก , ๋‹ค์–‘ํ•œ ์ œ์•ˆ ๋“ฑ์— ๋Œ€ํ•ด ์ฝ์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. (๋ฐฐ์—ด/๊ฐ์ฒด ์•ก์„ธ์Šค๊ฐ€ ์—„๊ฒฉํ•œ null ๊ฒ€์‚ฌ๋กœ ์ผ๊ด€๋˜๊ฒŒ ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์‚ฌ์‹ค์— ๋ฐ˜๋ณต์ ์œผ๋กœ ๋†€๋ž€ ํ›„ Google์—์„œ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค.) ๊ด€๋ จ ์ œ์•ˆ: ํŠน๋ณ„ํžˆ ์žฌ์ •์˜๋˜์ง€ ์•Š๋Š” ํ•œ ๋ฐฐ์—ด ์œ ํ˜• ์ถ”๋ก ์„ ๊ฐ€๋Šฅํ•œ ํ•œ ์—„๊ฒฉํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ์˜ต์…˜์ž…๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด:

const balls = [1, 2 ,3];

๊ธฐ๋ณธ์ ์œผ๋กœ balls ๋Š” [number, number, number] ๋กœ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•˜์—ฌ ์žฌ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

๋˜ํ•œ ํŠœํ”Œ ์š”์†Œ ์•ก์„ธ์Šค๋Š” ์—„๊ฒฉํ•œ null ๊ฒ€์‚ฌ๋กœ ์ผ๊ด€๋˜๊ฒŒ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ์˜ˆ์ œ์—์„œ n ๋Š” ์—„๊ฒฉํ•œ null ๊ฒ€์‚ฌ๊ฐ€ ํ™œ์„ฑํ™”๋œ ๊ฒฝ์šฐ์—๋„ ํ˜„์žฌ number ๋กœ ์œ ์ถ”๋œ๋‹ค๋Š” ๊ฒƒ์ด ๋†€๋ž์Šต๋‹ˆ๋‹ค.

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

๋˜ํ•œ .push ์™€ ๊ฐ™์€ ๋ฐฐ์—ด ๋ณ€ํ˜• ๋ฐฉ๋ฒ•์€ ํŠœํ”Œ ์œ ํ˜• ์ •์˜์— ์กด์žฌํ•˜์ง€ ์•Š์„ ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฉ”์†Œ๋“œ๋Š” ๋Ÿฐํƒ€์ž„ ์œ ํ˜•์„ ์ปดํŒŒ์ผ ์‹œ๊ฐ„ ์œ ํ˜•๊ณผ ์ผ์น˜ํ•˜์ง€ ์•Š๋„๋ก ๋ณ€๊ฒฝํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

@buu700 TypeScript 3.0์— ์˜ค์‹  ๊ฒƒ์„ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค: https://blogs.msdn.microsoft.com/typescript/2018/07/30/announcing-typescript-3-0/#richer -tuple-types

๋ฉ‹์ง„! ํฅ๋ฏธ๋กœ์šด ํƒ€์ด๋ฐ์ด๋„ค์š”. ๋‚˜๋Š” ์ถœ์‹œ ๋ฐœํ‘œ๋ฅผ ์—ด์—ˆ์ง€๋งŒ ์•„์ง ๊ทธ๊ฒƒ์„ ์ฝ์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. TypeScript(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);

๊ทธ๋Ÿฐ ๋‹ค์Œ ์ž„์˜ ์ธ๋ฑ์Šค ์•ก์„ธ์Šค๋ฅผ ์ˆ˜ํ–‰ํ•  ๋•Œ ๊ฒฐ๊ณผ๊ฐ€ ์ •์˜๋˜์ง€ ์•Š์•˜๋Š”์ง€ ํ™•์ธํ•ด์•ผ ํ•˜์ง€๋งŒ ์—ด๊ฑฐํ˜• ์ปฌ๋ ‰์…˜์„ ๋ฐ˜๋ณตํ•˜๋Š” ๋™์•ˆ์—๋Š” ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์—ฌ์ „ํžˆ ์ด๊ฒƒ์ด ๋ฏธํ•ด๊ฒฐ ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

TypeScript๋ฅผ ์ฒ˜์Œ ์ ‘ํ•˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋จธ๋กœ์„œ ์—„๊ฒฉ ๋ชจ๋“œ์—์„œ ๊ฐ์ฒด๋ฅผ ์ธ๋ฑ์‹ฑํ•˜๋Š” ์ƒํ™ฉ์ด ์ง๊ด€์ ์ด์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š”์ด ๋  ์ˆ˜์žˆ๋Š” ์กฐํšŒ์˜ ๊ฒฐ๊ณผ๋ฅผ ์˜ˆ์ƒํ–ˆ์„ ๊ฒƒ 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

์ด๊ฒƒ์€ VSCode ๋ฒ„์ „ 1.31.1์ž…๋‹ˆ๋‹ค.

@yawaramin tsconfig.json ์—์„œ strictNullChecks ํ™œ์„ฑํ™”๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค( strict ํ”Œ๋ž˜๊ทธ๋กœ๋„ ํ™œ์„ฑํ™”๋จ)

์‚ฌ์šฉ ์‚ฌ๋ก€์— ์•Œ ์ˆ˜ ์—†๋Š” ๊ธธ์ด์˜ ๋ฐฐ์—ด์— ๋Œ€ํ•œ ์ž„์˜์˜ ์ธ๋ฑ์‹ฑ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ undefined๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์ถ”๊ฐ€ํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค(๊ทธ ๋ถˆ์•ˆ์ „์„ฑ์„ "๋ฌธ์„œํ™”"ํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ).

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์—์„œ ํ•ญ์ƒ ๋งต์œผ๋กœ ์‚ฌ์šฉ๋˜๋ฏ€๋กœ TypeScript๋Š” ํ•ด๋‹น ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ์ง€์›ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํ•จ์ˆ˜ ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ๋ฐฐ์—ด ํŒŒ๊ดด๋กœ ์ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

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

์—ฌ๊ธฐ์„œ ๋‚˜๋Š” a ๊ฐ€ string | undefined ์œ ํ˜•์ด ๋  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•˜์ง€๋งŒ ๊ทธ๋ ‡๊ฒŒ ํ•˜์ง€ ์•Š๋Š” ํ•œ string .

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

์ฝ”๋“œ ๊ธฐ๋ฐ˜์— ๋‹จ์ผ for ๋ฃจํ”„๊ฐ€ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฏ€๋กœ ์ด ๋™์ž‘์„ ํ† ๊ธ€ํ•˜๊ธฐ ์œ„ํ•ด tsconfig์˜ ์ปดํŒŒ์ผ๋Ÿฌ ์˜ต์…˜(์ด๋ฆ„ strictIndexSignatures )์— ํ”Œ๋ž˜๊ทธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ ํ”„๋กœ์ ํŠธ๋ฅผ ์œ„ํ•ด.

์ด๊ฒƒ์ด ๋‚ด๊ฐ€ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค: https://github.com/danielnixon/total-functions/

์ข‹์€ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. TypeScript ํŒ€์—์„œ ์ด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜๊ธฐ๋ฅผ ์ง„์‹ฌ์œผ๋กœ ๋ฐ”๋ž๋‹ˆ๋‹ค.

ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ์ž‘์„ฑ๋œ ์ฝ”๋“œ์—์„œ ๊ฐ€์ •์„ ํ•˜๊ณ  ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๊ทธ๊ฒƒ์ด ์ €์žฅ๋˜์—ˆ๋‹ค๊ณ  ์ถ”๋ก ํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ IMHO๋ฅผ ์นจ๋ฌต์‹œํ‚ค์ง€ ์•Š๋Š” ํ•œ ์ปดํŒŒ์ผ๋Ÿฌ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด ๋™์ž‘์€ ์ƒˆ๋กœ์šด ์„ ํƒ์  ์—ฐ๊ฒฐ ์—ฐ์‚ฐ์ž์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์—๋„ ๋งค์šฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

Object.entries() ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋™์•ˆ ์˜ค๋Š˜ ์ง€๋„์™€ ํ•จ๊ป˜ | undefined ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

{[key: string]: string[]} ์˜ํ•ด ์ƒ๋‹นํžˆ ์ž˜ ์„ค๋ช…๋œ Index ์œ ํ˜•์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ๋ฌธ์ž์—ด ํ‚ค๊ฐ€ Index์— ํ‘œ์‹œ๋˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋ผ๋Š” ๋ช…๋ฐฑํ•œ ๊ฒฝ๊ณ ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ Index์—์„œ ์กฐํšŒํ•œ ๊ฐ’์„ ์†Œ๋น„ํ•˜๋ ค๊ณ  ํ•  ๋•Œ TS๊ฐ€ catchํ•˜์ง€ ์•Š๋Š” ๋ฒ„๊ทธ๋ฅผ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. ์ •์˜๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ๊ถŒ์žฅ๋Œ€๋กœ {[key: string]: string[] | undefined} ๋กœ ๋ณ€๊ฒฝํ–ˆ์ง€๋งŒ ์ด์ œ Object.entries() ์‚ฌ์šฉ์— ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. TypeScript๋Š” ์ด์ œ (์œ ํ˜• ์‚ฌ์–‘์— ๋”ฐ๋ผ ํ•ฉ๋ฆฌ์ ์œผ๋กœ) ์ธ๋ฑ์Šค์— ์ •์˜๋˜์ง€ ์•Š์€ ๊ฐ’์ด ์ง€์ •๋œ ํ‚ค๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋ฏ€๋กœ Object.entries() ํ˜ธ์ถœ ๊ฒฐ๊ณผ์— ์ •์˜๋˜์ง€ ์•Š์€ ๊ฐ’์ด ํฌํ•จ๋  ์ˆ˜ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ์ด๊ฒƒ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. undefined ๊ฒฐ๊ณผ๋ฅผ ์–ป์–ด์•ผ ํ•˜๋Š” ์œ ์ผํ•œ ์‹œ๊ฐ„์€ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ํ‚ค๋ฅผ ์ฐพ๋Š” ๊ฒƒ์ด๋ฉฐ Object.entries() ์‚ฌ์šฉํ•  ๋•Œ ๋‚˜์—ด๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ TypeScript๋ฅผ ํ–‰๋ณตํ•˜๊ฒŒ ๋งŒ๋“ค๋ ค๋ฉด ์กด์žฌ ์ด์œ ๊ฐ€ ์—†๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ฑฐ๋‚˜ ๊ฒฝ๊ณ ๋ฅผ ๋ฌด์‹œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@RyanCavanaugh , ์ด์— ๋Œ€ํ•œ ๊ท€ํ•˜์˜ ์›๋ž˜ ๋‹ต๋ณ€ ์ด ์—ฌ์ „ํžˆ TS ํŒ€์˜ ํ˜„์žฌ ์œ„์น˜๋ผ๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๊นŒ? ์•„๋ฌด๋„ ์Šค๋ ˆ๋“œ๋ฅผ ์ฝ์ง€ ์•Š๊ณ  ๋” ๊ฐ•๋ ฅํ•œ JS ์ปฌ๋ ‰์…˜ ํ”„๋ฆฌ๋ฏธํ‹ฐ๋ธŒ์— ๋Œ€ํ•œ ๋ช‡ ๋…„์˜ ๊ฒฝํ—˜์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ , ์ดํ›„๋กœ ์—„๊ฒฉํ•จ์„ ๋†’์ด๊ธฐ ์œ„ํ•ด ๋ช‡ ๊ฐ€์ง€ ๋‹ค๋ฅธ ์˜ต์…˜์„ ๋„์ž…ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‘˜ ๋‹ค ์ด์— ๋Œ€ํ•œ ์ถฉ๋Œ์ž…๋‹ˆ๋‹ค.

(์—ฌ์ „ํžˆ ๋‚˜์—๊ฒŒ ๋‹ค์†Œ ์„ค๋“๋ ฅ์ด ์—†๋Š” ์˜ˆ์ œ๊ฐ€ ์žˆ์ง€๋งŒ ์ด ์Šค๋ ˆ๋“œ๋Š” ์ด๋ฏธ ๋ชจ๋“  ์ฃผ์žฅ์„ ํ–ˆ์œผ๋ฉฐ ๋‹ค๋ฅธ ์˜๊ฒฌ์€ ์•„๋ฌด ๊ฒƒ๋„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค)

๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์ž์‹ ์˜ lib.d.ts๋ฅผ ์ˆ˜์ •ํ•˜๊ณ  ์ž์‹ ์˜ ์ฝ”๋“œ์—์„œ ๋ชจ๋“  ๋‹ค์šด์ŠคํŠธ๋ฆผ ์ค‘๋‹จ์„ ์ˆ˜์ •ํ•˜๊ณ  ์ด๊ฒƒ์ด ๊ฐ€์น˜ ์ œ์•ˆ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Œ์„ ๋ณด์—ฌ์ฃผ๊ธฐ ์œ„ํ•ด ์ „์ฒด diff๊ฐ€ ์–ด๋–ป๊ฒŒ ๋ณด์ด๋Š”์ง€ ๋ณด์—ฌ์ฃผ๊ณ  ์‹ถ๋‹ค๋ฉด ์šฐ๋ฆฌ๋Š” ํ•ด๋‹น ๋ฐ์ดํ„ฐ์— ์—ด๋ ค ์žˆ์Šต๋‹ˆ๋‹ค.

@RyanCavanaugh ๋‹ค์Œ์€ ์ผ๋ถ€ ๋Ÿฐํƒ€์ž„ ์ถฉ๋Œ์ด ์ž ์ž๊ณ  ์žˆ๋Š” ๋‚ด ์ฝ”๋“œ ๊ธฐ๋ฐ˜์˜ ๋ช‡ ๊ฐ€์ง€ ์‚ฌ๋ก€์ž…๋‹ˆ๋‹ค. ์ด ๋•Œ๋ฌธ์— ํ”„๋กœ๋•์…˜์—์„œ ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•˜์—ฌ ํ•ซํ”ฝ์Šค๋ฅผ ๋ฆด๋ฆฌ์Šคํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์ด๋ฏธ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

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);

TypeScript๋Š” 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);
  }
}

TypeScript๋Š” "์ด๋ด, ๊ทธ ์ธ๋ฑ์Šค ํ‘œํ˜„์‹์€ | 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 ๋ฅผ ๋ˆ„๋ฅด๋˜ ๋•Œ del y ๋ฅผ ๋ˆ„๋ฅด๋Š” ๋ฐฉ๋ฒ•์„ ๋งค์šฐ ๋นจ๋ฆฌ ๋ฐฐ์šฐ๊ณ  ์ค‘์š”ํ•œ ํ•ญ๋ชฉ์„ ์‚ญ์ œํ•˜์ง€ ์•Š์„ ํ™•๋ฅ ์ด ์‚ฌ์ „ ์„ค์ •์œผ๋กœ ์žฌ์„ค์ •๋ฉ๋‹ˆ๋‹ค. -๋Œ€ํ™” ๊ธฐ์ค€์„ . ํŒŒ์ผ์ด ํœด์ง€ํ†ต์œผ๋กœ ์ด๋™ํ•˜์ง€ ์•Š์„ ๋•Œ ํŒŒ์ผ์„ ์‚ญ์ œํ•  ๋•Œ๋งŒ ๋Œ€ํ™” ์ƒ์ž๊ฐ€ ํ‘œ์‹œ๋œ๋‹ค๋ฉด ์ด์ œ ์˜๋ฏธ ์žˆ๋Š” ์•ˆ์ „์„ ํ™•๋ณดํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์šฐ๋ฆฌ๋Š” ๊ฐœ์ฒด ํ‚ค๊ฐ€ ์•ˆ์ „ํ•œ์ง€ ์—ฌ๋ถ€๋ฅผ ์•Œ์ง€ ๋ชปํ•˜๊ธฐ ๋•Œ๋ฌธ์— "๋‹น์‹ ์ด ์ •๋ง๋กœ ๊ทธ ๊ฐœ์ฒด๋ฅผ ์ธ๋ฑ์‹ฑํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?"๋ผ๊ณ  ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ํ•  ๋•Œ๋งˆ๋‹ค ๋Œ€ํ™” ์ƒ์ž๊ฐ€ ํ‘œ์‹œ๋˜์ง€ ์•Š๋Š” ๊ฒƒ๋ณด๋‹ค ๋” ๋‚˜์€ ์†๋„๋กœ ๋ฒ„๊ทธ๋ฅผ ์ฐพ์„ ๊ฐ€๋Šฅ์„ฑ์ด ์—†์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ํŒŒ์ผ ์‚ญ์ œ ๋Œ€ํ™” ์ƒ์ž์˜ ๋น„์œ ์— ๋™์˜ํ•˜์ง€๋งŒ ์ด ๋น„์œ ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์ •์˜๋˜์ง€ ์•Š์•˜๊ฑฐ๋‚˜ null์ผ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋Š” ๊ฒƒ์„ ๊ฐ•์ œ๋กœ ํ™•์ธํ•˜๋„๋ก ํ™•์žฅ๋  ์ˆ˜๋„ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด ์„ค๋ช…์€ ์‹ค์ œ๋กœ ์˜๋ฏธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์ด ์„ค๋ช…์ด ์‚ฌ์‹ค์ด๋ผ๋ฉด, strictNullChecks ์˜ต์…˜์€ ๋™์ผํ•œ ๋™์ž‘์„ ์œ ๋„ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด document.getElementById ์‚ฌ์šฉํ•˜์—ฌ DOM์—์„œ ์ผ๋ถ€ ์š”์†Œ๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋งŽ์€ TypeScript ์‚ฌ์šฉ์ž๋Š” ์ถ”์ ํ•˜๊ธฐ ๋งค์šฐ ์–ด๋ ค์šด Cannot access property X of undefined ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ๋Œ€์‹  ์ด๋Ÿฌํ•œ ์˜ˆ์™ธ์ ์ธ ๊ฒฝ์šฐ๋ฅผ ์ ์ ˆํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ด๋Ÿฌํ•œ ์ฝ”๋“œ์— ๋Œ€ํ•ด ํ”Œ๋ž˜๊ทธ๋ฅผ ํ‘œ์‹œํ•˜๊ธฐ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค.

๊ฒฐ๊ตญ์—๋Š” ์ด๋Ÿฌํ•œ ์ข…๋ฅ˜์˜ ๊ธฐ๋Šฅ์ด ์ถ”๊ฐ€ TypeScript ์ปดํŒŒ์ผ๋Ÿฌ ์˜ต์…˜์œผ๋กœ ๊ตฌํ˜„๋  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ TypeScript๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์–ดํ•˜๊ณ  ์œ„ํ—˜ํ•œ ์ฝ”๋“œ์— ๋Œ€ํ•ด ๊ฒฝ๊ณ ํ•˜๊ธฐ๋ฅผ ์›ํ•˜๋Š” ์ด์œ ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์–ด๋ ˆ์ด ๋˜๋Š” ๊ฐœ์ฒด์— ๋Œ€ํ•œ ์•ก์„ธ์Šค๊ฐ€ ์ž˜๋ชป๋˜์—ˆ๋‹ค๋Š” ์ด์•ผ๊ธฐ๋Š” ๊ฑฐ์˜ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด ์ฃผ์žฅ์„ ๋’ท๋ฐ›์นจํ•  ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด ๊ทธ๋ƒฅ ์ž„์˜์˜ ์ง๊ฐ์— ๊ทผ๊ฑฐํ•œ ๊ฒƒ์ž…๋‹ˆ๊นŒ?

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

TypeScript์˜ ์ œ์–ด ํ๋ฆ„ ๊ธฐ๋ฐ˜ ์œ ํ˜• ๋ถ„์„์€ ์ด ๊ฒฝ์šฐ๊ฐ€ ์•ˆ์ „ํ•˜๊ณ  ! ํ•„์š”ํ•˜์ง€ ์•Š์Œ์„ ์ธ์‹ํ•˜๋„๋ก ๊ฐœ์„ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ธ๊ฐ„์ด ์•ˆ์ „ํ•˜๋‹ค๊ณ  ์ถ”๋ก ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ปดํŒŒ์ผ๋Ÿฌ๋„ ๊ทธ๋ ‡๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋‚˜๋Š” ์ด๊ฒƒ์ด ์ปดํŒŒ์ผ๋Ÿฌ์—์„œ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

TypeScript์˜ ์ œ์–ด ํ๋ฆ„ ๊ธฐ๋ฐ˜ ์œ ํ˜• ๋ถ„์„์€ ์ด ๊ฒฝ์šฐ๋ฅผ ์•ˆ์ „ํ•˜๋‹ค๊ณ  ์ธ์‹ํ•˜๋„๋ก ๊ฐœ์„ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ •๋ง ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

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 ๋‹ค๋ฅธ ์˜ˆ๋ฅผ ๋“ค์–ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

```
$ ๋…ธ๋“œ

์ƒ์ˆ˜ ์˜ค๋ฅ˜ = []
์ฐพ์œผ์‹œ๋Š” ์ฃผ์†Œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค
arr[7] = 7
7
์•„
[ <7๊ฐœ์˜ ๋นˆ ํ•ญ๋ชฉ>, 7 ]
for (let i = 0; i < arr.length; i++) {
... console.log(arr[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 ํฌ์†Œ ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ Typescript๋Š” ์ด๋ฏธ ์˜ฌ๋ฐ”๋ฅธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. --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]

์œ„์˜ ์ฝ”๋“œ๋Š” getBlock ์˜ ์ผ๋ถ€ ์‚ฌ์šฉ์ด ์ •์˜๋˜์ง€ ์•Š์€(์˜ˆ getBlock('hello') )์„ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์— strictNullChecks ์•„๋ž˜์—์„œ ์ปดํŒŒ์ผ๋Ÿฌ ๊ฒ€์‚ฌ๋ฅผ ์ •์ƒ์ ์œผ๋กœ ํ†ต๊ณผํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค. ๋‚ด ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ํญ๋ฐœ์‹œํ‚ค์ง€ ์•Š๊ณ  ์ •์˜๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ๋ฅผ ์ •์ƒ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ์ปดํŒŒ์ผ๋Ÿฌ์—์„œ ๋ฐœ์ƒ ํ”Œ๋ž˜๊ทธ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ด๊ฒƒ์€ arr.slice(-1)[0] ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐฐ์—ด์˜ ๋งˆ์ง€๋ง‰ ์š”์†Œ์— ์•ก์„ธ์Šคํ•˜๊ฑฐ๋‚˜ ์ฒซ ๋ฒˆ์งธ ์š”์†Œ arr[0] ๋“ฑ์— ์•ก์„ธ์Šคํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ๋งŽ์€ ์ผ๋ฐ˜์ ์ธ ๊ด€์šฉ๊ตฌ์—๋„ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

๊ถ๊ทน์ ์œผ๋กœ ์ €๋Š” TypeScript๊ฐ€ ํญ๋ฐœ์ ์ธ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๊ทธ๋Ÿฌํ•œ ์˜ค๋ฅ˜์— ๋Œ€ํ•ด ์ €๋ฅผ ๊ท€์ฐฎ๊ฒŒ ํ•˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

์ด ํ•จ์ˆ˜๋Š” ๋ฃจํ”„๋ฅผ ํ†ตํ•œ ๋‘ ๋ฒˆ์งธ ํŒจ์Šค์—์„œ ์ •์˜๋˜์ง€ ์•Š์€ ๊ฒƒ์„ someFunc์— ์ „๋‹ฌํ•ฉ๋‹ˆ๊นŒ? ๋‚ด๊ฐ€ someFunc์— ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ๋งŽ์€ ๊ฒƒ๋“ค์ด ๋‚˜์ค‘์— ์ •์˜๋˜์ง€ ์•Š์€ ๊ฒƒ์ด ๋‚˜ํƒ€๋‚˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@RyanCavanaugh ์˜ˆ, JavaScript๋Š” ๋ถˆ๋ณ€์„ฑ์„ ์ œ๊ณตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ! ๊ฐ€ ํ•„์š”ํ•˜๊ฑฐ๋‚˜ ReadonlyArray ๋ฐฐ์—ด someFunc(arr: ReadonlyArray<number>, i: number) ํ•ฉ๋‹ˆ๋‹ค.

@yawaramin ํฌ์†Œ ๋ฐฐ์—ด์˜ ๊ฒฝ์šฐ TypeScript๊ฐ€ ํŠœํ”Œ์ฒ˜๋Ÿผ ์‚ฌ์šฉ๋œ๋‹ค๊ณ  ์ถ”๋ก ํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ ์š”์†Œ ์œ ํ˜•์— 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
}

์ด๋ด, ๋‚˜๋Š” ๊ทธ ๊ตฌ๋ฌธ์„ ์•Œ๊ณ ์žˆ๋‹ค; ์ €๋Š” ์ด๋Ÿฐ ๋ฃจํ”„๋ฅผ 1๋…„์— ํ•œ ๋ฒˆ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค!

์‹ค์ œ๋กœ ๋ฐฐ์—ด์— ๋Œ€ํ•œ ์ธ๋ฑ์Šค๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ์‹ค์ œ๋กœ ๋‚˜์ค‘์— undefined ๋ฅผ ํ™•์ธํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

์ด ํŠน๋ณ„ํ•œ ๊ฒฝ์šฐ๋ฅผ ๋‹ค๋ฃจ๊ธฐ ์–ด๋ ต๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ์— ๋Œ€ํ•œ ๋‘๋ ค์›€์€ ๊ณผ์žฅ๋œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์š”์†Œ๋ฅผ ๋ฐ˜๋ณตํ•˜๋ ค๋Š” ๊ฒฝ์šฐ for .. of ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์–ด๋–ค ์ด์œ ๋กœ ์š”์†Œ ์ธ๋ฑ์Šค๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ forEach ํ•˜๊ฑฐ๋‚˜ entries ๋ฐ˜๋ณตํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์ธ๋ฑ์Šค ๊ธฐ๋ฐ˜ for ๋ฃจํ”„๊ฐ€ ์‹ค์ œ๋กœ ํ•„์š”ํ•œ ๊ฒฝ์šฐ๋Š” ๊ทนํžˆ ๋“œ๋ญ…๋‹ˆ๋‹ค.

ํ˜„์ƒ ์œ ์ง€๋ฅผ ์›ํ•˜๋Š” ๋” ๋‚˜์€ ์ด์œ ๊ฐ€ ์žˆ๋‹ค๋ฉด ๋ณด๊ณ  ์‹ถ์ง€๋งŒ ๊ด€๊ณ„ ์—†์ด: ์ด๊ฒƒ์€ ์‹œ์Šคํ…œ์˜ ๋ถˆ์ผ์น˜์ด๋ฉฐ ์ˆ˜์ • ํ”Œ๋ž˜๊ทธ๊ฐ€ ์žˆ์œผ๋ฉด ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ๋†’์ด ํ‰๊ฐ€ํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š” ์—ฌ๋Ÿฌ๋ถ„, ์ €๋Š” ์—ฌ๊ธฐ์„œ ํ† ๋ก ์˜ ๋งŽ์€ ๋ถ€๋ถ„์ด
๊ฐ€์กŒ๋‹ค. ํŒจํ‚ค์ง€ ์†Œ์œ ์ž๋Š” ์ž์‹ ์˜ ์ถ”๋ก ๊ณผ
์ด๋ฏธ ์ด๋Ÿฌํ•œ ์ฃผ์žฅ์˜ ๋Œ€๋ถ€๋ถ„์„ ๊ณ ๋ คํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค์ด ํ•ด๊ฒฐํ•  ๊ณ„ํš์ด๋ผ๋ฉด
๋‚˜๋Š” ๊ทธ๋“ค์ด ๊ทธ๊ฒƒ์„ ์•Œ๋ฆด ๊ฒƒ์ด๋ผ๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ์™ธ์—๋Š” ์ƒ๊ฐํ•˜์ง€ ์•Š๋Š”๋‹ค.
์Šค๋ ˆ๋“œ๋Š” ์ •๋ง ์ƒ์‚ฐ์ ์ž…๋‹ˆ๋‹ค.

2019๋…„ 10์›” 25์ผ ๊ธˆ์š”์ผ ์˜ค์ „ 11์‹œ 59๋ถ„ brunnerh [email protected]์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์˜์‹์ ์ธ ๊ฒฐ์ •์ž…๋‹ˆ๋‹ค. ์ด ์ฝ”๋“œ๊ฐ€
์˜ค๋ฅ˜๊ฐ€ ๋˜๋‹ค:

var a = [];for (var i =0; i< a.length; i++) {
a[i]+=1; // a[i]๋Š” ์ •์˜๋˜์ง€ ์•Š์•˜์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
}

์ด๋ด, ๋‚˜๋Š” ๊ทธ ๊ตฌ๋ฌธ์„ ์•Œ๊ณ ์žˆ๋‹ค; ์ €๋Š” ์ด๋Ÿฐ ๋ฃจํ”„๋ฅผ 1๋…„์— ํ•œ ๋ฒˆ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค!

์‹ค์ œ๋กœ ๋ฐฐ์—ด์— ๋Œ€ํ•œ ์ธ๋ฑ์Šค๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ์—๋Š”
์‹ค์ œ๋กœ ๋‚˜์ค‘์— undefined๋ฅผ ํ™•์ธํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

์ด ํŠน๋ณ„ํ•œ ๊ฒฝ์šฐ๋ฅผ ๋‹ค๋ฃจ๊ธฐ ์–ด๋ ต๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ์— ๋Œ€ํ•œ ๋‘๋ ค์›€์€ ๊ณผ์žฅ๋œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
์š”์†Œ์— ๋Œ€ํ•ด ๋ฐ˜๋ณตํ•˜๋ ค๋Š” ๊ฒฝ์šฐ .. of์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งŒ์•ฝ์—
์–ด๋–ค ์ด์œ ๋กœ ์š”์†Œ ์ธ๋ฑ์Šค๊ฐ€ ํ•„์š”ํ•˜๋ฉด forEach๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ๋ฐ˜๋ณตํ•˜์‹ญ์‹œ์˜ค.
ํ•ญ๋ชฉ. ์ผ๋ฐ˜์ ์œผ๋กœ ์ •๋ง ํ•„์š”ํ•œ ๊ฒฝ์šฐ๋Š” ๊ทนํžˆ ๋“œ๋ญ…๋‹ˆ๋‹ค.
์ธ๋ฑ์Šค ๊ธฐ๋ฐ˜ for ๋ฃจํ”„.

ํ˜„์ƒ ์œ ์ง€๋ฅผ ์›ํ•˜๋Š” ๋” ๋‚˜์€ ์ด์œ ๊ฐ€ ์žˆ๋‹ค๋ฉด
๋ณด๊ณ  ์‹ถ์ง€๋งŒ ๊ด€๊ณ„์—†์ด : ์ด๊ฒƒ์€ ์‹œ์Šคํ…œ์˜ ๋ถˆ์ผ์น˜์ž…๋‹ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์„ ๊ณ ์น  ๊นƒ๋ฐœ์ด ์žˆ์œผ๋ฉด ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ๋†’์ด ํ‰๊ฐ€ํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

โ€”
๋‹น์‹ ์ด ๋Œ“๊ธ€์„ ๋‹ฌ์•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ๋ฐ›๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ณ  GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/microsoft/TypeScript/issues/13778?email_source=notifications&email_token=ACAJU3DQ7U6Y3MUUM26J4JDQQM62XA5CNFSM4C6KEKAKY45CNFSM4C6KEKAKYYY3PNVWWK3TUL52HS4DFVEXG43NVMVBW6
๋˜๋Š” ๊ตฌ๋… ์ทจ์†Œ
https://github.com/notifications/unsubscribe-auth/ACAJU3EWVM3CUFG25UF5PGDQQM62XANCNFSM4C6KEKAA
.

ํŒจํ‚ค์ง€ ์†Œ์œ ์ž์˜ ์›€์ง์ž„์ด ์—†์„ ์ˆ˜๋„ ์žˆ์ง€๋งŒ ์ปค๋ฎค๋‹ˆํ‹ฐ์˜ ์ง€์†์ ์ธ ํ”ผ๋“œ๋ฐฑ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹๊ฐ€์น˜๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ๋” ๋‚˜์€ ๋„๊ตฌ์— ๋Œ€ํ•œ ์š”๊ตฌ๊ฐ€ ์—ฌ์ „ํžˆ ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

@brunnerh ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ์š”์ฆ˜์€ ์„ฑ๋Šฅ ํŠœ๋‹์„ ์œ„ํ•œ ๊ฒƒ์ด ์•„๋‹ˆ๋ฉด for ๋ฃจํ”„๋ฅผ ์‚ฌ์šฉํ•  ํ•„์š”์กฐ์ฐจ ์—†์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋Œ€๋ถ€๋ถ„์˜ ์‹œ๊ฐ„ ๋งต์„ ๋ณ€๊ฒฝํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํšŒ์‚ฌ ์ฝ”๋“œ๋ฒ ์ด์Šค์—์„œ 0%์˜ ์‹œ๊ฐ„์ด ๋ฐœ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. /filter/reduce to for ๋ฃจํ”„๋Š” ์„ฑ๋Šฅ์„ ๊ฑฐ์˜ ํ–ฅ์ƒ์‹œํ‚ค์ง€ ์•Š์œผ๋ฉฐ ์‹ค์ œ ์›์ธ์€ ํ•ญ์ƒ ๋น„ํšจ์œจ์ ์ธ ๋…ผ๋ฆฌ, ๋„คํŠธ์›Œํฌ ๋ฌธ์ œ ๋ฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ์— ์žˆ์Šต๋‹ˆ๋‹ค.

์•„์ง ์•„๋ฌด๋„ 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. undefined ๋ฅผ ์š”์†Œ ์ธ์ˆ˜๋กœ ์ „๋‹ฌํ•˜์ง€ ์•Š๋Š” forEach , map ๋ฐ filter ์˜ ์„œ๋ช…์„ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค(ํ•ด๋‹น ์ธ๋ฑ์Šค๊ฐ€ ๋ช…์‹œ์ ์œผ๋กœ ๊ทธ๋ ‡๊ฒŒ ์„ค์ •๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ). ๊ทธ ๊ธฐ๋Šฅ์„ ์–ผ๋งˆ๋‚˜ ์‚ฌ์šฉํ•˜๋Š๋ƒ์— ๋”ฐ๋ผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ๊ท€์ฐฎ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋˜ํ•œ ์ด๊ฒƒ์ด eslint/typescript์—์„œ ๋งŽ์€ ์˜คํƒ์„ ์œ ๋ฐœํ•œ๋‹ค๋Š” ์ ์—์„œ ์ฐจ์ž„ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

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

Eslint๋Š” foo๊ฐ€ ๊ฒฐ์ฝ” null์ด ๋  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์ด ๋ถˆํ•„์š”ํ•œ ๊ฒ€์‚ฌ๋ผ๊ณ  ์œ ํ˜•์—์„œ ์ถ”๋ก ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด์ œ ๋ฐฐ์—ด์—์„œ ๋ฐ˜ํ™˜๋œ ํ•ญ๋ชฉ์— ๋Œ€ํ•ด null ๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์„ ์˜์‹์ ์œผ๋กœ ๊ธฐ์–ตํ•ด์•ผ ํ•  ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ eslint ๋น„ํ™œ์„ฑํ™” ๋ผ์ธ์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด์™€ ๊ฐ™์€ for ๋ฃจํ”„ ์™ธ๋ถ€์— ์•ก์„ธ์Šคํ•˜๋Š” ๊ฒƒ์ด ์‚ฌ์‹ค์ƒ ๋ฐฐ์—ด ์•ก์„ธ์Šค๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. (์š”์ฆ˜ ๋Œ€๋ถ€๋ถ„์˜ TS ๊ฐœ๋ฐœ์ž์ฒ˜๋Ÿผ) ๋ฐฐ์—ด์„ ๋ฐ˜๋ณตํ•  ๋•Œ forEach/map/filter/etc ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

strict ๊ฐ€ true์ด๋ฉด ๊ธฐ๋ณธ์ ์œผ๋กœ true๋กœ ์„ค์ •๋˜๋Š” ์ƒˆ ์ปดํŒŒ์ผ๋Ÿฌ ํ”Œ๋ž˜๊ทธ๊ฐ€ ์žˆ์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ๋žŒ๋“ค์ด ์ด๋ฅผ ์ข‹์•„ํ•˜์ง€ ์•Š์œผ๋ฉด ์˜ตํŠธ์•„์›ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์–ด์จŒ๋“  ์ตœ์‹  ๋ฒ„์ „์— ์ƒˆ๋กœ์šด ์—„๊ฒฉํ•œ ์ปดํŒŒ์ผ๋Ÿฌ ๊ฒ€์‚ฌ๋ฅผ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋‚ด๊ฐ€ ์ตœ๊ทผ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ๋ณธ ์œ ํ˜• ์‹œ์Šคํ…œ์˜ ์˜ค๋ฅ˜์ธ _only_ ๋Ÿฐํƒ€์ž„ ์ œํ’ˆ ๋ฒ„๊ทธ์˜ ๊ฐ€๋Šฅ์„ฑ์ด ๋งค์šฐ ๋†’์€ ์†Œ์Šค์ž…๋‹ˆ๋‹ค.

ํ˜„์žฌ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์„ ํƒ์  ์—ฐ๊ฒฐ ์—ฐ์‚ฐ์ž์˜ ์ธ์ฒด ๊ณตํ•™์„ ๊ณ ๋ คํ•  ๋•Œ ํ”Œ๋ž˜๊ทธ๋ฅผ ํ†ตํ•ด ์ด ๋™์ž‘์„ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜์ง€ _ํ•˜์ง€_ ์•Š๊ธฐ๋กœ ํ•œ ๊ฒฐ์ •์„ ๋‹ค์‹œ ๊ฒ€ํ† ํ•ด์•ผ ํ•  ๋•Œ์ž…๋‹ˆ๊นŒ?

์„œ๋ฒ„์—์„œ 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; 

์ด๊ฒƒ์€ API ์„ค๊ณ„์˜ ๋ฌธ์ œ์ผ ์ˆ˜๋„ ์žˆ์ง€๋งŒ TS๋Š” ๋ฐฐ์—ด์— ์žˆ๋Š” ๋ฌด์–ธ๊ฐ€์— ์•ก์„ธ์Šคํ•  ๋•Œ ์‹ค์ œ๋กœ ์กด์žฌํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์„ ์ดํ•ดํ•ด์•ผ ํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

ํŽธ์ง‘: "๋‚ด๊ฐ€ ์ž‘์—… ์ค‘์ธ ํŒ€์—์„œ ๋งŒ๋“  API"์—์„œ์™€ ๊ฐ™์ด "์šฐ๋ฆฌ API"๋ฅผ ์˜๋ฏธํ–ˆ์Œ์„ ๋ช…ํ™•ํžˆ ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค

์˜ˆ, ๋ชจ๋‘๊ฐ€ TS๊ฐ€ ์™„์ „ํžˆ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ๋จผ ์‹œ๊ฐ„์— ํ˜„๋Œ€์ ์ธ ๋งค์šฐ ๋‚˜์œ ๋””์ž์ธ ๊ฒฐ์ •์ด๋ผ๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค.

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์œผ๋กœ ์ž‘์€ ๋”ํ‹ฐ ํ•ต์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. package.json ๊ฐ„๋‹จํ•œ ์„ค์น˜ ํ›„ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

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

๋ฌผ๋ก  Windows์—์„œ๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์ง€๋งŒ ์—†๋Š” ๊ฒƒ๋ณด๋‹ค๋Š” ๋‚ซ์Šต๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ์™€ ์ธ์ ‘ํ•˜์—ฌ ์‹คํ–‰๋˜๋Š” ๋‹ค๋ฅธ ๋ชจ๋“  ๋ฌธ์ œ๋Š” ์—ฌ๊ธฐ๋กœ ๋ฆฌ๋””๋ ‰์…˜๋˜๋Š” ๊ฒƒ ๊ฐ™์œผ๋ฏ€๋กœ ์—ฌ๊ธฐ๊ฐ€ ๊ฐ€์žฅ ์ข‹์€ ์งˆ๋ฌธ์ด๋ผ๊ณ  ๊ฐ€์ •ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ํ…Œ์ด๋ธ”์—์„œ ์„ ํƒ์  ์ธ๋ฑ์Šค ์„œ๋ช…์— ๋Œ€ํ•œ ์ถ•์•ฝ ๊ตฌ๋ฌธ์ž…๋‹ˆ๊นŒ? @martpie๊ฐ€ ์ง€์ ํ–ˆ๋“ฏ์ด interface Foo { [k: string]?: Bar; } ๋ณด๋‹ค ์ธ์ฒด๊ณตํ•™์ ์ด์ง€ ์•Š์€ interface Foo { [k: string]: Bar | undefined; } ์„ ์ž‘์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

?: ๊ตํ™˜์› ์ง€์›์„ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด ๊ทธ ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์ฆ‰, ๋‹จ์ผ ์†์„ฑ ์ •์˜๋ฅผ ์œ„ํ•œ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๊ธฐ์— ์ธ์ฒด๊ณตํ•™์  ์ด์ ์ด ์ถฉ๋ถ„ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ธ๋ฑ์Šค ์„œ๋ช…์— "์ถฉ๋ถ„ํžˆ ๋„์›€์ด ๋˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ?"

type Foo = { [_ in string]?: Bar } ๋„ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ์˜์ง€๋Š” ์•Š์ง€๋งŒ ์ƒ๋‹นํžˆ ๊ฐ„๊ฒฐํ•ฉ๋‹ˆ๋‹ค. ์›ํ•˜๋Š” ๊ฒฝ์šฐ ์ž์‹ ๋งŒ์˜ Dict ์œ ํ˜•์„ ๋งŒ๋“ค ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ?: ํ™•์žฅ์— ๋Œ€ํ•ด ๋…ผ์Ÿํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ "Javascript: Bad Parts" ์ด์•ผ๊ธฐ ์ค‘ ํ•˜๋‚˜์ฒ˜๋Ÿผ ๋Š๊ปด์ง€๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค.

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 Array์˜ ์‹ค์ œ ํ•จ์ˆ˜์˜ ๊ฒฝ์šฐ ์˜ฌ๋ฐ”๋ฅธ ์œ ํ˜•์„ ์ถœ๋ ฅํ•˜๋Š” ๊ณ ์œ ํ•œ ์œ ํ˜• ์ •์˜๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์ด ๋ฌธ์ œ๊ฐ€ ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์˜ˆ: map : https://github.com/microsoft /TypeScript/blob/master/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๋ฅผ ์žฌ์ •์˜ํ•˜๋Š” ์šฐ์•„ํ•œ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ ์•„๋‹ˆ๋ฉด ์‚ฌํ›„ ์„ค์น˜ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๊นŒ?

์šฐ๋ฆฌ ํ”„๋กœ์ ํŠธ์—๋Š” 1) typescript์˜ ๊ธฐ๋ณธ ์œ ํ˜• ์ •์˜์— ์•„์ง ํฌํ•จ๋˜์ง€ ์•Š์€ ๋‚ด์žฅ API์— ๋Œ€ํ•œ ์œ ํ˜• ์ •์˜๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•˜๋Š” global.d.ts ํŒŒ์ผ์ด ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: ๋ธŒ๋ผ์šฐ์ € ๊ฐ„์— ์ง€์†์ ์œผ๋กœ ๋ณ€๊ฒฝ๋˜๊ณ  ์ผ๊ด€์„ฑ์ด ์—†๋Š” WebRTC ๊ด€๋ จ API). ) ๋ฐ 2) ํƒ€์ดํ”„ ๋ผ์ดํ„ฐ์˜ ๊ธฐ๋ณธ ์œ ํ˜• ์ •์˜์˜ ์ผ๋ถ€๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋“œ (์˜ˆ : ์œ ํ˜• ์˜ค๋ฒ„๋ผ์ด๋“œ (override) Object.entries ๊ฐ€ ํฌํ•จ ๋œ ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ํ•˜๋„๋ก unknown ๋Œ€์‹  any ).

์ด ์ ‘๊ทผ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด typescript์˜ ๋ฐฐ์—ด ์œ ํ˜•์„ ์žฌ์ •์˜ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์ง€๋งŒ ์‹œ๋„ํ•ด ๋ณผ ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์œ„์˜ ๋‚ด์šฉ์€ ์„ ์–ธ ๋ณ‘ํ•ฉ์ด ์›ํ•˜๋Š” ๊ฒฐ๊ณผ๋ฅผ ์ œ๊ณตํ•  ๋•Œ ์ž‘๋™ํ•˜์ง€๋งŒ ๋‹จ์ˆœํ™”ํ•˜๊ธฐ ์œ„ํ•ด ์ธํ„ฐํŽ˜์ด์Šค์™€ ๊ต์ฐจํ•˜์ง€๋งŒ ์—ฌ๊ธฐ์„œ๋Š” ๋œ ์ œํ•œ์ ์ธ ์˜ต์…˜์ด ์›ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋Œ€์‹  tsconfig.json ์˜ files ๋˜๋Š” include ํฌํ•จ๋œ ํ”„๋กœ์ ํŠธ์— ์‚ฌ์šฉ ์ค‘์ธ ๋ชจ๋“  lib.*.d.ts ํŒŒ์ผ์„ ๋ณต์‚ฌํ•˜์—ฌ ๋ถ™์—ฌ๋„ฃ์€ ๋‹ค์Œ ํŽธ์ง‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹น์‹ ์ด ์›ํ•˜๋Š” ๊ฒƒ. /// <reference no-default-lib="true"/> ํฌํ•จ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ ๋งˆ๋ฒ•์€ ํ•„์š”ํ•˜์ง€ ์•Š์ง€๋งŒ /// <reference lib="..."/> ์ข…์†์„ฑ์„ ์ œ๊ฑฐํ•ด์•ผ ํ•˜๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฌผ๋ก  ์ด๊ฒƒ์€ ๋ชจ๋“  ๋ช…๋ฐฑํ•œ ์œ ์ง€ ๊ด€๋ฆฌ์ƒ์˜ ์ด์œ ๋กœ ์ข‹์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@butchler ์šฐ๋ฆฌ๋„ ์ด ์ ‘๊ทผ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์ง€๋งŒ ์ธ๋ฑ์‹ฑ ์—ฐ์‚ฐ์ž๋ฅผ ์žฌ์ •์˜ํ•˜๋Š” ๊ฒƒ์€ ๋ถˆ๊ฐ€๋Šฅํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์˜€์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ Array ํ•จ์ˆ˜( 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 } ์™€ ๊ฐ™์€ ์œ ํ˜•์„ ์ง€์ •ํ•˜๋Š” ๊ฒƒ์€ ํ•ด๊ฒฐ์ฑ…์ด ์•„๋‹™๋‹ˆ๋‹ค. undefined ๊ฐ’์„ ํฌํ•จํ•˜์ง€ ์•Š๋Š” Object.values(x).forEach(...) ์™€ ๊ฐ™์€ ๋ฐ˜๋ณต์ž์— ๋Œ€ํ•œ ์ž…๋ ฅ์„ ์—‰๋ง์œผ๋กœ ๋งŒ๋“ค๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

someObject[someKey] ์ˆ˜ํ–‰ํ•œ ํ›„ undefined ๋ฅผ ํ™•์ธํ•˜์ง€ ์•Š์„ ๋•Œ TypeScript์—์„œ ์˜ค๋ฅ˜๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์„ ๋ณด๊ณ  ์‹ถ์ง€๋งŒ 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);

๋‚˜๋Š” ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ๋ช‡ ๊ฐ€์ง€ ์งง์€ ์ƒ๊ฐ์„ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•ต์‹ฌ์ ์œผ๋กœ TypeScript๋Š” ๊ฐœ๋ฐœ์„ ๋” ์•ˆ์ „ํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•ฉ๋‹ˆ๋‹ค. TypeScript ์˜ ์ฒซ ๋ฒˆ์งธ ๋ชฉํ‘œ ๋ฅผ ๊ธฐ์–ตํ•˜๋ ค๋ฉด:

1. ์˜ค๋ฅ˜ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋Š” ๊ตฌ์„ฑ์„ ์ •์ ์œผ๋กœ ์‹๋ณ„ํ•ฉ๋‹ˆ๋‹ค.

์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ๋ณด๋ฉด ์ด๋ฏธ ์œ ํ˜• ์ถ”๋ก  ๋’ค์— ๋ช‡ ๊ฐ€์ง€ ๋งˆ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํŠน๋ณ„ํ•œ ๊ฒฝ์šฐ์— ์ง„์ •ํ•œ ๋ณ€๋ช…์€ "์šฐ๋ฆฌ๋Š” ์ด ๊ตฌ์กฐ์— ๋Œ€ํ•ด ์˜ฌ๋ฐ”๋ฅธ ์œ ํ˜•์„ ์ถ”๋ก ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค"์ด๊ณ  ์™„์ „ํžˆ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค. ์‹œ๊ฐ„์ด ์ง€๋‚จ์— ๋”ฐ๋ผ ์ปดํŒŒ์ผ์ด ์œ ํ˜•์„ ์œ ์ถ”ํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ๊ฐ€ ์ ์  ์ค„์–ด๋“ญ๋‹ˆ๋‹ค. ๋‹ค์‹œ ๋งํ•ด์„œ, ๋‚˜์—๊ฒŒ ๋” ์ •๊ตํ•œ ์œ ํ˜• ์œ ์ถ”๋ฅผ ์–ป๋Š” ๊ฒƒ์€ ์‹œ๊ฐ„ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

๊ธฐ์ˆ ์  ๊ด€์ ์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ตฌ์„ฑ:

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

TypeScript์˜ ์ฒซ ๋ฒˆ์งธ ๋ชฉํ‘œ๋ฅผ ๊นจ๋œจ๋ฆฝ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ TypeScript๊ฐ€ ๋” ์ •ํ™•ํ•œ ์œ ํ˜•์„ ์•Œ๊ณ  ์žˆ๋Š” ๊ฒฝ์šฐ์—๋Š” ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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 ์ ˆ์ถฉ์•ˆ์ž…๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ์™€ ์—ฌ๋Ÿฌ ๋‹ซํžŒ ๋ฌธ์ œ๋Š” ์ด ๋ณ€๊ฒฝ์— ๋Œ€ํ•œ ์ปค๋ฎค๋‹ˆํ‹ฐ์˜ ๋†’์€ ์š”๊ตฌ๊ฐ€ ์žˆ์Œ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ATM 238๊ฐœ ์ฐฌ์„ฑ ๋Œ€ ๋ฐ˜๋Œ€ 2๋ช…. ๋ฌผ๋ก  ์œ„์˜ for ๋ฃจํ”„๊ฐ€ "์˜ฌ๋ฐ”๋ฅธ" ์œ ํ˜•์„ ์ถ”๋ก ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์€ ์œ ๊ฐ์ด์ง€๋งŒ ๊ธ€์Ž„์š”, ๋Œ€๋ถ€๋ถ„์˜ ์ง€์ง€์ž๋“ค์€ ! ๋ฐ ์ƒˆ๋กœ์šด ? ๊ณผ ๊ฐ™์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค. ์ฃผ์˜๋ฅผ ๊ธฐ์šธ์ด๊ณ  ์•ˆ์ „ํ•œ ๊ฒฝ์šฐ์— ๊ฐ•์ œ๋กœ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‹ค๋ฅธ ์ชฝ์—์„œ๋Š” "์œ„ํ—˜ํ•œ" ์•ก์„ธ์Šค์— ๋Œ€ํ•œ ์˜ฌ๋ฐ”๋ฅธ ์œ ํ˜•์„ ์–ป์Šต๋‹ˆ๋‹ค.

ํฐ ์ฝ”๋“œ ๊ธฐ๋ฐ˜์— ๋Œ€ํ•œ ๋งค์šฐ ๋ฏผ๊ฐํ•œ ๋ณ€๊ฒฝ์ด๋ผ๋Š” ๋ฐ ๋™์˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ๊ธฐ์—์„œ ์ œ์•ˆ๋œ ๊ฒƒ๊ณผ ๊ฐ™์€ ๊ตฌ์„ฑ ์†์„ฑ์— ํˆฌํ‘œํ•ฉ๋‹ˆ๋‹ค. ์ ์–ด๋„ ์ปค๋ฎค๋‹ˆํ‹ฐ๋กœ๋ถ€ํ„ฐ ํ”ผ๋“œ๋ฐฑ์„ ๋ฐ›๊ธฐ ์œ„ํ•ด์„œ๋Š”. ๊ทธ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜์ง€ ์•Š๋‹ค๋ฉด TS 4.0์ด ๊ทธ๊ฒƒ์„ ์–ป์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์ œ์•ˆ๋œ ์†”๋ฃจ์…˜์ด ์•„๋‹ˆ๋ผ ์‹คํ—˜์ผ ๋ฟ์ž…๋‹ˆ๋‹ค. TypeScript๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ์กด ํ”„๋กœ์ ํŠธ์—์„œ 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์˜ ์œ ํ˜•์—๋„ ์ ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” io-ts ๋ฐ ์•„๋งˆ๋„ ๋‹ค๋ฅธ ์ผ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์ปดํŒŒ์ผ๋Ÿฌ ์˜ต์…˜์œผ๋กœ๋งŒ ๋„์ž…๋œ ๊ฒฝ์šฐ์—๋„ ์ด ์˜ต์…˜๊ณผ ํ•จ๊ป˜ ์ž‘๋™ํ•˜๋„๋ก ์—…๋ฐ์ดํŠธํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ฒ˜์Œ์—๋Š” ์ด๊ฒƒ์„ ์ปดํŒŒ์ผ๋Ÿฌ ์˜ต์…˜์œผ๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ๋…ผ๋ž€์„ ๋œ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์ง€๋งŒ ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ์„ ํƒํ•œ ์‚ฌ๋žŒ๋“ค์ด ์—ฌ๋Ÿฌ ๋‹ค๋ฅธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ž‘์„ฑ์ž์—๊ฒŒ ๋น„ํ˜ธํ™˜์„ฑ์— ๋Œ€ํ•ด ๋ถˆํ‰ํ•˜๊ธฐ ์‹œ์ž‘ํ•˜๋ฉด ๋‹จ์ˆœํžˆ TS 4.0์ด ๋˜๋Š” ๊ฒƒ๋ณด๋‹ค ํ›จ์”ฌ ๋” ๋…ผ์Ÿ์˜ ์—ฌ์ง€๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊นจ๋Š” ๋ณ€ํ™”.

  2. ๋•Œ๋กœ๋Š” ์ •์˜๋˜์ง€ ์•Š์€ ๊ฐ€๋Šฅ์„ฑ์„ ์ œ๊ฑฐํ•˜๊ธฐ ์œ„ํ•ด ๋ช‡ ๊ฐ€์ง€ ์ถ”๊ฐ€ ์œ ํ˜• ๊ฐ€๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๋ฐ˜๋“œ์‹œ ๋‚˜์œ ๊ฒƒ์€ ์•„๋‹ˆ๋ฉฐ ์ด ์ œ์•ˆ์˜ ์š”์ ์ด๊ธฐ๋„ ํ•˜์ง€๋งŒ ์™„์ „์„ฑ์„ ์œ„ํ•ด ์–ธ๊ธ‰ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

  3. ์ž„์˜์˜ Array<T> ๋ฐ˜๋ณตํ•˜๋Š” for (let i = 0; i < array.length; i++) ๋ฃจํ”„ ๋‚ด๋ถ€์— ์œ ํ˜• ์˜ค๋ฅ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. T ์ž์ฒด์— undefined ๊ฐ€ ํฌํ•จ๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— T undefined ๋ฅผ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์œ ํ˜• ๊ฐ€๋“œ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์ผํ•œ ํ•ด๊ฒฐ์ฑ…์€ A) ์œ ํ˜• ์–ด์„ค์…˜ ๋˜๋Š” @ts-ignore ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์œ ํ˜• ์˜ค๋ฅ˜๋ฅผ ์นจ๋ฌต์‹œํ‚ค๊ฑฐ๋‚˜ B) ๋Œ€์‹  for-of ๋ฃจํ”„๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ฐœ์ธ์ ์œผ๋กœ ๋‚˜๋Š” ์ด๊ฒƒ์ด ๋„ˆ๋ฌด ๋‚˜์˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์ง€๋งŒ(์–ด์จŒ๋“  ๋ฐฐ์—ด์„ ๋ฐ˜๋ณตํ•˜๊ธฐ ์œ„ํ•ด for-of ๋ฃจํ”„๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ์ข‹์ง€ ์•Š์€ ๊ฒฝ์šฐ๋Š” ๊ฑฐ์˜ ์—†์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค), ๋…ผ๋ž€์˜ ์—ฌ์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  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
    );
    

    ๊ทธ๋Ÿฌ๋‚˜ ์ „ํ™˜์„ ์‰ฝ๊ฒŒ ํ•ด์ฃผ๋Š” ์ด ๋„์šฐ๋ฏธ๋ฅผ ์‚ฌ์šฉํ•˜๋”๋ผ๋„ ์ด๋Š” ์—ฌ์ „ํžˆ ํฐ ๋ณ€ํ™”์ž…๋‹ˆ๋‹ค. ์•„๋งˆ๋„ TypeScript๋Š” ์ด ๋ฌธ์ œ๋ฅผ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด A[number] ์— ๋Œ€ํ•œ ์ผ์ข…์˜ ํŠน๋ณ„ํ•œ ๊ฒฝ์šฐ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์ง€๋งŒ, ๊ฐ€๋Šฅํ•˜๋ฉด ์ด์™€ ๊ฐ™์€ ์ด์ƒํ•œ ํŠน๋ณ„ํ•œ ๊ฒฝ์šฐ๋ฅผ ํ”ผํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

์ˆ˜๋ฐฑ ๊ฐ€์ง€ ์œ ํ˜• ์˜ค๋ฅ˜ ์ค‘ ์†Œ์ˆ˜์— ๋ถˆ๊ณผํ•˜๋ฏ€๋กœ ์ด๊ฒƒ์€ ์•„๋งˆ๋„ ๋งค์šฐ ๋ถˆ์™„์ „ํ•œ ๋ชฉ๋ก์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ๊ด€์‹ฌ์ด ์žˆ๋Š” ๋‹ค๋ฅธ ์‚ฌ๋žŒ์—๊ฒŒ๋Š” ๊ธฐ์กด ํ”„๋กœ์ ํŠธ์™€ ๋™์ผํ•œ ์ž‘์—…์„ ์‹œ๋„ํ•˜๊ณ  ์–ด๋–ค ๋‹ค๋ฅธ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋Š”์ง€ ๊ณต์œ ํ•˜๋Š” ๊ฒƒ์ด ์œ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŠน์ • ์˜ˆ์ œ๊ฐ€ ์‹ค์ œ๋กœ ์ด๊ฒƒ์„ ๊ตฌํ˜„ํ•˜๋ ค๋Š” ๋ชจ๋“  ์‚ฌ๋žŒ์—๊ฒŒ ์ง€์นจ์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

@butchler ๋‚˜๋Š” ๋˜ํ•œ ์ด๋Ÿฌํ•œ ๋ฌธ์ œ ์ค‘ ์ผ๋ถ€๋ฅผ something[i] ๋ฅผ something(i) ๋กœ ๋ณด๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, if (Meteor.user() && Meteor.user()._id) {...} ์™€ ๊ฐ™์€ ๊ฒƒ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ' t ๋ฐฐ์—ด ์ธ๋ฑ์‹ฑ์— ๋Œ€ํ•ด ์ด ์ ‘๊ทผ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋จผ์ € ๋ฐฐ์—ด์—์„œ ๊ฒ€์‚ฌํ•˜๋ ค๋Š” ๊ฐ’์„ ๊ฐ€์ ธ์™€์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๋งํ•˜๋ ค๋Š” ๊ฒƒ์€ ๊ธธ์ด ์†์„ฑ์„ ํ™•์ธํ•˜๊ณ  ์ด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์–ด์„ค์…˜์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ์œ ํ˜• ์‹œ์Šคํ…œ์— ๋„ˆ๋ฌด ๋งŽ์€ ์ŠคํŠธ๋ ˆ์Šค๋ฅผ ์ค„ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด TS์— ์˜์กดํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ „ํ™˜์„ ๋ฏธ๋ฃจ๊ฒŒ ๋งŒ๋“  ํ•œ ๊ฐ€์ง€๋Š” (๋‹น์‹ ์ด ๋งํ–ˆ๋“ฏ์ด ์ผ๋ถ€ ๋‹ค๋ฅธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—๋„ ์˜ค๋ฅ˜๊ฐ€ ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค ์™ธ์—) ๋ฐฐ์—ด ๊ตฌ์กฐ ๋ถ„ํ•ด๊ฐ€ ์•„์ง ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š๊ณ  ๊ตฌ์กฐ ๋ถ„ํ•ด ๊ฐ’์ด 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();
}

๋‚ด๊ฐ€ ๋งํ•˜๋ ค๋Š” ๊ฒƒ์€ ๊ธธ์ด ์†์„ฑ์„ ํ™•์ธํ•˜๊ณ  ์ด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์–ด์„ค์…˜์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ์œ ํ˜• ์‹œ์Šคํ…œ์— ๋„ˆ๋ฌด ๋งŽ์€ ์ŠคํŠธ๋ ˆ์Šค๋ฅผ ์ค„ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด TS์— ์˜์กดํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์•„๋งˆ๋„ ์‚ฌ์‹ค ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ๋Œ€ํ•œ ์ฃผ์žฅ์— ๋”ฐ๋ผ ์ž๋™์œผ๋กœ ์žฌ ์ž‘์„ฑํ•˜๋Š” ์ฝ”๋“œ์— ๋Œ€ํ•œ codemod์„ ์“ฐ๊ธฐ ์‰ฌ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค .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 ์ƒ‰์ธ ์„œ๋ช…์„ ์ œ์•ˆํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ๋“ค์€ ์™„์ „ํžˆ ๋‹ค๋ฅธ ๋‘ ๊ฐœ์˜ ํ† ๋ก ์ž…๋‹ˆ๋‹ค.

TL;DR ์›๋ž˜ ๊ฒŒ์‹œ๋ฌผ๊ณผ ์ œ๋ชฉ์€ ์„œ๋กœ ๋‹ค๋ฅธ ๊ฒƒ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๋ฉฐ, ๋‘˜ ์ค‘ ํ•˜๋‚˜๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์€ ์˜์กด์  ํƒ€์ดํ•‘์— ํฌ๊ฒŒ ์˜์กดํ•ฉ๋‹ˆ๋‹ค(ํ•˜).

forEach , map , filter ๋“ฑ๊ณผ ๊ฐ™์€ ํ•จ์ˆ˜๊ฐ€ ์กด์žฌํ•œ๋‹ค๋Š” ์ ์„ ๊ฐ์•ˆํ•  ๋•Œ(IMHO๊ฐ€ ํ›จ์”ฌ ๋” ์„ ํ˜ธ๋จ), TS ํŒ€์ด ์ถ”๋ก  ์—”์ง„์„ ์ผ๋ฐ˜ for ๋ฃจํ”„๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐฐ์—ด์— ๋Œ€ํ•œ ๋ฃจํ•‘์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์„ฑ์ทจํ•˜๋ ค๊ณ  ํ•˜๋Š” ๊ฒƒ์—์„œ ์˜ˆ์ƒํ•˜์ง€ ๋ชปํ•œ ๋ณต์žก์„ฑ์ด ๋„ˆ๋ฌด ๋งŽ๋‹ค๋Š” ๋Š๋‚Œ์„ ๋ฐ›์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด i ๋Š” ์ƒ์ˆ˜๊ฐ€ ์•„๋‹ˆ๋ฏ€๋กœ ๋ฃจํ”„ ๋‚ด์—์„œ ๋ˆ„๊ตฐ๊ฐ€ i ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”? ๋ฌผ๋ก , ๊ทธ๊ฒƒ์€ ๊ทน๋‹จ์ ์ธ ๊ฒฝ์šฐ์ด์ง€๋งŒ (๋ฐ”๋ผ๊ฑด๋Œ€) ์ง๊ด€์ ์ธ ๋ฐฉ์‹์œผ๋กœ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ธ๋ฑ์Šค ์„œ๋ช…์„ ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ์€ ์œ„์˜ ์„ค๋ช…์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋“ฏ์ด ๋น„๊ต์  ๊ฐ„๋‹จํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

4. ๊ธฐ์กด ์ฝ”๋“œ๊ฐ€ ์ด๋ฏธ .length ๊ฐ’์— ๋Œ€ํ•ด ์ผ๋ถ€ ์ฃผ์žฅ์„ ํ•˜๊ณ  ๋ฐฐ์—ด์˜ ์š”์†Œ์— ์•ก์„ธ์Šคํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค. ์ด์ œ .length ๊ฒ€์‚ฌ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์œ ํ˜• ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฏ€๋กœ .length ๊ฒ€์‚ฌ์— ์˜์กดํ•˜์ง€ ์•Š๋„๋ก ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜ ์ค‘๋ณต !== undefined ๊ฒ€์‚ฌ๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ํƒ€์ดํ”„ ๋ผ์ดํ„ฐ๊ฐ€ ์–ด๋–ป๊ฒŒ ๋“  ์‚ฌ์šฉ์„ ํ—ˆ์šฉ ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ •๋ง ์ข‹์„ ๊ฒƒ์ด๋‹ค .length ์˜ ํ•„์š”์„ฑ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ํ™•์ธ !== undefined ํ™•์ธ. ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์‹ค์ œ๋กœ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ์‚ฌ์†Œํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

@butchler
๊ถ๊ธˆํ•ด์„œ ์ด ์ค‘ ๋ณ€ํ•˜๋Š” ๋ณ€์ˆ˜๋กœ ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ๊ณผ ๊ณ ์ •๋œ ์ˆซ์ž๋กœ ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ์€ ์–ผ๋งˆ๋‚˜ ๋ ๊นŒ์š”? ํ›„์ž์˜ ๊ฒฝ์šฐ TS๊ฐ€ ๋ฐฐ์—ด ๊ธธ์ด๋ฅผ ์ถ”์ ํ•˜๋Š” ํŠœํ”Œ๋กœ ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋ฐฐ์—ด์„ ํŠœํ”Œ๋กœ ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์‹ค์ œ ํŠœํ”Œ๋กœ ๋‹ค์‹œ ์ž…๋ ฅํ•˜๋ฉด ์˜ค๋ฅ˜๊ฐ€ ์–ด๋–ป๊ฒŒ ๋ฐœ์ƒํ•˜๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

๋ฐฐ์—ด์„ ํŠœํ”Œ๋กœ ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์‹ค์ œ ํŠœํ”Œ๋กœ ๋‹ค์‹œ ์ž…๋ ฅํ•˜๋ฉด ์˜ค๋ฅ˜๊ฐ€ ์–ด๋–ป๊ฒŒ ๋ฐœ์ƒํ•˜๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

๋ณ€์ˆ˜์˜ ์œ ํ˜•์„ ํŠœํ”Œ๋กœ ๋ณ€ํ™˜ํ•˜๊ธฐ ์œ„ํ•ด ๋ฐฐ์—ด ๋ฆฌํ„ฐ๋Ÿด์— as const ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ์œ ํ˜• ์˜ค๋ฅ˜๋ฅผ ์ˆ˜์ •ํ•œ ๊ฒฝ์šฐ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ˆ˜๋ฐฑ ๊ฐœ์˜ ์˜ค๋ฅ˜ ์ค‘ ์•ฝ 10๊ฐœ๋งŒ ๋ณด์•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์ด ์šฐ๋ฆฌ ์ฝ”๋“œ๋ฒ ์ด์Šค์—์„œ ์–ผ๋งˆ๋‚˜ ํ”ํ•œ์ง€ ์ „ํ˜€ ๋ชจ๋ฆ…๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋˜ํ•œ ์˜ค๋Š˜ ์ด๊ฒƒ์œผ๋กœ ๋ฌธ์ œ๋ฅผ ์ณค๋‹ค.
๊ณ„์‚ฐ๋œ ์ธ๋ฑ์Šค๋ฅผ ํ†ตํ•ด ๋ฐฐ์—ด์—์„œ ์•ก์„ธ์Šคํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น ์ธ๋ฑ์Šค๊ฐ€ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋”ฐ๋ผ์„œ ์ฝ”๋“œ์— ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‚ด์šฉ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

const noNext = !items[currentIndex + 1];

๊ทธ ๊ฒฐ๊ณผ noNext ๊ฐ€ false ๋กœ ์ •์˜๋ฉ๋‹ˆ๋‹ค. ์ž˜๋ชป๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์‚ฌ์‹ค์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋˜ํ•œ items ๋ฅผ Array<Item | undefined> ๋กœ ์ •์˜ํ•˜๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ž˜๋ชป๋œ ๊ธฐ๋Œ€๋ฅผ ์ œ๊ณตํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
์ธ๋ฑ์Šค๊ฐ€ ์žˆ์œผ๋ฉด undefined ๋˜์–ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ž˜๋ชป๋œ ์ƒ‰์ธ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ undefined ์ž…๋‹ˆ๋‹ค.
๋ฌผ๋ก , ์œ„์˜ ๋ฌธ์ œ๋Š” ๋Œ€์‹  .length ๊ฒ€์‚ฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ noNext ๋ฅผ boolean ๋กœ ๋ช…์‹œ์ ์œผ๋กœ ์ •์˜ํ•˜์—ฌ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ ๊ฒฐ๊ตญ ์ด๊ฒƒ์€ TypeScript๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์‹œ์ž‘ํ•œ ์ดํ›„๋กœ ์ €๋ฅผ ๊ดด๋กญํžˆ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์™œ | undefined ๊ฐ€ ๊ธฐ๋ณธ์ ์œผ๋กœ ํฌํ•จ๋˜์ง€ ์•Š๋Š”์ง€ ์ดํ•ดํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.

๋Œ€๋ถ€๋ถ„ typescript-eslint๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ธ๋ฑ์‹ฑ ํ›„ ๊ฐ’์„ ์‚ฌ์šฉํ•˜๊ธฐ ์ „์— ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค๊ณ  ๊ฐ•์ œํ•  ์ˆ˜ ์žˆ๋Š” ๊ทœ์น™์ด ์žˆ์Šต๋‹ˆ๊นŒ? ์ด๋Š” TS์˜ ์ง€์›์ด ๊ตฌํ˜„๋˜๊ธฐ ์ „์— ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ˆ„๊ตฐ๊ฐ€์—๊ฒŒ ๊ด€์‹ฌ์ด ์žˆ์„ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ. ์ด์ „ ๋Œ“๊ธ€์—์„œ lib.es5.d.ts ์˜ Array ์ธ๋ฑ์‹ฑ ์ •์˜๋ฅผ ํŒจ์น˜ํ•˜๋Š” ์ ‘๊ทผ ๋ฐฉ์‹์ด ๋ณ€๊ฒฝ ์‚ฌํ•ญ์˜ ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๋ฏ€๋กœ ๋ฐฐ์—ด ๊ตฌ์กฐ ํ•ด์ œ์— ๋Œ€ํ•ด ์ด์ƒํ•œ ๋™์ž‘์ด ์žˆ๋‹ค๊ณ  ์–ธ๊ธ‰ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด์— ๋”ฐ๋ผ ๋‹ฌ๋ผ ๋ณด์ธ๋‹ค 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 ์ปดํŒŒ์ผ๋Ÿฌ์—์„œ ์ „์ฒด ๋ฌธ์ œ๊ฐ€ ์ˆ˜์ •๋  ๋•Œ ๊ฐ€์น˜๊ฐ€ ์—†์„ ์ˆ˜ ์žˆ์ง€๋งŒ ์œ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐ๋˜๋ฉด typescript-eslint ๊ทœ์น™ PR ์—์„œ ์šฐ๋ ค ์‚ฌํ•ญ/๊ฐœ์„  ์‚ฌํ•ญ์„ ์ž์œ ๋กญ๊ฒŒ ํ•ด๊ฒฐํ•˜์‹ญ์‹œ์˜ค.

์•ˆํƒ€๊น๊ฒŒ๋„ PR์—์„œ eslint๋ฅผ ์‚ฌ์šฉํ•œ ์ˆ˜์ •์€ ๋ฐฐ์—ด์ด ์•„๋‹Œ ํŠœํ”Œ๋งŒ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ๊ณผ ๊ด€๋ จ๋œ ์ฃผ์š” ๋ฌธ์ œ์™€ ์ฃผ์š” ์˜ํ–ฅ์€ ์–ด๋ ˆ์ด ๊ตฌ์กฐํ™”์— ์žˆ์Šต๋‹ˆ๋‹ค.

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

๋‚˜๋Š” ์ด ์ „์ฒด ๋ฌธ์ œ๊ฐ€ ๋‚ด๊ฐ€ ๋™์˜ํ•˜์ง€ ์•Š๋Š” ์ชฝ์œผ๋กœ ๊ฐ”๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. forEach, map ๋“ฑ ๋‚ด๋ถ€์— ๊ฐ•์ œ ๊ฒ€์‚ฌ๊ฐ€ ์žˆ์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ for์˜ ๋ชจ๋“  ์‚ฌ์šฉ์„ ํ”ผํ•˜๋ ค๊ณ  ์‹œ๋„ํ•˜๋ฏ€๋กœ ์ด๊ฒƒ์„ ํ”ผํ•˜๋ ค๋Š” ์ถ”๋ก ์ด ์ €์—๊ฒŒ ๋œ ์ดํ•ด๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ๋‚˜๋Š” ์ด๊ฒƒ์ด ๋ฐฐ์—ด ๊ตฌ์กฐ ๋ถ„ํ•ด๋ฅผ ์ง€์›ํ•˜๋Š” ๋ฐ ์—ฌ์ „ํžˆ ์ค‘์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๊ธ€์Ž„์š”, ๊ทธ๊ฒƒ์€ ๋‹จ์ง€ ๋ชจ๋“  ๋ฐฐ์—ด ๊ตฌ์กฐ ๋ถ„ํ•ด์— ์˜ค๋ฅ˜๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ ์ธ๋ฑ์‹ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ž˜๋„ ๋‚˜์˜์ง€ ์•Š์ฃ ? Array Destructuring์€ ๋†€๋ผ์šด ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. ๋ฌธ์ œ๋Š” ์ž…๋ ฅ์ด ์ •ํ™•ํ•˜์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ธฐ๋Šฅ์„ ๋น„ํ™œ์„ฑํ™”ํ•˜๋Š” ๊ฒƒ์€ ์‹ค์ œ๋กœ ์ข‹์€ ์†”๋ฃจ์…˜์ด ์•„๋‹™๋‹ˆ๋‹ค. ์ƒ‰์ธ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๋‚ด ์ƒ๊ฐ์— ๋” ์ถ”์•…ํ•œ(์ฝ๊ณ  ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ค์šด) ์ฝ”๋“œ์™€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค.

๋” ๋ณด๊ธฐ ํ‰ํ•˜์ง€๋งŒ ๊ฐœ๋ฐœ์ž๊ฐ€ ์š”์†Œ๊ฐ€ ์ •์˜๋˜์—ˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•˜๋„๋ก ๊ฐ•์ œํ•ฉ๋‹ˆ๋‹ค. ๋” ์šฐ์•„ํ•œ ํ•ด๊ฒฐ์ฑ…์„ ์ƒ๊ฐํ•ด ๋ƒˆ์ง€๋งŒ ์ด๊ฒƒ์ด ๊ฐ€์žฅ ๋‹จ์ ์ด ์ ์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ ์–ด๋„ ์šฐ๋ฆฌ์˜ ์‚ฌ์šฉ ์‚ฌ๋ก€์—์„œ๋Š”.

@caseyhoward ์ด ๋ฌธ์ œ์—์„œ ์ด์ „์— ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด ๋‹ค์–‘ํ•œ Array.prototype ํ•จ์ˆ˜์—์„œ ์›์น˜ ์•Š๋Š” ๋™์ž‘์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

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

์ด๊ฒƒ์€ array.prototype ํ•จ์ˆ˜์—์„œ ์ˆ˜์ •ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์–ด๋ ˆ์ด ๊ตฌ์กฐ ๋ถ„ํ•ด์— ๋Œ€ํ•œ ์—„์ฒญ๋‚œ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค!

์˜ค๋Š˜ ๋‹ค์‹œ ์ด๊ฒƒ์— ๋ถ€๋”ช์ณค๋‹ค. ๋‚˜๋Š” ์—ฌ์ „ํžˆ ์˜ฌ๋ฐ”๋ฅธ ํƒ€ํ˜‘ ์ด ์ด๊ฒƒ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด์— ๋Œ€ํ•œ ํ”ผ๋“œ๋ฐฑ์„ ๋ฐ›๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ์˜ ๋˜ ๋‹ค๋ฅธ ์‚ฌ์šฉ ์‚ฌ๋ก€ - typescript-eslint๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  no-unnecessary-condition ํ™œ์„ฑํ™”ํ•  ๋•Œ ์ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ณผ๊ฑฐ์—๋Š” ์ธ๋ฑ์Šค๋กœ ๋ฐฐ์—ด์— ์•ก์„ธ์Šคํ•˜์—ฌ ํ•ด๋‹น ์ธ๋ฑ์Šค์˜ ์š”์†Œ์— ๋Œ€ํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ๋•Œ array[i]?.doSomething() ์—์„œ์™€ ๊ฐ™์ด ์ธ๋ฑ์Šค๊ฐ€ ์ •์˜๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์„ ํƒ์  ์—ฐ๊ฒฐ์„ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค(์ธ๋ฑ์Šค๊ฐ€ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚œ ๊ฒฝ์šฐ) no-unnecessary-condition ๋Š” ์„ ํƒ์  ์—ฐ๊ฒฐ์ด ๋ถˆํ•„์š”ํ•œ ๊ฒƒ์œผ๋กœ ํ”Œ๋ž˜๊ทธ๋ฅผ ์ง€์ •ํ•˜๊ณ (์œ ํ˜• ์Šคํฌ๋ฆฝํŠธ์— ๋”ฐ๋ผ ์œ ํ˜•์ด null์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—) ์ž๋™ ์ˆ˜์ •์ด ์„ ํƒ์  ์—ฐ๊ฒฐ์„ ์ œ๊ฑฐํ•˜์—ฌ ์ธ๋ฑ์Šค i ์‹ค์ œ๋กœ๋Š” ์ •์˜๋˜์–ด ์žˆ์ง€

์ด ๊ธฐ๋Šฅ์ด ์—†์œผ๋ฉด ๋‚ด ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ, ๋‚œ ํ•ญ์ƒ ์‚ฌ์šฉํ•˜์—ฌ ์•ก์„ธ์Šค ์š”์†Œ์— ์ž์‹ ์„ ์ƒ๊ธฐํ•ด์•ผ ๋‚ด๊ฐ€ ๋‹ค์ฐจ์› ๋ฐฐ์—ด์„ ์ฒ˜๋ฆฌํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค๋กœ ๋งค์šฐ ๋ฒ„๊ทธ๊ฐ€๋˜์—ˆ๋‹ค xs[i]?.[j] ๋Œ€์‹  xs[i][j] , ๋˜ํ•œ ๋‚ด๊ฐ€ ๋ช…์‹œ ์ ์œผ๋กœ ์บ์ŠคํŒ…ํ•ด์•ผ ์œ ํ˜• ์•ˆ์ „์„ฑ์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด const element = xs[i]?.[j] as Element | undefined ์™€ ๊ฐ™์€ ์•ก์„ธ์Šค ์š”์†Œ.

์ด๊ฒƒ์„ ๋งŒ๋‚˜๋Š” ๊ฒƒ์€ Typescript์—์„œ ๋‚˜์˜ ์ฒซ ๋ฒˆ์งธ ํฐ wtf์˜€์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์–ธ์–ด๊ฐ€ ๋†€๋ผ์šธ ์ •๋„๋กœ ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜์—ˆ๊ณ  ์ด๊ฒƒ์ด ๋‚˜๋ฅผ ์‹ค๋ง์‹œ์ผฐ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ฐฐ์—ด ์•ก์„ธ์Šค์— "as T | undefined"๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์€ ์ƒ๋‹นํžˆ ๋ฒˆ๊ฑฐ๋กญ์Šต๋‹ˆ๋‹ค. ์ œ์•ˆ ์ค‘ ํ•˜๋‚˜๊ฐ€ ๊ตฌํ˜„๋˜๋Š” ๊ฒƒ์„ ๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

๋„ค, ์—ฌ๊ธฐ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ์šฐ๋ฆฌ๊ฐ€ ( | undefined ) ํƒ€์ž… ์•ˆ์ „์„ฑ์„ ๊ฐ–๋Š” ์šฐ๋ฆฌ ์ž์‹ ์˜ ํƒ€์ž…์„ ๋กค์•„์›ƒํ•˜๋„๋ก ๊ฐ•์š”ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„ ๊ฐ์ฒด ์•ก์„ธ์Šค๋ฅผ ์œ„ํ•œ ๊ฒƒ์ด์ง€๋งŒ(์•„๋งˆ๋„ ๋ณ„๋„์˜ ์—ด๋ฆฐ ๋ฌธ์ œ์ผ ์ˆ˜ ์žˆ์Œ) ๋ฐฐ์—ด ์ธ๋ฑ์Šค์— ์•ก์„ธ์Šคํ•˜๋Š” ๋ฐ์—๋„ ๋™์ผํ•œ ๋…ผ๋ฆฌ๊ฐ€ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

๋ฌธ์ œ๋ฅผ ์—ฐ๊ฒฐํ•˜๊ฑฐ๋‚˜ ์˜ˆ์ œ๋ฅผ ๋ณด์—ฌ์ค„ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด ๋ฌด์Šจ ๋ง์ธ์ง€ ์ž˜ ๋ชจ๋ฅด์‹ญ๋‹ˆ๊นŒ?

2020๋…„ 4์›” 29์ผ ์ˆ˜์š”์ผ ์˜ค์ „ 2์‹œ 41๋ถ„ Kirill Groshkov [email protected]
์ผ๋‹ค:

๋„ค, ์—ฌ๊ธฐ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค. ( |
์ •์˜๋˜์ง€ ์•Š์Œ) ์œ ํ˜• ์•ˆ์ „์„ฑ์„ ๊ฐ–์Šต๋‹ˆ๋‹ค. ์ฃผ๋กœ ๊ฐœ์ฒด ์•ก์„ธ์Šค๋ฅผ ์œ„ํ•ด(์•„๋งˆ๋„
๋ณ„๋„์˜ ๋ฏธ๊ฒฐ ๋ฌธ์ œ), ๋ฐฐ์—ด ์ธ๋ฑ์Šค ์•ก์„ธ์Šค์—๋„ ๋™์ผํ•œ ๋…ผ๋ฆฌ๊ฐ€ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

โ€”
๋‹น์‹ ์ด ๋Œ“๊ธ€์„ ๋‹ฌ์•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ๋ฐ›๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ณ  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 ๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ํฌํ•จํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

์ด๋ฏธ ์ œ์•ˆ๋œ ๊ฒฝ์šฐ ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ์ด ์Šค๋ ˆ๋“œ์˜ ๋ชจ๋“  ๋Œ“๊ธ€์„ ์ฝ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ ํ˜„์žฌ์˜ ๊ธฐ๋ณธ ๋™์ž‘์€ ์‚ฌ์šฉ์ž๊ฐ€ TypeScript๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๊ธฐ๋Œ€ํ•˜๋Š” ๊ฒƒ๊ณผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ํŠนํžˆ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ด์™€ ๊ฐ™์ด ์‰ฝ๊ฒŒ ์˜ค๋ฅ˜๋ฅผ ํฌ์ฐฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ ๋ฏธ์•ˆํ•œ ๊ฒƒ๋ณด๋‹ค ์•ˆ์ „ํ•œ ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

index.d.ts๋ฅผ ๋‚ด ํ”„๋กœ์ ํŠธ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์—ˆ๊ณ  ์‹ค์ œ๋กœ ์ฒ˜๋ฆฌํ•˜๊ณ  ์‹ถ์ง€๋„ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

์œ ํ˜• ๊ฐ€๋“œ๋ฅผ ๊ฐ•์ œํ•˜๋Š” ์ด ์ž‘์€ ํ•ดํ‚น์„ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

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

์œ ํ˜•์ด 0 | T ๋กœ ๋๋‚˜๋”๋ผ๋„ ์—ฌ์ „ํžˆ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

const firstNode = nodes?.[0] ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

@ricklove ๋‹จ์ˆœํžˆ 1 ๋ณด๋‹ค +!undefined ๋ฅผ ์„ ํ˜ธํ•˜๋Š” ์ด์œ ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

const firstNode = nodes?.[0] ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

์•„๋‹ˆ์š”, typescript๋Š” (๋‚ด ์ƒ๊ฐ์—๋Š”) ๊ทธ๊ฒƒ์„ ์„ ํƒ ์‚ฌํ•ญ์œผ๋กœ ์ทจ๊ธ‰ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค(#35139 ์ฐธ์กฐ).

Flow์˜ ๋ฌธ์„œ ์— ๋”ฐ๋ฅด๋ฉด ์ธ๋ฑ์Šค ์„œ๋ช…์˜ ๋™์ž‘์€ ํ˜„์žฌ TypeScript์˜ ๋™์ž‘๊ณผ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.

๊ฐœ์ฒด ์œ ํ˜•์— ์ธ๋ฑ์„œ ์†์„ฑ์ด ์žˆ๋Š” ๊ฒฝ์šฐ ๋Ÿฐํƒ€์ž„์— ๊ฐœ์ฒด์˜ ํ•ด๋‹น ์Šฌ๋กฏ์— ๊ฐ’์ด ์—†๋”๋ผ๋„ ์†์„ฑ ์•ก์„ธ์Šค๋Š” ์ฃผ์„์ด ์žˆ๋Š” ์œ ํ˜•์„ ๊ฐ–๋Š” ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผ๋ฉ๋‹ˆ๋‹ค. ๋ฐฐ์—ด๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์•ก์„ธ์Šค๊ฐ€ ์•ˆ์ „ํ•œ์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ์€ ํ”„๋กœ๊ทธ๋ž˜๋จธ์˜ ์ฑ…์ž„์ž…๋‹ˆ๋‹ค.

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

๋”ฐ๋ผ์„œ ์ด ๋ฌธ์ œ์—์„œ TS์™€ Flow๋Š” ๋ชจ๋‘ ์‚ฌ์šฉ์ž๊ฐ€ ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ๋•๋Š” ๋Œ€์‹  ์ •์˜๋˜์ง€ ์•Š์€ ํ‚ค๋ฅผ ์ƒ๊ฐํ•  ๊ฒƒ์„ ์š”๊ตฌํ•ฉ๋‹ˆ๋‹ค.

์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์‚ฌ์šฉ์ž๊ฐ€ ์ด๋Ÿฌํ•œ ์ข…๋ฅ˜์˜ ๋ฒ„๊ทธ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•œ๋‹ค๋ฉด TS์˜ ์ด์ ์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ์Šค๋ ˆ๋“œ์˜ ๋ชจ๋“  ๋Œ“๊ธ€์„ ์ฝ์œผ๋ฉด ์—ฌ๊ธฐ ์žˆ๋Š” ๋Œ€๋‹ค์ˆ˜๊ฐ€ ์ด ๊ธฐ๋Šฅ์„ ๊ฐ–๊ณ  ์‹ถ์–ดํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. TSํŒ€์€ ์•„์ง๋„ 100% ๋ฐ˜๋Œ€ํ•˜๋‚˜์š”?

TS๊ฐ€ ์ด๊ฒƒ์„ ์ œ์™ธํ•˜๊ณ  ์ •์˜๋˜์ง€ ์•Š์€ ๋ฉค๋ฒ„์— ๋Œ€ํ•œ ์•ก์„ธ์Šค๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์ตœ์„ ์„ ๋‹คํ•˜๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์€ ์–ด๋ฆฌ์„์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ง€๊ธˆ๊นŒ์ง€ ์šฐ๋ฆฌ ์ฝ”๋“œ๋ฒ ์ด์Šค์—์„œ ์ˆ˜์ •ํ•œ ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ๋ฒ„๊ทธ์ž…๋‹ˆ๋‹ค.

[ #38470์—์„œ ์—ฌ๊ธฐ๋กœ ํ† ๋ก  ์ด๋™]
์ด๊ฒƒ์ด ๋ฐฐ์—ด์— ์‹ค์šฉ์ ์ด์ง€ ์•Š์€ ์ด์œ ์— ๋Œ€ํ•œ ๋ชจ๋“  ์ธ์ˆ˜๋ฅผ ์ˆ˜๋ฝํ•ฉ๋‹ˆ๋‹ค.
๋‚˜๋Š” ์ด๊ฒƒ์ด Tuples์— ๋Œ€ํ•ด ํ™•์‹คํžˆ ํ•ด๊ฒฐ๋˜์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

// 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] ๋Š” ์™„๋ฒฝํ•˜๊ฒŒ ์œ ํšจํ•œ Javascript์ด๋ฏ€๋กœ ํŠน๋ณ„ํ•œ ๊ฒฝ์šฐ๋ฅผ ๊ฐœ์ฒ™ํ•˜๋Š” ๊ฒƒ์ด ๋ณต์žกํ•ด์ง€๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ท€ํ•˜์˜ ๊ฒŒ์‹œ๋ฌผ์€ ๋˜ํ•œ ์ธ๋ฑ์Šค ๋ฐ˜ํ™˜์„ ์ •์˜๋˜์ง€ ์•Š์€ ๊ฒƒ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐ ๋Œ€ํ•œ ์ง€์›์„ ๋ฐ›๊ฒŒ ๋œ๋‹ค๋ฉด ์–ด๋–ค ๋ชจ์Šต์ผ์ง€ ์ƒ๊ฐํ•˜๊ฒŒ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ท€ํ•˜์˜ ์˜ˆ์—์„œ์™€ ๊ฐ™์ด aa[num] ์‹ค์ œ๋กœ string | number | undefined ๋กœ ์ž…๋ ฅํ–ˆ๋‹ค๋ฉด, ์ธ๋ฑ์Šค๊ฐ€ ๊ฒฝ๊ณ„๋ฅผ ์œ ์ง€ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๋ฉด์„œ๋„ for (let i = 0; i < 2; i++) { foo(aa[i]!); } ๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? ๋‚˜์—๊ฒŒ ์—„๊ฒฉํ•œ null ๊ฒ€์‚ฌ๊ฐ€ ๋‚ด๊ฐ€ ์ž‘์„ฑํ•œ ํ•ญ๋ชฉ์— ํ”Œ๋ž˜๊ทธ๋ฅผ ์ง€์ •ํ•  ๋•Œ ์ฒ˜์Œ์— ๋” ๋‚˜์€ ๊ฒƒ์„ ์ž…๋ ฅํ•˜๊ฑฐ๋‚˜ ๋Ÿฐํƒ€์ž„ ๊ฐ€๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค. null์ด ์•„๋‹Œ ์–ด์„ค์…˜์— ์˜์กดํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ์ผ๋ฐ˜์ ์œผ๋กœ ๋‚ด ์ชฝ์˜ ์‹คํŒจ๋กœ ๋ด. ํ•˜์ง€๋งŒ ์ด ๊ฒฝ์šฐ์—๋Š” ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒŒ ์ €๋ฅผ ๊ท€์ฐฎ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

tuple[number] ํ•ญ์ƒ T | undefined ์ž…๋ ฅ๋œ๋‹ค๋ฉด ์ธ๋ฑ์Šค๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๊ฒฝ๊ณ„๊ฐ€ ์ง€์ •๋˜์–ด ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ๋Š” ๊ฒฝ์šฐ๋ฅผ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

@thw0rted Typescript( .map ๋ฐ .reduce ftw)์—์„œ "ํด๋ž˜์‹" for ๋ฃจํ”„๋ฅผ ๋งˆ์ง€๋ง‰์œผ๋กœ ์‚ฌ์šฉํ•œ ์‹œ๊ฐ„์ด ๊ธฐ์–ต๋‚˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์ปดํŒŒ์ผ๋Ÿฌ ์˜ต์…˜์ด ํ›Œ๋ฅญํ•œ imo๊ฐ€ ๋˜๋Š” ์ด์œ ์ž…๋‹ˆ๋‹ค(๊ธฐ๋ณธ์ ์œผ๋กœ ํ•ด์ œ๋  ์ˆ˜ ์žˆ์Œ). ๋งŽ์€ ํ”„๋กœ์ ํŠธ์—์„œ ๊ท€ํ•˜๊ฐ€ ์ œ๊ณตํ•œ ๊ฒฝ์šฐ์™€ ๊ฐ™์€ ์ƒํ™ฉ์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š์œผ๋ฉฐ ๋ฐฐ์—ด ๊ตฌ์กฐ ํ•ด์ œ ๋“ฑ์— ์ธ๋ฑ์Šค ์„œ๋ช…๋งŒ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

(๋‚ด ์›๋ž˜ ์˜๊ฒฌ: https://github.com/microsoft/TypeScript/issues/13778#issuecomment-517759210)

์•„, ์†”์งํžˆ ๋งํ•˜๋ฉด for-loop๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒ‰์ธ์„ ์ƒ์„ฑํ•˜๋Š” ๊ฒฝ์šฐ๋„ ๊ฑฐ์˜ ์—†์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” Object.entries ๋˜๋Š” Array#map ๋ฅผ ๊ด‘๋ฒ”์œ„ํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜์ง€๋งŒ ๊ฐ€๋”์€ ํ‚ค๋ฅผ ์ „๋‹ฌํ•˜์—ฌ ๊ฐ์ฒด์— ๋Œ€ํ•œ ์ƒ‰์ธ์„ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ (์•„๋งˆ๋„ ๋œ ์ž์ฃผ) ๋ฐฐ์—ด์ด๋‚˜ ํŠœํ”Œ์— ๋Œ€ํ•œ ์ƒ‰์ธ์„ ์ „๋‹ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. for ๋ฃจํ”„๋Š” ํ™•์‹คํžˆ ์ธ์œ„์ ์ธ ์˜ˆ์˜€์ง€๋งŒ, ์–ด๋Š ์ชฝ ์˜ต์…˜( undefined ์ด๋“  ์•„๋‹ˆ๋“ )์— ๋‹จ์ ์ด ์žˆ๋‹ค๋Š” ์ ์„ ์ œ๊ธฐํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ ์–ด๋Š ์˜ต์…˜( undefined ์ด๋“  ์•„๋‹ˆ๋“ )์— ๋‹จ์ ์ด ์žˆ๋‹ค๋Š” ์ ์„ ์ œ๊ธฐํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ, TypeScript ์‚ฌ์šฉ์ž๊ฐ€ ์„ ํ˜ธํ•˜๋Š” ๋‹จ์ ์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.wink:

์•„, ์†”์งํžˆ ๋งํ•˜๋ฉด for-loop๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒ‰์ธ์„ ์ƒ์„ฑํ•˜๋Š” ๊ฒฝ์šฐ๋„ ๊ฑฐ์˜ ์—†์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” Object.entries ๋˜๋Š” Array#map ๋ฅผ ๊ด‘๋ฒ”์œ„ํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜์ง€๋งŒ ๊ฐ€๋”์€ ํ‚ค๋ฅผ ์ „๋‹ฌํ•˜์—ฌ ๊ฐ์ฒด์— ๋Œ€ํ•œ ์ƒ‰์ธ์„ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ (์•„๋งˆ๋„ ๋œ ์ž์ฃผ) ๋ฐฐ์—ด์ด๋‚˜ ํŠœํ”Œ์— ๋Œ€ํ•œ ์ƒ‰์ธ์„ ์ „๋‹ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํ•„์š”ํ•œ ๊ฒฝ์šฐ Array#entries ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

์ €๋Š” ๊ฐœ์ธ์ ์œผ๋กœ Array#forEach ๊ทธ๋ ‡๊ฒŒ ๋งŽ์ด ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๋ฐ˜๋ณต์„ ์œ„ํ•ด Array#map ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค(๋งคํ•‘์—๋Š” ํ•ญ์ƒ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค). ๋‚˜๋Š” ๋‚ด ์ฝ”๋“œ๋ฅผ ํ‰ํ‰ํ•˜๊ฒŒ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์„ ์„ ํ˜ธํ•˜๋ฉฐ for...of ๋ฃจํ”„์—์„œ ๋ฒ—์–ด๋‚  ์ˆ˜ ์žˆ๋Š” ๋Šฅ๋ ฅ์— ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

ํŠœํ”Œ์ด ์‹ค์ œ๋กœ ๊ทธ๋ ‡๊ฒŒ ๋‹ค๋ฅธ์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ๋‚˜๋จธ์ง€ ์œ ํ˜•(์˜ˆ: [str, ...num[]] )์„ ์ˆ˜์šฉํ•ด์•ผ ํ•˜๊ณ  ๊ธฐ์ˆ ์ ์œผ๋กœ aa[Infinity] ๋Š” ์™„๋ฒฝํ•˜๊ฒŒ ์œ ํšจํ•œ Javascript์ด๋ฏ€๋กœ ํŠน๋ณ„ํ•œ ๊ฒฝ์šฐ๋ฅผ ๊ฐœ์ฒ™ํ•˜๋Š” ๊ฒƒ์ด ๋ณต์žกํ•ด์ง€๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ท€ํ•˜์˜ ๊ฒŒ์‹œ๋ฌผ์€ ๋˜ํ•œ ์ธ๋ฑ์Šค ๋ฐ˜ํ™˜์„ ์ •์˜๋˜์ง€ ์•Š์€ ๊ฒƒ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐ ๋Œ€ํ•œ ์ง€์›์„ ๋ฐ›๊ฒŒ ๋œ๋‹ค๋ฉด ์–ด๋–ค ๋ชจ์Šต์ผ์ง€ ์ƒ๊ฐํ•˜๊ฒŒ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ท€ํ•˜์˜ ์˜ˆ์—์„œ์™€ ๊ฐ™์ด aa[num] ์‹ค์ œ๋กœ string | number | undefined ๋กœ ์ž…๋ ฅํ–ˆ๋‹ค๋ฉด, ์ธ๋ฑ์Šค๊ฐ€ ๊ฒฝ๊ณ„๋ฅผ ์œ ์ง€ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๋ฉด์„œ๋„ for (let i = 0; i < 2; i++) { foo(aa[i]!); } ๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? ๋‚˜์—๊ฒŒ ์—„๊ฒฉํ•œ null ๊ฒ€์‚ฌ๊ฐ€ ๋‚ด๊ฐ€ ์ž‘์„ฑํ•œ ํ•ญ๋ชฉ์— ํ”Œ๋ž˜๊ทธ๋ฅผ ์ง€์ •ํ•  ๋•Œ ์ฒ˜์Œ์— ๋” ๋‚˜์€ ๊ฒƒ์„ ์ž…๋ ฅํ•˜๊ฑฐ๋‚˜ ๋Ÿฐํƒ€์ž„ ๊ฐ€๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค. null์ด ์•„๋‹Œ ์–ด์„ค์…˜์— ์˜์กดํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ์ผ๋ฐ˜์ ์œผ๋กœ ๋‚ด ์ชฝ์˜ ์‹คํŒจ๋กœ ๋ด. ํ•˜์ง€๋งŒ ์ด ๊ฒฝ์šฐ์—๋Š” ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒŒ ์ €๋ฅผ ๊ท€์ฐฎ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

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 
}

์ด ๋ฌธ์ œ ๋ฅผ ํ•ด๊ฒฐํ•  ๋•Œ 0 | 1 ๋Œ€์‹  keyof typeof aa ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฌผ๋ก  i ์‚ฐ์ˆ ์„ ์ˆ˜ํ–‰ํ•  ๋•Œ ์œ ํ˜• ์•ˆ์ „์€ ์—†์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ ์‚ฌ๋žŒ๋“ค์ด ๊ธฐ๋ณธ "์—„๊ฒฉํ•˜๊ฒŒ ์œ ํ˜• ์•ˆ์ „ํ•˜์ง€๋Š” ์•Š์ง€๋งŒ ํŽธ๋ฆฌํ•œ" ๋ฐฐ์—ด๋ณด๋‹ค ์œ ํ˜• ์•ˆ์ „์„ ์œ„ํ•ด ์ด๊ฒƒ์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

?? ๋ฐ ?. ์—ฐ์‚ฐ์ž๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒƒ์€ Array ๋Œ€ํ•œ ์ž„์˜ ์•ก์„ธ์Šค๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ด ๋” ์ด์ƒ ์ง€๋‚˜์น˜๊ฒŒ ๋ฒˆ๊ฑฐ๋กญ์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ ๋˜ํ•œ ์•„๋งˆ๋„ ํ›จ์”ฌ ๋” ์ผ๋ฐ˜์ ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

  • ๋ฐ˜๋ณต(์˜ˆ: .map ๋˜๋Š” .forEach ์˜ ๊ฒฝ์šฐ " T | undefined "๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ์ฝœ๋ฐฑ์€ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚œ ์ธ๋ฑ์Šค์—์„œ ์‹คํ–‰๋˜์ง€ ์•Š์Œ) ๋˜๋Š”
  • ๋ฃจํ”„์—์„œ Array ๋ฅผ ์ˆœํšŒํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ์ค‘ ์ผ๋ถ€๋Š” ์ •์ ์œผ๋กœ ์•ˆ์ „ํ•˜๋‹ค๊ณ  ํŒ๋‹จ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค( for...of .. ๊ฑฐ์˜ _sparse arrays_ ์ œ์™ธ, for...in ์•ˆ์ „ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค).

๋˜ํ•œ ๋ณ€์ˆ˜๊ฐ€ ๋จผ์ € <index> in <array> ํ™•์ธ๋˜๋ฉด "์•ˆ์ „ํ•œ ์ธ๋ฑ์Šค"๋กœ ๊ฐ„์ฃผ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


_Clarification_ : ๋‚˜๋Š” ์›๋ž˜ ์ด์œ ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ณ  Array<T> ์ธ๋ฑ์Šค ์œ ํ˜• ๊ฐ€์ง€๊ณ  ์žˆ์ง€ [number]: T | undefined (๋Œ€์‹ ์— ๋‹จ์ง€ [number]: T ๊ฐ€ ์‚ฌ์šฉํ•˜๊ธฐ์— ๋„ˆ๋ฌด ๋ณต์žก ๋  ๊ฒƒ์ด๋ผ๊ณ ํ–ˆ๋‹ค).
๋” ์ด์ƒ ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฏ€๋กœ undefined ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@vp2177 ๋ฌธ์ œ๋Š” ๊ธฐ๋Šฅ์ด ์•„๋‹™๋‹ˆ๋‹ค(์˜ˆ, ?. ์ž‘๋™). ๋ฌธ์ œ๋Š” ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ด์— ๋Œ€ํ•ด ๊ฒฝ๊ณ ํ•˜์ง€ ์•Š๊ณ  ๋ฐœ์„ ์˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Linting ๊ทœ์น™์ด ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ์—ฌ์ „ํžˆ ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค.

์˜ˆ, ?. ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค

๋‹ฌ๋ผ์š”. ?. ๋Š” ์ธ๋ฑ์‹ฑ๋œ ๊ฐ’์˜ ์†์„ฑ์— ์•ก์„ธ์Šคํ•˜๋Š” ๋ฐ ์ž‘๋™ํ•˜์ง€๋งŒ ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๊ฐ’์ด ์ •์˜๋˜์—ˆ๋Š”์ง€ ์—ฌ๋ถ€์— ๊ด€๊ณ„์—†์ด ๊ฐ’์ด ์ •์˜๋˜์—ˆ๋‹ค๊ณ  ๊ณ„์† ๋งํ•ฉ๋‹ˆ๋‹ค(#35139 ์ฐธ์กฐ).

๊ฑฐ๊ธฐ์— ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•ด eslint๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  no-unnecessary-condition ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ์ปดํŒŒ์ผ๋Ÿฌ์—์„œ ์ •์˜๋˜์ง€ ์•Š์€ ํ•ญ๋ชฉ์ด ์•„๋‹ˆ๋ฉฐ ?. ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋งŒ๋“ค๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Ÿฌํ•œ ์•ก์„ธ์Šค๋Š” ๋ถˆํ•„์š”ํ•œ ๊ฒƒ์œผ๋กœ ํ‘œ์‹œ๋˜๊ณ  ์ œ๊ฑฐ๋ฉ๋‹ˆ๋‹ค.

@martpie ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค ์ œ ์˜๊ฒฌ์„ ์˜คํ•ดํ•˜์‹  ๊ฒƒ

๋‚ด ๋ง์€... --strictIndexChecks ๋˜๋Š” ์ด์™€ ์œ ์‚ฌํ•œ ๊ฒƒ์ด ์‚ฌ๋žŒ๋“ค์ด ์ด๋Ÿฌํ•œ ์œ ํ˜•์˜ ํ–‰๋™์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ์ข‹์€ ์ƒ๊ฐ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ๋ชจ๋“  ์‚ฌ๋žŒ์„ ์œ„ํ•œ ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์•„๋‹ˆ๋ฉฐ ๋ณด๋‹ค ์—„๊ฒฉํ•œ ์œ ํ˜• ํ™˜๊ฒฝ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” Flow ๊ฐ€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ธ๋ฑ์Šค์— ๋Œ€ํ•ด ์ด๋Ÿฐ ์‹์œผ๋กœ ์ž‘๋™ํ•˜๊ณ  ์•ž์„œ ์–ธ๊ธ‰ํ•œ ๋ฌธ์ œ๊ฐ€ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@bradennapier Flow ๋Š” Array ์˜ ์ธ๋ฑ์Šค ์„œ๋ช…์—์„œ๋„ T | undefined ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค (๋ถˆํ–‰ํžˆ๋„ TypeScript์™€ ๋™์ผ).

๋‚˜๋Š” ์ด์ „์— ๋ชจ๋‘๋ฅผ ํ–‰๋ณตํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋Š” ์ ‘๊ทผ ๋ฐฉ์‹์„ ์ œ์•ˆํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋ง๋กœ ๋ฐ˜๋ณตํ•ด๋„ ๊ดœ์ฐฎ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

๊ธฐ๋ณธ์ ์œผ๋กœ ์ธ๋ฑ์Šค ์„œ๋ช…์˜ ๊ธฐ๋ณธ ๋™์ž‘์€ ๋‹ค์Œ์œผ๋กœ ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค.

  • ๋ฐฐ์—ด ๋˜๋Š” ๊ฐœ์ฒด์—์„œ ์ฝ์„ ๋•Œ | 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]}

TypeScript์˜ ์ข‹์€ ํ™•์žฅ์ด ๋ ๊นŒ์š”?

์•„์ด๋””์–ด๊ฐ€ ๋งˆ์Œ์— ๋“ค์ง€๋งŒ ๋จผ์ € https://github.com/microsoft/TypeScript/issues/2521 ์„ ๊ฐ€์ ธ์™€์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์˜คํ•ดํ•˜์ง€ ๋งˆ์„ธ์š”. ์—ฌ์ „ํžˆ ์šฐ๋ฆฌ๊ฐ€ ์ ˆ๋Œ€์ ์œผ๋กœ

@bradennapier Flow ๋Š” Array ์˜ ์ธ๋ฑ์Šค ์„œ๋ช…์—์„œ๋„ T | undefined ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค (๋ถˆํ–‰ํžˆ๋„ TypeScript์™€ ๋™์ผ).

ํ  ๊ฐ์ฒด ์ธ๋ฑ์Šค๋Š” ์–ด๋–ป์Šต๋‹ˆ๊นŒ? ๋ฐฐ์—ด์— ๋Œ€ํ•œ ํ•„์š”์„ฑ์„ ๋Š๋‚€ ์ ์€ ์—†์ง€๋งŒ ๊ฐœ์ฒด๋ฅผ โ€‹โ€‹์‚ฌ์šฉํ•  ๋•Œ ํ™•์ธํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ๊ฝค ํ™•์‹คํ•ฉ๋‹ˆ๋‹ค.

@bradennapier ๊ฐ์ฒด ์ธ๋ฑ์Šค? o[4] ์—ฌ๊ธฐ์„œ o ๋Š” object ์œ ํ˜•์ž…๋‹ˆ๊นŒ? TypeScript๋Š” ๊ทธ๋ ‡๊ฒŒ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค .....

'4' ์œ ํ˜•์˜ ํ‘œํ˜„์‹์€ '{}' ์œ ํ˜•์„ ์ธ๋ฑ์‹ฑํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
์œ ํ˜• '{}'.ts(7053)์— ์†์„ฑ '4'๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

@RDGthree ๋Š” Microsoft์— ๋Œ€ํ•œ ๋ชจ๋“  ๊ฒƒ์˜ ํ™”์ดํŠธ

strictNullChecks๋ฅผ ์ œ์™ธํ•˜๊ณ  ์œ ํ˜• ์‹œ์Šคํ…œ ๋™์ž‘์„ ๋ณ€๊ฒฝํ•˜๋Š” ํ”Œ๋ž˜๊ทธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ํ”Œ๋ž˜๊ทธ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์˜ค๋ฅ˜ ๋ณด๊ณ ๋ฅผ ํ™œ์„ฑํ™”/๋น„ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์กฐ๊ธˆ ํ›„์— RyanCavanaugh๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋งํ–ˆ์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ์‹ค์ œ๋กœ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์ด ํ”Œ๋ž˜๊ทธ๋กœ ์–ด๋–ค ์ด์ ์„ ์–ป์„ ์ˆ˜ ์žˆ์„์ง€์— ๋Œ€ํ•ด ๋งค์šฐ ํšŒ์˜์ ์ž…๋‹ˆ๋‹ค. ์ง€๋„ ๋ฐ ์ง€๋„์™€ ์œ ์‚ฌํ•œ ์‚ฌ๋ฌผ์€ ์ด๋ฏธ ์˜ตํŠธ์ธ ๊ฐ€๋Šฅ | ์ •์˜ ์‚ฌ์ดํŠธ์—์„œ ์ •์˜๋˜์ง€ ์•Š๊ณ  ์–ด๋ ˆ์ด ์•ก์„ธ์Šค์— EULA์™€ ๊ฐ™์€ ๋™์ž‘์„ ์ ์šฉํ•˜๋Š” ๊ฒƒ์€ ์Šน๋ฆฌ์ฒ˜๋Ÿผ ๋ณด์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์„ ๋ง›์žˆ๊ฒŒ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด์„œ๋Š” CFA์™€ ํƒ€์ž… ๊ฐ€๋“œ๋ฅผ ์ƒ๋‹นํžˆ ๊ฐœ์„ ํ•ด์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ธฐ๋ณธ์ ์œผ๋กœ ๊ทธ๋“ค์€ ๊นƒ๋ฐœ์ด ์š”๊ตฌ๋˜๊ณ  ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค์„ ์™„๋ฒฝํ•˜๊ฒŒ ์•Œ๊ณ  ์žˆ์œผ๋ฉฐ, ์ง€๊ธˆ๊นŒ์ง€ ์‚ฌ๋žŒ๋“ค์ด ์ด๊ฒƒ์œผ๋กœ๋ถ€ํ„ฐ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ๋‹ค์†Œ ๋ชจํ˜ธํ•œ ์ด์ต์„ ์œ„ํ•ด ์ผํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ๋‹ค๊ณ  ํ™•์‹ ํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ์†”์งํžˆ ๋งํ•ด์„œ ๋‚˜๋Š” ๋†€๋ž์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ๋ชจ๋“  ์‚ฌ๋žŒ๋“ค์ด ์ด๋ฏธ ์–ธ๊ธ‰๋œ ๊ฒƒ๊ณผ ๊ฑฐ์˜ ๋˜‘๊ฐ™์€ ์ œ์•ˆ๊ณผ ์˜ˆ๋ฅผ ๊ฐ€์ง€๊ณ  ๊ณ„์† ์—ฌ๊ธฐ์— ์˜ค๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ด์ƒ์ ์œผ๋กœ๋Š” for of ๋˜๋Š” ๋ฐฐ์—ด์— ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ๊ฐœ์ฒด ๋Œ€์‹  Map ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(๋˜๋Š” ๋œ ํšจ๊ณผ์ ์œผ๋กœ 'T | undefined' ๊ฐœ์ฒด ๊ฐ’).

๋‚˜๋Š” ์ธ๊ธฐ์žˆ๋Š” DT ํŒจํ‚ค์ง€๋ฅผ ์œ ์ง€ํ•˜๊ณ  ์‚ฌ๋žŒ๋“ค์ด http ํ—ค๋” ๋งต๊ณผ ๊ฐ™์€ ํ•ญ๋ชฉ์— |undefined ๋ฅผ ๊ณ„์† ์ถ”๊ฐ€ํ•˜๋„๋ก ์š”์ฒญํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ๊ธฐ์— ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๊ฑฐ์˜ ๋ชจ๋“  ๊ธฐ์กด ์‚ฌ์šฉ์„ ์ค‘๋‹จ์‹œํ‚ค๋Š” ๋น„ํŠธ๋ฅผ ์ œ์™ธํ•˜๊ณ  ์™„์ „ํžˆ ํ•ฉ๋ฆฌ์ ์ž…๋‹ˆ๋‹ค. , ๊ทธ๋ฆฌ๊ณ  Object.entries() ์™€ ๊ฐ™์€ ๋‹ค๋ฅธ ์•ˆ์ „ํ•œ ์‚ฌ์šฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๊ธฐ ํ›จ์”ฌ ๋” ๋‚˜์˜๊ฒŒ ๋งŒ๋“ ๋‹ค๋Š” ์‚ฌ์‹ค. ๋‹น์‹ ์˜ ์˜๊ฒฌ์ด Typescript ์ œ์ž‘์ž์˜ ์˜๊ฒฌ๋ณด๋‹ค ๋‚ซ๋‹ค๊ณ  ๋ถˆํ‰ํ•˜๋Š” ๊ฒƒ ์™ธ์— ์‹ค์ œ๋กœ ์—ฌ๊ธฐ์— ๊ธฐ์—ฌํ•œ ๊ฒƒ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

Simon, ๋‚ด๊ฐ€ ๋‹น์‹ ์˜ ์˜๊ฒฌ์„ ์ž˜๋ชป ์ฝ์—ˆ์„ ์ˆ˜๋„ ์žˆ์ง€๋งŒ ์›๋ž˜ ์ œ์•ˆ์— ์ฐฌ์„ฑํ•˜๋Š” ์ฃผ์žฅ์ฒ˜๋Ÿผ ๋“ค๋ฆฝ๋‹ˆ๋‹ค. "๋ผ์ŠคํŠธ ๋งˆ์ผ" ๋ˆ„๋ฝ ๊ธฐ๋Šฅ์€ ์ปจํ…์ŠคํŠธ์— ๋”ฐ๋ผ ์†์„ฑ์„ | undefined ๋กœ ์ฒ˜๋ฆฌ ํ•˜์ง€๋งŒ ๋‹ค๋ฅธ ๊ฒฝ์šฐ์—๋Š” ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ #2521 upthread์— ๋Œ€ํ•œ ๋น„์œ ๋ฅผ ๊ทธ๋ ธ์Šต๋‹ˆ๋‹ค.

์ด์ƒ์ ์ธ ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐฐ์—ด์ด๋‚˜ ๊ฐ์ฒด๋ฅผ ์„ ์–ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

๋‚˜๋Š” ์–ด๋–ป๊ฒŒ๋“  ๋๋‚ผ ์ˆ˜ ์žˆ๋‹ค

  • arr[n] ์œ ํ˜•์€ T | undefined
  • arr[n] = undefined ์€(๋Š”) ์˜ค๋ฅ˜์ž…๋‹ˆ๋‹ค.
  • T | undefined ์•„๋‹Œ T ๋กœ ์ž…๋ ฅ๋œ ๊ฐ’์„ ์ œ๊ณตํ•˜๋Š” arr ์— ๋Œ€ํ•œ ์ผ์ข…์˜ ๋ฐ˜๋ณต์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • obj[k] ์œ ํ˜•์€ V | undefined
  • obj[k] = undefined ์€(๋Š”) ์˜ค๋ฅ˜์ž…๋‹ˆ๋‹ค.
  • ์˜ˆ๋ฅผ ๋“ค์–ด Object.entries() ๋Š” [K, V] ํŠœํ”Œ์„ ์ œ๊ณตํ•ด์•ผ ํ•˜๋ฉฐ ์•„๋ฌด๊ฒƒ๋„ ์ •์˜ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋‚ด ๊ด€์ ์—์„œ ์ด ๋ฌธ์ œ๋ฅผ ์ •์˜ํ•˜๋Š” ๊ฒƒ์€ ๋ฌธ์ œ์˜ ๋น„๋Œ€์นญ์  ํŠน์„ฑ์ž…๋‹ˆ๋‹ค.

for ๋ฃจํ”„๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฐœ๋ฐœ์ž์˜ ๋ฌธ์ œ๋ผ๋Š” ๋ง์€ Array Destructuring์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฐœ๋ฐœ์ž๋ฅผ ๊ณ ๋ คํ•˜์ง€ ๋ชปํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. Typescript์—์„œ ๊นจ์ ธ ์ด ๋ฌธ์ œ๋กœ ์ธํ•ด ์ˆ˜์ •๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ถ€์ •ํ™•ํ•œ ์ž…๋ ฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์˜ํ–ฅ์„ ๋ฐ›๋Š” IMO Array Destructuring์€ ์—ฌ์ „ํžˆ โ€‹โ€‹for ๋ฃจํ”„๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ํ›จ์”ฌ ๋” ํฐ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

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 ๋ฃจํ”„ ๋ฐฐ์—ด ์ธ๋ฑ์‹ฑ์„ ์บ์ŠคํŠธํ•˜์—ฌ ์ด ์ „์ฒด ๋ฌธ์ œ๋ฅผ ์Œ์†Œ๊ฑฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

๋ฌธ์ œ๋Š” Typescript๊ฐ€ ์ด ๋™์ž‘์— ๋Œ€ํ•ด ๊ฒฝ๊ณ ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž๋กœ์„œ ์šฐ๋ฆฌ๋Š” ์ˆ˜๋™์œผ๋กœ ์ด๊ฒƒ์„ ์ •์˜๋˜์ง€ ์•Š์€ ๊ฒƒ์œผ๋กœ ์บ์ŠคํŒ…ํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ๊ธฐ์–ตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๊ฐœ๋ฐœ์ž์—๊ฒŒ ๋” ๋งŽ์€ ์ž‘์—…์„ ์œ ๋ฐœํ•˜๋Š” ๋„๊ตฌ์— ๋Œ€ํ•œ ๋‚˜์œ ๋™์ž‘์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ ๊ณต์ •ํ•˜๊ธฐ ์œ„ํ•ด ์บ์ŠคํŠธ๋Š” ์‹ค์ œ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

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

}

์ „ํ˜€ ์ข‹์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์œ„์—์„œ ๋งํ–ˆ๋“ฏ์ด ์ฃผ์š” ๋ฌธ์ œ๋Š” ์ด๋Ÿฐ ์‹์œผ๋กœ ์ž…๋ ฅํ•  ํ•„์š”์กฐ์ฐจ ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. TS๋Š” ์ด์— ๋Œ€ํ•ด ์ „ํ˜€ ๊ฒฝ๊ณ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์ฝ”๋“œ๋ฅผ ํ‘ธ์‹œํ•˜๊ธฐ ์œ„ํ•ด ์ด๊ฒƒ์„ ์žŠ์–ด๋ฒ„๋ฆฐ ๊ฐœ๋ฐœ์ž๋กœ ์ด์–ด์ง‘๋‹ˆ๋‹ค. ๋ฉ‹์ง„ CI๋Š” tsc ๋ณ‘ํ•ฉ ๋ฐ ๋ฐฐํฌ์—์„œ ๋ฌธ์ œ๋ฅผ ์ฐพ์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. TS๋Š” ์ฝ”๋“œ์— ๋Œ€ํ•œ ํ™•์‹ ์„ ์ฃผ๊ณ  ๋ถ€์ •ํ™•ํ•œ ์ž…๋ ฅ์ด ์ œ๊ณต๋˜๋ฉด ์ž˜๋ชป๋œ ํ™•์‹ ์„ ๊ฐ–๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. => ๋Ÿฐํƒ€์ž„ ์˜ค๋ฅ˜!

๊ทธ๊ฒƒ์€ "์บ์ŠคํŠธ"๊ฐ€ ์•„๋‹ˆ๋ฉฐ ํ˜•์‹ ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ž…๋ ฅํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚ด ์š”์ ์€ ๋‹น์‹ ์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋ฐฉ๋ฒ•์„ ์ž…๋ ฅํ•˜๋ฉด, (์ด์ „ ์„œ๋ช… ์•ˆ์ „ํ•˜์ง€๋ฅผ ํ˜ธ์ถœ ํ•œ ํ›„ ์‚ฌ๋žŒ์ด์—ˆ๋‹ค args: string[] ๊ทธ๋“ค์ดํ•ด์•ผ๋Œ€๋กœ๊ฐ€ ๋ณด์žฅํ•˜์ง€ ์•Š์„ ๋•Œ) ์ง€๊ธˆ, ์ปดํŒŒ์ผ์‹œ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค ์˜ฌ๋ฐ”๋ฅธ ์ˆ˜์˜ ์ธ์ˆ˜๋ฅผ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ๋žŒ๋“ค์ด ํ•„์š”ํ•œ ๋ชจ๋“  ์ธ์ˆ˜๋ฅผ ์ „๋‹ฌํ•˜์ง€ ๋ชปํ•˜๊ณ  ์‹คํ–‰ ์‹œ๊ฐ„์— ์ง์ ‘ ํ™•์ธํ•˜๋„๋ก ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์‹ค์ œ๋กœ (args: [string?, number?, ...string[]]) ๋กœ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ๋งค์šฐ ์‰ฝ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ์ด๋ฏธ ํ›Œ๋ฅญํ•˜๊ฒŒ ์ž‘๋™ํ•˜๋ฉฐ ์ด ๋ฌธ์ œ์™€ ๊ด€๋ จ์ด ์—†์Šต๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์€ ๋‹จ์ง€ ๊ทธ ํ•จ์ˆ˜์—์„œ ์ด ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋‹ค๋ฅธ ํ•จ์ˆ˜๋กœ ๋ฌธ์ œ๋ฅผ ์ด๋™์‹œํ‚ฌ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์—ฌ์ „ํžˆ ์‚ฌ์šฉ์ž๊ฐ€ ์ œ๊ณตํ•œ ๋ฌธ์ž์—ด์„ ๋ณ„๋„์˜ ๊ฐ’์œผ๋กœ ๊ตฌ๋ฌธ ๋ถ„์„ํ•ด์•ผ ํ•˜๋ฏ€๋กœ ๋ฐฐ์—ด ๊ตฌ์กฐ ๋ถ„ํ•ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” commandHandler ๋‚ด๋ถ€์—์„œ ๊ตฌ๋ฌธ ๋ถ„์„ํ•˜๋ฉด ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

Array Destructuring์— ๋ถ€์ •ํ™•ํ•œ ์ž…๋ ฅ์„ ์ œ๊ณตํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์—†์Šต๋‹ˆ๋‹ค.

๋ฌธ์ œ์˜ ์›๋ž˜ ์š”์ ์—์„œ ๋„ˆ๋ฌด ๋ฒ—์–ด๋‚˜๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ : ๊ทธ๊ฒƒ๋“ค์ด ๋ณ„๊ฐœ์˜ ๋ฌธ์ œ๋กœ ๋‹ค๋ฃจ์–ด์ ธ์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์— ๋™์˜ํ•˜์ง€๋งŒ, ๋ˆ„๊ตฐ๊ฐ€ ์–ด๋ ˆ์ด ๊ตฌ์กฐ ํ•ด์ฒด ๋ฌธ์ œ๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ๋ฌธ์ œ๋ฅผ ์—ด๋ฉด, ๊ทธ๊ฒƒ์€ ๋‹ซํžˆ๊ณ  ์‚ฌ์šฉ์ž๋Š” ์—ฌ๊ธฐ๋กœ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค. #38259 #36635 #38287 etc... ๊ทธ๋ž˜์„œ ๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ์ด ๋ฌธ์ œ์˜ ์ฃผ์ œ์—์„œ ๋ฒ—์–ด๋‚˜๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ๋ถˆ๋งŒ ์ค‘ ์ผ๋ถ€๋Š” | 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 eslint ๊ทœ์น™์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์„ ๋” ์‰ฝ๊ฒŒ ๋งŒ๋“ค ๊ฒƒ์ด๋ผ๊ณ  ์ƒ์ƒํ•ฉ๋‹ˆ๋‹ค. (์˜ˆ: "๋งˆ์ง€๋ง‰์— as ? ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ Lint ์˜ค๋ฅ˜๋ฅผ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.") ๊ทœ์น™์—๋Š” ์•ˆ์ „ํ•œ ์ž๋™ ์ˆ˜์ • ํ”„๋กœ๊ทธ๋žจ์ด ํฌํ•จ๋  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋Ÿฐํƒ€์ž„ ๋ฌธ์ œ๊ฐ€ ์•„๋‹Œ ์ปดํŒŒ์ผ ์ค‘๋‹จ๋งŒ ์œ ๋ฐœํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

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

๊ทธ๋ž˜๋„ ์ด ๋†€๋ผ์šด TS ๊ธฐ๋Šฅ ์™ธ์—๋Š” ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์ด ์—†๋Š” ๊ฒƒ ๊ฐ™์•„์š” ใ…Žใ…Ž

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

์‘๋‹ตํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฐ™์€ ๊ธฐ๋Šฅ์ด ์ž‘๋™ ๊ฒƒ์ด๋‹ค (๊ทธ๋ฆฌ๊ณ  ๊ฑฐ์˜ ํ™•์‹ค ๋Œ€๋ถ€๋ถ„์˜ JS ์—”์ง„์— ์˜ํ•ด ๋ฉ€๋ฆฌ ์ตœ์ ํ™” ๋  ๊ฒƒ์ด๋‹ค) ๋™์•ˆ, ๋‚˜๋Š” ์˜คํžˆ๋ ค ์—ฌ๋ถ„์˜ ๊ตฌ๋ฌธ์€ ์žก์Œ (์–ธ๊ธ‰ ํ•œ ๋™์˜ ๊ฒƒ as ComplexType | undefined ) ์ปดํŒŒ์ผ JS ํŒŒ์ผ์ด ๋ฐฉ๋ฒ•์„ ์œ ์ง€ํ•ด์•ผ "๋ž˜ํผ ์ด์ƒ " ์–ด๋””์—๋‚˜ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ๊ตฌ๋ฌธ ์˜ต์…˜(์œ„์˜ as ? ๋ณด๋‹ค ์‚ฌ์šฉ ์‚ฌ๋ก€์— ๋œ ๊ตญํ•œ๋จ)์€ ์œ ํ˜• ์–ด์„ค์…˜์—์„œ infer ํ‚ค์›Œ๋“œ๋ฅผ ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์œ ์ถ”๋œ ์œ ํ˜•์— ๋Œ€ํ•œ ์ž๋ฆฌ ํ‘œ์‹œ์ž๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ—ˆ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ˆ:

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

ํ˜„์žฌ infer ์„ ์–ธ์—๋งŒ ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค extends ์กฐ๊ฑด ์œ ํ˜• (์ ˆ ts(1338) ๊ทธ๋ž˜์„œ ์ œ๊ณต) infer ์˜ ๋งฅ๋ฝ์—์„œ ํ‚ค์›Œ๋“œ ์˜๋ฏธ๋ฅผ as [...] ์œ ํ˜• ์–ด์„ค์…˜์€ ๊ฐ„์„ญํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

eslint ๊ทœ์น™์„ ํ†ตํ•ด 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

์–ด์จŒ๋“  ๋‹ค๋ฅธ ์•ˆ์ „ํ•œ ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๊ณ„์† ๊ธฐ์–ตํ•ด์•ผ ํ•œ๋‹ค๋ฉด ์•„๋ฌด ์†Œ์šฉ์ด ์—†์Šต๋‹ˆ๋‹ค. ์š”์ ์€ ์šฐ๋ฆฌ๊ฐ€ ๋งค์šฐ ์ข‹์€ ๋‚ ์ด๋“  ํ”ผ๊ณคํ•˜๋“  ์ฝ”๋“œ๋ฒ ์ด์Šค์— ์ฒ˜์Œ์ด๋“  ์ƒ๊ด€์—†์ด TypeScript๊ฐ€ ์šฐ๋ฆฌ๋ฅผ ์ง€์›ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์šฐ๋ฆฌ์˜ ํ˜„์žฌ ๋™์ž‘์€ 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๊ฐ€์ง€ ๋‹ค๋ฅธ ๊ตฌ์„ฑ์„ CI ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์—†์Œ) Array<T>[number] ๋ฅผ T ์œผ๋กœ ๋‚จ๊ฒจ๋‘์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค

๊ท€ํ•˜์˜ ์˜ˆ์—์„œ @RyanCavanaugh write(arr, undefined) , ํ˜ธ์ถœ write ์ธ์ • ๋  ์ˆ˜ ์žˆ์ง€๋งŒ ๊ฒƒ์—†๋Š” ํ• ๋‹น arr[0] = v; ๋” ์ด์ƒ ์ปดํŒŒ์ผ?

์œ„์˜ write ํ•จ์ˆ˜๊ฐ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์ œ๊ณต๋˜๊ณ  ํ”Œ๋ž˜๊ทธ ์—†์ด ์ปดํŒŒ์ผ๋œ JS์ธ ๊ฒฝ์šฐ์—๋Š” ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์„ ํƒํ•œ ํ”Œ๋ž˜๊ทธ๋กœ ์ปดํŒŒ์ผํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฏธ ์กด์žฌํ•˜๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์—„๊ฒฉํ•œ null ๊ฒ€์‚ฌ ์—†์ด ์ปดํŒŒ์ผ๋œ ๊ฒฝ์šฐ ํ•ด๋‹น ํ•จ์ˆ˜๋Š” string ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์‹ค์ œ๋กœ๋Š” string|undefined ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์š”์ฆ˜ ๋Œ€๋ถ€๋ถ„์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” null ๊ฒ€์‚ฌ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์‚ฌ๋žŒ๋“ค์ด ๋ถˆํ‰ํ•ฉ๋‹ˆ๋‹ค. ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ด ์ƒˆ ํ”Œ๋ž˜๊ทธ๊ฐ€ ์กด์žฌํ•˜๋ฉด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์ด๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์‹œ์ž‘ํ•˜๊ณ  ๊ฒฐ๊ตญ ๋Œ€๋ถ€๋ถ„์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์ด ํ”Œ๋ž˜๊ทธ๊ฐ€ ์„ค์ •๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

๋˜ํ•œ ๋จธ๋ฆฌ ์œ„์—์„œ ๊ตฌ์ฒด์ ์ธ ์˜ˆ๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์ง€๋งŒ ๋‚ด ์•ฑ์„ ์ปดํŒŒ์ผํ•˜๋ ค๋ฉด skipLibCheck ๋ฅผ ์„ค์ •ํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด TS ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋ฅผ ๋งŒ๋“ค ๋•Œ๋งˆ๋‹ค ์ƒ์šฉ๊ตฌ์˜ ํ‘œ์ค€ tsconfig ์˜ต์…˜์ž…๋‹ˆ๋‹ค. ๋ฌธ์ œ๊ฐ€ ๋„ˆ๋ฌด ๋งŽ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๊ฐœ์ธ์ ์œผ๋กœ(์•„๋งˆ๋„ ์ด๊ธฐ์ ์œผ๋กœ), _my_ ์ฝ”๋“œ๊ฐ€ ์ผ๋ฐ˜์ ์œผ๋กœ ๋” ์•ˆ์ „ํ•ด์ง„๋‹ค๋ฉด ๊ทน๋‹จ์ ์ธ ๊ฒฝ์šฐ์— ํƒ€๊ฒฉ์„ ๋ฐ›๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๊ฒฝ์šฐ๋ณด๋‹ค ๋” ์ž์ฃผ ์ธ๋ฑ์Šค๋กœ ๋ฐฐ์—ด์— ์•ก์„ธ์Šคํ•  ๋•Œ ๋„ ํฌ์ธํ„ฐ์— ๋ถ€๋”ชํž ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ํ™•์‹ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐฐ์—ด์ธ ๊ฒฝ์šฐ[์ˆซ์ž]๋Š” ๋ฌธ์ž์—ด์ž…๋‹ˆ๋‹ค | ์ •์˜๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ์“ฐ๊ธฐ์— ๊ฑด์ „์„ฑ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์ œ ์ƒ๊ฐ์—๋Š” Array<string>[number] ๋Š” ํ•ญ์ƒ string|undefined ์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ˆซ์ž๊ฐ€ ์žˆ๋Š” ๋ฐฐ์—ด์— ์ธ๋ฑ์Šค๋ฅผ ์ง€์ •ํ•˜๋ฉด ๋ฐฐ์—ด์˜ ํ•ญ๋ชฉ ์œ ํ˜• ๋˜๋Š” ์ •์˜๋˜์ง€ ์•Š์€ ํ•ญ๋ชฉ์ด ํ‘œ์‹œ๋˜๋Š” ๊ฒƒ์ด ํ˜„์‹ค์ž…๋‹ˆ๋‹ค. ํŠœํ”Œ๋กœ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ฐฐ์—ด ๊ธธ์ด๋ฅผ ์ธ์ฝ”๋”ฉํ•˜์ง€ ์•Š๋Š” ํ•œ ์‹ค์ œ๋กœ ๋” ๊ตฌ์ฒด์ ์ผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. string|undefined ๋ฅผ ๋ฐฐ์—ด ์ธ๋ฑ์Šค์— ํ• ๋‹นํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ž‘์„ฑ ์˜ˆ์ œ๋Š” ์œ ํ˜• ๊ฒ€์‚ฌ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

"์ธ๋ฑ์Šค ์ฝ๊ธฐ ์œ ํ˜•"๊ณผ "์ธ๋ฑ์Šค ์“ฐ๊ธฐ ์œ ํ˜•" ๋ชจ๋‘์— ์œ ํ˜• ๊ตฌ๋ฌธ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์€ ๋„ˆ๋ฌด ๋ณต์žกํ•ด ๋ณด์ž…๋‹ˆ๋‹ค. ์ƒ๊ฐ?

์ด๊ฒƒ์€ ๋‘ ๊ฐ€์ง€๊ฐ€ ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ์ •ํ™•ํžˆ ๋ฌด์—‡์ด์–ด์•ผ ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋ฐฐ์—ด์—๋Š” ์ •์˜๋œ ์ธ๋ฑ์Šค๊ฐ€ ์—†์œผ๋ฏ€๋กœ ํ•ญ์ƒ ์ •์˜๋˜์ง€ ์•Š์„ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. Array<string>[number] ์˜ ์œ ํ˜•์€ string|undefined ์ž…๋‹ˆ๋‹ค. ๋‹น์‹ ์ด ์›ํ•˜๋Š” ๊ฒƒ์„ ์ง€์ •ํ•˜๋ ค๋ฉด T ์—์„œ Array<T> , ์œ ํ‹ธ๋ฆฌํ‹ฐ ์œ ํ˜•์ด ์‚ฌ์šฉ๋  ์ˆ˜๋ฅผ (์ž˜๋˜์ง€ ๋ช…๋ช…) : ArrayItemType<Array<string>> = string . ์ด๊ฒƒ์€ RecordValue<Record<string, number>, string> = string ์™€ ๊ฐ™์€ ๊ฒƒ์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ๋Š” Record ์œ ํ˜•์—๋Š” ๋„์›€์ด ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์—๋Š” ํ›Œ๋ฅญํ•œ ์†”๋ฃจ์…˜์ด ์—†๋‹ค๋Š” ๋ฐ ๋™์˜ํ•˜์ง€๋งŒ ์ธ๋ฑ์Šค ์ฝ๊ธฐ์˜ ๊ฑด์ „ํ•จ์„ ์„ ํ˜ธํ•  ๊ฒƒ์ด๋ผ๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ๋งŽ์€ ์–ธ์–ด(Rust์™€ ๊ฐ™์€ "์•ˆ์ „ํ•œ" ์–ธ์–ด๋ฅผ ํฌํ•จํ•˜์—ฌ)๋Š” ๊ฒฝ๊ณ„ ๊ฒ€์‚ฌ์— ๋Œ€ํ•œ ์ฑ…์ž„์„ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋งก๊ธฐ๊ธฐ ๋•Œ๋ฌธ์— ๋ฐฐ์—ด์—์„œ ์ด๊ฒƒ์ด ํ•„์š”ํ•˜๋‹ค๊ณ  ํŠน๋ณ„ํžˆ ๊ฐ•ํ•˜๊ฒŒ ๋Š๋ผ์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. . ๋˜ํ•œ ์ด ๊ตฌ๋ฌธ์€ foo[i] ์™€ ๊ฐ™์€ ๋Œ€๊ด„ํ˜ธ ํ‘œ๊ธฐ๋ฒ•์„ _ํ•ญ์ƒ_ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ์— ๋งค์šฐ ๋ช…ํ™•ํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒฝํ–ฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ฆ‰, foo.bar ์˜ ์„œ๋ช…์ด ์˜ฌ๋ฐ”๋ฅธ์ง€ ์—ฌ๋ถ€๋ฅผ ๋งํ•˜๊ธฐ๊ฐ€ ๋งค์šฐ ์–ด๋ ต๊ธฐ ๋•Œ๋ฌธ์—(๋ช…์‹œ์ ์œผ๋กœ ์ •์˜๋œ bar ํ•„๋“œ๋กœ ์ธํ•ด) ๋ฌธ์ž์—ด ์ธ๋ฑ์‹ฑ๋œ ๊ฐ์ฒด์— ์ด๊ฒƒ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ๊ฐ•ํ•˜๊ฒŒ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋˜๋Š” undefined (์ƒ‰์ธ ์„œ๋ช…์˜ ์ผ๋ถ€์ด๊ธฐ ๋•Œ๋ฌธ์—). ์ด ๊ฒฝ์šฐ(๊ฐ€์น˜๊ฐ€ ๋งค์šฐ ๋†’๋‹ค๊ณ  ์ƒ๊ฐํ•จ)๊ฐ€ ํ•ด๊ฒฐ๋˜๋ฉด ์–ด๋ ˆ์ด ์‚ฌ๋ก€๊ฐ€ ํ•˜์ฐฎ์•„์ง€๊ณ  ์•„๋งˆ๋„ ํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.


"์ธ๋ฑ์Šค ์ฝ๊ธฐ ์œ ํ˜•"๊ณผ "์ธ๋ฑ์Šค ์“ฐ๊ธฐ ์œ ํ˜•" ๋ชจ๋‘์— ์œ ํ˜• ๊ตฌ๋ฌธ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์€ ๋„ˆ๋ฌด ๋ณต์žกํ•ด ๋ณด์ž…๋‹ˆ๋‹ค. ์ƒ๊ฐ?

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ getter ๋ฐ setter ๊ตฌ๋ฌธ์„ ์œ ํ˜• ์ •์˜๋กœ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ ๊ตฌ๋ฌธ์€ TypeScript์—์„œ ์™„์ „ํžˆ ์ดํ•ด๋ฉ๋‹ˆ๋‹ค.

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

๊ทธ๋Ÿฌ๋‚˜ TS๋Š” ํ˜„์žฌ ํ•„๋“œ์˜ "get" ๋ฐ "set" ์œ ํ˜•์„ ๋ณ„๋„๋กœ ์ถ”์ ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋‹จ์ผ ์œ ํ˜•์œผ๋กœ ์ด๋“ค์„ "๋ณ‘ํ•ฉ"ํ•ฉ๋‹ˆ๋‹ค. ์ด ์ ‘๊ทผ ๋ฐฉ์‹์€ ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ๊ฒฝ์šฐ์— ์ž‘๋™ํ•˜์ง€๋งŒ getter์™€ setter๊ฐ€ ๋™์ผํ•œ ์œ ํ˜•์„ ๊ณต์œ ํ•ด์•ผ ํ•˜๊ณ  setter๋งŒ ์ •์˜ํ•˜๋Š” ํ•„๋“œ์— getter ์œ ํ˜•์„ ์ž˜๋ชป ํ• ๋‹นํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ๊ณ ์œ ํ•œ ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

TS๊ฐ€ ๋ชจ๋“  ํ•„๋“œ(์‹ค์ œ ์„ฑ๋Šฅ ๋น„์šฉ์ด ์žˆ์„ ์ˆ˜ ์žˆ์Œ)์— ๋Œ€ํ•ด "get" ๋ฐ "set"์„ ๋ณ„๋„๋กœ ์ถ”์ ํ•˜๋Š” ๊ฒฝ์šฐ ์ด๋Ÿฌํ•œ ๋‹จ์ ์„ ํ•ด๊ฒฐํ•˜๊ณ  ์ด ๋ฌธ์ œ์— ์„ค๋ช…๋œ ๊ธฐ๋Šฅ์„ ์„ค๋ช…ํ•˜๊ธฐ ์œ„ํ•œ ๋ฉ”์ปค๋‹ˆ์ฆ˜๋„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

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

๋ณธ์งˆ์ ์œผ๋กœ ๋‹ค์Œ์˜ ์•ฝ์–ด๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

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

Array์˜ ์˜๋ฏธ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์„ ์ถ”๊ฐ€ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.[์ˆซ์ž]๋Š” ์ด ํ”Œ๋ž˜๊ทธ๊ฐ€ ์„ ์–ธ ํŒŒ์ผ์˜ ํ•ด์„์„ ๋ณ€๊ฒฝํ•จ์„ ์˜๋ฏธํ•˜๋ฏ€๋กœ ์ •๋ง ๋ฌธ์ œ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

์ƒ์„ฑ๋œ ์„ ์–ธ ํŒŒ์ผ์ด ํ•ญ์ƒ ์™„์ „ํ•œ getter+setter ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ–ˆ๋‹ค๋ฉด, ์ด๊ฒƒ์€ _only_ ์†์œผ๋กœ ์“ด ๊ฒƒ์˜ ๋ฌธ์ œ๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ˜„์žฌ ๊ทœ์น™์„ ์ •์˜ ํŒŒ์ผ์—๋งŒ ์žˆ๋Š” ๋‚˜๋จธ์ง€ ์•ฝ์‹ ๊ตฌ๋ฌธ์— ์ ์šฉํ•˜๋Š” ๊ฒƒ์ด ์—ฌ๊ธฐ์—์„œ ํ•ด๊ฒฐ์ฑ…์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ™•์‹คํžˆ ํ˜ธํ™˜์„ฑ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์ง€๋งŒ .ts ํŒŒ์ผ๊ณผ .d.ts ํŒŒ์ผ์„ ์ฝ๋Š” ์ •์‹ ์  ๋น„์šฉ๋„ ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค.


๊ณ์—:

๋ฌผ๋ก  ์ด๊ฒƒ์€ getter/setter์˜ _๋ชจ๋“ _ ๋ฏธ๋ฌ˜ํ•œ ๊ฒฝ๊ณ ๋ฅผ ๋‹ค๋ฃจ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

์ด๊ฒƒ์€ ๋” ๊ทน๋‹จ์ ์ธ ๊ฒฝ์šฐ์ด๋ฉฐ TS ๋ชฉํ‘œ์˜ ๋ฒ”์œ„ ๋‚ด์— ์žˆ๋Š”์ง€ ๊ณ ๋ คํ•ด ๋ณผ ๊ฐ€์น˜๊ฐ€ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์—ฌ๊ธฐ์—์„œ ์ œ์•ˆํ•œ ๋‚ด์šฉ์ด TypeScript์˜ ํ˜„์žฌ ๋™์ž‘๊ณผ ์ผ์น˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์–ด๋Š ์ชฝ์ด๋“  ๋ณ„๋„๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋Œ“๊ธ€์˜ ๋ชจ๋“  ํŽ˜์ด์ง€์— ํŒ์—…์„ ํ‘œ์‹œํ•˜๊ณ  #2521์— ๋Œ€ํ•œ ๋งํฌ๋ฅผ ๋‹ค์‹œ ๋“œ๋กญํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋Š๊ปด์ง‘๋‹ˆ๋‹ค.

"์ธ๋ฑ์Šค ์ฝ๊ธฐ ์œ ํ˜•"๊ณผ "์ธ๋ฑ์Šค ์“ฐ๊ธฐ ์œ ํ˜•" ๋ชจ๋‘์— ์œ ํ˜• ๊ตฌ๋ฌธ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์€ ๋„ˆ๋ฌด ๋ณต์žกํ•ด ๋ณด์ž…๋‹ˆ๋‹ค. ์ƒ๊ฐ?

์•„๋‹ˆ์š”! ๊ทธ๋ฆฌ๊ณ  ์ ์–ด๋„ (๋งํฌ ํด๋ฆญ...) ์—ฌ๊ธฐ์— ์žˆ๋Š” 116๋ช…์˜ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด ๋‚˜์™€ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ์ ์–ด๋„ ์ฝ๊ธฐ์™€ ์“ฐ๊ธฐ๋ฅผ ๋‹ค๋ฅด๊ฒŒ ์ž…๋ ฅํ•  ์ˆ˜ ์žˆ๋Š” ์˜ต์…˜์ด ์žˆ์œผ๋ฉด ์ •๋ง ๊ธฐ์  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ํ•ด๋‹น ๊ธฐ๋Šฅ์˜ ๋˜ ๋‹ค๋ฅธ ํ›Œ๋ฅญํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€์ž…๋‹ˆ๋‹ค.

์ ์–ด๋„ ์ฝ๊ธฐ์™€ ์“ฐ๊ธฐ๋ฅผ ๋‹ค๋ฅด๊ฒŒ ์ž…๋ ฅํ•  ์ˆ˜ ์žˆ๋Š” ์˜ต์…˜์ด ์žˆ์œผ๋ฉด _๋„ˆ๋ฌด ๊ธฐ์ฉ๋‹ˆ๋‹ค_. ์ด๊ฒƒ์€ ๊ทธ ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ _๋˜ ๋‹ค๋ฅธ_ ํ›Œ๋ฅญํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ์˜๋„๊ฐ€ ์ฝ๊ธฐ ๋ฐ ์“ฐ๊ธฐ ์œ ํ˜•์„ ์ฐธ์กฐํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์–ด์•ผ ํ•˜๋Š”์ง€ ์งˆ๋ฌธํ•˜๋Š” ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์“ฐ๊ธฐ ์œ ํ˜•์„ ์ฐธ์กฐํ•˜๊ธฐ ์œ„ํ•ด Array<string>[number]= ์™€ ๊ฐ™์€ ๊ฒƒ์ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

๋‘ ๊ฐ€์ง€ ์ผ์ด ๋ฐœ์ƒํ•˜๋ฉด #2521๊ณผ ์ด ๋ฌธ์ œ์˜ ํ•ด๊ฒฐ์— ๋งŒ์กฑํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

  • ๋จผ์ € #2521์— ๋”ฐ๋ผ getter์™€ setter๋ฅผ ๋‹ค๋ฅด๊ฒŒ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.
  • ๊ทธ๋Ÿฐ ๋‹ค์Œ, 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

์šฐ๋ฆฌ๋Š” ๋˜ํ•œ ์ด ๊ธฐ๋Šฅ์ด ์‹ค์ œ๋กœ ์–ด๋–ป๊ฒŒ ๋ณด์ด๋Š”์ง€ ํ…Œ์ŠคํŠธํ–ˆ์œผ๋ฉฐ ์•„๋ฆ„๋‹ต์ง€ ์•Š๋‹ค๊ณ  ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ƒฅ ๊ถ๊ธˆํ•ด์„œ์š”. ์˜ˆ์˜์ง€ ์•Š์€ ๋ถ€๋ถ„์ด ๋ฌด์—‡์ธ์ง€ ์•Œ๋ ค์ฃผ์‹ค ์ˆ˜ ์žˆ๋‚˜์š”? ์ด์— ๋Œ€ํ•ด ๋” ๋งŽ์€ ์ •๋ณด๋ฅผ ๊ณต์œ ํ•ด ์ฃผ์‹œ๋ฉด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์˜ต์…˜์ด ์•„๋‹ˆ๋ผ ๊ธฐ๋ณธ๊ฐ’ ์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ฆ‰, TypeScript์˜ ์œ ํ˜• ์‹œ์Šคํ…œ์ด ์ปดํŒŒ์ผ ์‹œ๊ฐ„์— JavaScript ๊ฐ’์ด ๋Ÿฐํƒ€์ž„์— ์ทจํ•  ์ˆ˜ ์žˆ๋Š” ์œ ํ˜•์„ ์„ค๋ช…ํ•˜๋Š” ๊ฒฝ์šฐ:

  • Array ์ธ๋ฑ์‹ฑ์€ ๋ฌผ๋ก  JavaScript์—์„œ undefined ๋ฅผ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ(๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚œ ์ธ๋ฑ์Šค ๋˜๋Š” ํฌ์†Œ ๋ฐฐ์—ด) ์˜ฌ๋ฐ”๋ฅธ ์ฝ๊ธฐ ์„œ๋ช…์€ T | undefined ์ž…๋‹ˆ๋‹ค.
  • ์˜ "์›์ธ"์ธ๋ฑ์Šค Array ๋  undefined ๋น„์•„๋„ ๊ฐ€๋Šฅํ•˜๋‹ค delete ํ‚ค์›Œ๋“œ.

TypeScript 4๊ฐ€ ๋ฐฉ์ง€ํ•˜๋ฏ€๋กœ

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

a[1] = undefined ๋„ ๋ฐฉ์ง€ํ•˜๋Š” ์ข‹์€ ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
์ด๊ฒƒ์€ Array<T>[number] ๊ฐ€ ์ฝ๊ธฐ์™€ ์“ฐ๊ธฐ์— ๋Œ€ํ•ด ์‹ค์ œ๋กœ ๋‹ฌ๋ผ์•ผ ํ•จ์„ ์‹œ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

"๋ณต์žก"ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ JavaScript์—์„œ ๋Ÿฐํƒ€์ž„ ๊ฐ€๋Šฅ์„ฑ์„ ๋ณด๋‹ค ์ •ํ™•ํ•˜๊ฒŒ ๋ชจ๋ธ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
TypeScript๋Š” ๋ฌด์—‡์„ ์œ„ํ•ด ๋งŒ๋“ค์–ด์กŒ์Šต๋‹ˆ๊นŒ?

| undefined ๊ฐ€ ๊ธฐ๋ณธ ๋™์ž‘์„ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ํ•˜๋Š” ์•„์ด๋””์–ด๋ฅผ ๋…ผ์˜ํ•˜๋Š” ๊ฒƒ์€ ์˜๋ฏธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ ์—…๋ฐ์ดํŠธ๋กœ ์ธํ•ด ์ˆ˜๋ฐฑ๋งŒ ์ค„์˜ ๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ๋ฅผ ํญ๋ฐœ์‹œํ‚ค๋Š” Typescript ๋ฒ„์ „์„ ์ถœ์‹œ ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋ณ€ํ™”๋Š” ๋‚ด๊ฐ€ ๋”ฐ๋ž๋˜ ์–ด๋–ค ํ”„๋กœ์ ํŠธ์—์„œ๋„ ๊ฐ€์žฅ ํš๊ธฐ์ ์ธ ๋ณ€ํ™”๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๋ž˜๋„ ๋‚˜๋จธ์ง€ ๊ธ€์—๋Š” ๋™์˜ํ•ฉ๋‹ˆ๋‹ค.

| undefined ๊ฐ€ ๊ธฐ๋ณธ ๋™์ž‘์„ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ํ•˜๋Š” ์•„์ด๋””์–ด์— ๋Œ€ํ•ด ๋…ผ์˜ํ•˜๋Š” ๊ฒƒ์€ ์˜๋ฏธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ ์—…๋ฐ์ดํŠธ๋กœ ์ธํ•ด ์ˆ˜๋ฐฑ๋งŒ ์ค„์˜ ๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ๋ฅผ ํญ๋ฐœ์‹œํ‚ค๋Š” Typescript ๋ฒ„์ „์„ _์ ˆ๋Œ€_ ์ถœ์‹œํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋ณ€ํ™”๋Š” ๋‚ด๊ฐ€ ๋”ฐ๋ž๋˜ ์–ด๋–ค ํ”„๋กœ์ ํŠธ์—์„œ๋„ ๊ฐ€์žฅ ํš๊ธฐ์ ์ธ ๋ณ€ํ™”๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๋ž˜๋„ ๋‚˜๋จธ์ง€ ๊ธ€์—๋Š” ๋™์˜ํ•ฉ๋‹ˆ๋‹ค.

๊ตฌ์„ฑ ์˜ต์…˜์ธ ๊ฒฝ์šฐ์—๋Š” ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ตฌ์„ฑ ์˜ต์…˜์ธ ๊ฒฝ์šฐ์—๋Š” ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์€ ๊ณตํ‰ํ•˜์ง€๋งŒ ์ตœ์†Œํ•œ ๊ธฐ๋ณธ์ ์œผ๋กœ ๊บผ์ ธ ์žˆ๋Š” ๊ธด "๋ฆฌ๋“œ ์ธ" ๊ธฐ๊ฐ„์„ ์˜ˆ์ƒํ•˜์—ฌ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ๊ฐ€ ํ™œ์„ฑํ™”๋˜๊ธฐ ์ „์— ๋ณ€ํ™˜ํ•˜๋Š” ๋ฐ ๋งŽ์€ ์‹œ๊ฐ„(6๊ฐœ์›”? 1๋…„? ๊ทธ ์ด์ƒ?)์„ ์ค„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. -๊ธฐ๋ณธ. ์˜ˆ๋ฅผ ๋“ค์–ด v4.0์— ํ”Œ๋ž˜๊ทธ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  v5.0์—์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ on์œผ๋กœ ์„ค์ •ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์€ ๋จผ ๋ฏธ๋ž˜์ž…๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์šฐ๋ฆฌ๋Š” ์ „์ œ ์กฐ๊ฑด ๊ธฐ๋Šฅ(setter/getter์— ๋Œ€ํ•ด ๋‹ค๋ฅธ ์œ ํ˜•)์ด ํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ๋‹ค๋Š” ๋™์˜์กฐ์ฐจ ํ•˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ €๋Š” ๊ธฐ๋ณธ ๋™์ž‘์— ๋Œ€ํ•ด ์˜ค๋žซ๋™์•ˆ ๋…ผ์˜ํ•˜๋Š” ๊ฒƒ์€ ์˜๋ฏธ๊ฐ€ ์—†๋‹ค๋Š” ์ง„์ˆ ์„ ์ง€์ง€ํ•ฉ๋‹ˆ๋‹ค.

| undefined ๊ฐ€ ๊ธฐ๋ณธ ๋™์ž‘์„ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ํ•˜๋Š” ์•„์ด๋””์–ด์— ๋Œ€ํ•ด ๋…ผ์˜ํ•˜๋Š” ๊ฒƒ์€ ์˜๋ฏธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ ์—…๋ฐ์ดํŠธ๋กœ ์ธํ•ด ์ˆ˜๋ฐฑ๋งŒ ์ค„์˜ ๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ๋ฅผ ํญ๋ฐœ์‹œํ‚ค๋Š” Typescript ๋ฒ„์ „์„ _์ ˆ๋Œ€_ ์ถœ์‹œํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋ณ€ํ™”๋Š” ๋‚ด๊ฐ€ ๋”ฐ๋ž๋˜ ์–ด๋–ค ํ”„๋กœ์ ํŠธ์—์„œ๋„ ๊ฐ€์žฅ ํš๊ธฐ์ ์ธ ๋ณ€ํ™”๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๋ž˜๋„ ๋‚˜๋จธ์ง€ ๊ธ€์—๋Š” ๋™์˜ํ•ฉ๋‹ˆ๋‹ค.

@thw0rted ์š”์ ๊นŒ์ง€ ์—ฌ๊ธฐ์—์„œ ํƒ€ํ˜‘์„ ์ œ์•ˆํ–ˆ์Šต๋‹ˆ๋‹ค. https://github.com/microsoft/TypeScript/issues/38779

ํ›จ์”ฌ ๋‚˜์ค‘์— ๋„์ž…๋œ ๊ธฐ๋Šฅ์—์„œ ์—ฌ์ „ํžˆ ๋„๋ฆฌ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ์ด ๊ธฐ๋Šฅ์„ ํ—ˆ์šฉํ•˜๊ณ  ์ด๋ฏธ "๊ฑฐ์˜" ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๋ฉฐ ์•ฝ๊ฐ„์˜ ๋ณ€๊ฒฝ๋งŒ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

"strict" ์ผ๊ด€์„ฑ์„ ์œ„ํ•ด Array<T> ๋Š” "a list of type T that is infinitly long with no gaps" ๋กœ ๊ฐ„์ฃผ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์›ํ•˜์ง€ ์•Š์„ ๋•Œ๋งˆ๋‹ค ํŠœํ”Œ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋„ค, ์—ฌ๊ธฐ์—๋Š” ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋‹ค์‹œ ํ•œ ๋ฒˆ ์ €๋Š” ์ด ๊ธฐ๋Šฅ์ด ์—ฌ๊ธฐ์—์„œ ์š”์ฒญํ•œ ๋Œ€๋กœ ์ •ํ™•ํžˆ ๊ตฌํ˜„ ๋ฐ ๊ตฌํ˜„๋˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ๊ณต์ •ํ•œ "ํƒ€ํ˜‘"์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋™์˜ํ•˜์‹œ๋ฉด ํˆฌํ‘œํ•ด์ฃผ์„ธ์š”

๋‚˜๋Š” ์ด๊ฒƒ์ด ์™„์ „ํžˆ ์ƒˆ๋กœ์šด ์˜ต์…˜/๊ตฌ์„ฑ์ด ํ•„์š”ํ•˜๋‹ค๋Š” ๋ฐ ๋™์˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์—„๊ฒฉํ•œ ์˜ต์…˜์ด ๋น„ํ™œ์„ฑํ™”๋˜์–ด ์žˆ์„ ๋•Œ ๊ธฐ๋ณธ ๋™์ž‘์ด ๋˜์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์ง€๋งŒ ์—„๊ฒฉํ•œ ์˜ต์…˜์ธ BE STRICT๋ฅผ ํ™œ์„ฑํ™”ํ•˜๊ณ  ์ด์ „ ํ”„๋กœ์ ํŠธ์—์„œ๋„ ์ด๋ฅผ ์ ์šฉํ•˜๋ฉด ๊ธฐ๋ณธ ๋™์ž‘์ด ๋˜์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์—„๊ฒฉํ•จ์„ ํ™œ์„ฑํ™”ํ•˜๋Š” ๊ฒƒ์€ ์‚ฌ๋žŒ๋“ค์ด ๊ฐ€๋Šฅํ•œ ๊ฐ€์žฅ ์—„๊ฒฉํ•˜๊ณ  ์ •ํ™•ํ•œ ํƒ€์ดํ•‘์„ ์„ ํƒํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์—„๊ฒฉํ•œ ์˜ต์…˜์„ ํ™œ์„ฑํ™”ํ•˜๋ฉด ๋‚ด ์ฝ”๋“œ์— ํ™•์‹ ์„ ๊ฐ–๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด TS์˜ ๊ฐ€์žฅ ์ข‹์€ ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์—„๊ฒฉํ•˜๊ฒŒ ํ™œ์„ฑํ™”๋œ ๊ฒฝ์šฐ์—๋„ ์ด๋Ÿฌํ•œ ๋ถ€์ •ํ™•ํ•œ ์ž…๋ ฅ์€ ๊ณจ์น˜ ์•„ํ”ˆ ์ผ์ž…๋‹ˆ๋‹ค.

์ด ์Šค๋ ˆ๋“œ๋ฅผ ์ฝ์„ ์ˆ˜ ์žˆ๋„๋ก ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๋Œ€ํ™”์— ์˜๋ฏธ ์žˆ๊ฒŒ ์ถ”๊ฐ€๋˜์ง€ ์•Š์€ ์—ฌ๋Ÿฌ ์ ‘์„  ๋Œ“๊ธ€์„ ์ˆจ๊ฒผ์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ๋‹ค์Œ ๋งฅ๋ฝ์˜ ์ฃผ์„์€ ์ด์ „ 212๊ฐœ์˜ ์ฃผ์„์—์„œ ์ด์ „์— ์ž‘์„ฑ๋˜์—ˆ์œผ๋ฉฐ ๋ฐ˜๋ณตํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค๊ณ  ๊ฐ€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • TypeScript๋Š” ์ฒ˜์Œ์œผ๋กœ ๋™์ž‘ ํ™•์ธ์— ๋น„ํ˜„์‹ค์ ์œผ๋กœ ํฐ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋„์ž…ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์•„๋‹ˆ์š”, ์šฐ๋ฆฌ๋Š” ์ „์—๋„ ๊ทธ๋ ‡๊ฒŒ ํ•˜์ง€ ์•Š์•˜์œผ๋ฉฐ ์•ž์œผ๋กœ๋„ ๊ทธ๋ ‡๊ฒŒ ํ•  ์ƒ๊ฐ์ด ์—†์Šต๋‹ˆ๋‹ค. ์žฅ๊ธฐ์ ์ธ ๋””์ž์ธ ๋ชฉํ‘œ์— ๋” ๋งŽ์ด ์ฐธ์—ฌํ•˜์‹ญ์‹œ์˜ค. ์ „๋ก€ ์—†๋Š” ๋ณ€ํ™”๋ฅผ ์˜นํ˜ธํ•˜๊ธฐ ์œ„ํ•ด ์—ฌ๊ธฐ์— ์˜ค๊ธฐ ์ „์— ํ”„๋กœ์ ํŠธ์˜
  • ์•„๋ฌด๋„ ๊ตฌ์„ฑ ํ”Œ๋ž˜๊ทธ๊ฐ€ ์กด์žฌํ•œ๋‹ค๋Š” ์‚ฌ์‹ค์„ ๊ณ ๋ คํ•˜์ง€ ์•Š์•˜๋‹ค๋Š” ์•„์ด๋””์–ด์— ์ž…๊ฐํ•œ ์ฃผ์žฅ - ํ”Œ๋ž˜๊ทธ ๋’ค์— ๋ฌผ๊ฑด์„ ๋‘๋Š” ๊ฒƒ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ผœ์ ธ ์žˆ์„ ํ•„์š”๊ฐ€ ์—†๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋ˆ„๊ตฌ์˜ ์ฒซ ๋ฒˆ์งธ ๋กœ๋ฐ์˜ค๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.
  • ๋ฌด์Šจ ์ผ์ด์•ผ, ๊ทธ๋ƒฅ ํ•ด! - ๊ธ€์Ž„, ๋‹น์‹ ์ด ๊ทธ๊ฒƒ์„ ๊ทธ๋ ‡๊ฒŒ ํ‘œํ˜„ํ•œ ์ง€๊ธˆ ๋‚˜๋Š” ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค ๐Ÿ˜•

์—ฌ๊ธฐ์—์„œ ํ•ด๊ฒฐํ•ด์•ผ ํ•  ๋งค์šฐ ์‹ค์ œ์ ์ด๊ณ  ๊ธฐ์ˆ ์ ์ธ ๋ฌธ์ œ๊ฐ€ ์žˆ์œผ๋ฉฐ ์ด ์Šค๋ ˆ๋“œ์—์„œ ์˜๋ฏธ ์žˆ๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์€ ์‹ค๋ง์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค. ํ”Œ๋ž˜๊ทธ ๋’ค์— ์žˆ๋Š” ๋ชจ๋“  ๊ฒƒ์ด ์‹ค์ œ ๊ฒฐ๊ณผ๊ฐ€ ์—†๊ฑฐ๋‚˜ be ts-ignore 'd๋Š” ์—…๊ทธ๋ ˆ์ด๋“œ ๋ถ€๋‹ด์ด ์•„๋‹™๋‹ˆ๋‹ค.

@RyanCavanaugh

์š”์•ฝํ•ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

์ „๋ก€ ์—†๋Š” ๋ณ€ํ™”๋ฅผ ์˜นํ˜ธํ•˜๊ธฐ ์œ„ํ•ด ์—ฌ๊ธฐ์— ์˜ค๊ธฐ ์ „์— ํ”„๋กœ์ ํŠธ์˜ ์žฅ๊ธฐ ์„ค๊ณ„ ๋ชฉํ‘œ์— ๋” ๋งŽ์ด ์ฐธ์—ฌํ•˜์‹ญ์‹œ์˜ค.

๋‚˜๋Š” ๋‚ด ๋Œ“๊ธ€์„ ์ง€์› ๊ณ  ์›ํ•˜์‹œ๋ฉด ์ด ๋Œ“๊ธ€๋„ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํ”„๋กœ์ ํŠธ์˜ ์ฒซ ๋ฒˆ์งธ ๋ชฉํ‘œ๋ฅผ ์ดํ•ดํ•˜๋Š” ๋ฐฉ๋ฒ•:

1. ์˜ค๋ฅ˜ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋Š” ๊ตฌ์„ฑ์„ ์ •์ ์œผ๋กœ ์‹๋ณ„ํ•ฉ๋‹ˆ๋‹ค.

(์ถœ์ฒ˜: https://github.com/Microsoft/TypeScript/wiki/TypeScript-Design-Goals )

ํ™•์ธ๋˜์ง€ ์•Š์€ ์ธ๋ฑ์Šค ์•ก์„ธ์Šค๋กœ ์ธํ•ด ๋Ÿฐํƒ€์ž„ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ธ์šฉ๋œ ์˜๊ฒฌ์„ ์ดํ•ดํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. JavaScript์—์„œ ๊ทธ๋Ÿฐ ๊ฒƒ์„ ๊ธฐ๋Œ€ํ•œ๋‹ค๋ฉด TypeScript์—์„œ๋Š” ์œ„ํ—˜ํ•˜๊ณ  ์ž˜๋ชป๋œ ํ™•์‹ ์„ ๊ฐ–๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ž˜๋ชป๋œ ์œ ํ˜•์€ any ๋ณด๋‹ค ๋‚˜์ฉ๋‹ˆ๋‹ค.

๊ธ€์Ž„, ์ด์ œ ๋‹น์‹ ์ด ๊ทธ๋ ‡๊ฒŒ ๋งํ–ˆ์œผ๋ฏ€๋กœ ๋‚˜๋Š” ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค.

๋ฌผ๋ก  ๋‹น์‹ ์€ ํ•ต์‹ฌ ๋ฉ”์ธํ…Œ์ด๋„ˆ ์ค‘ ํ•˜๋‚˜์ด๋ฉฐ ts์— ๋Œ€ํ•œ ํŒ€๊ณผ ๊ธฐ์—ฌ์ž์—๊ฒŒ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋” ์ด์ƒ ๋‹น์‹ ๋งŒ์˜ ๋ฌธ์ œ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์ฐฌ์„ฑ: 365์™€ ๋ฐ˜๋Œ€: 6์„ ๋น„๊ตํ•˜์„ธ์š”! ๋‹จ 6! ์œ ํ˜• ์•ˆ์ „์„ฑ์— ๋Œ€ํ•œ ์—„์ฒญ๋‚œ ์š”๊ตฌ๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ํ•ด๊ฒฐ์ฑ…์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•ฉ์‹œ๋‹ค. ํŒ€์ด ๋งŒ๋“ค๊ฑฐ๋‚˜ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋Š” ์†”๋ฃจ์…˜์ด ์žˆ์Šต๋‹ˆ๊นŒ?

์ด ๊ฒฝ์šฐ ts-ignore ๋ฌธ์ œ์ ์— ๋Œ€ํ•ด ์ข€ ๋” ์ž์„ธํžˆ ์„ค๋ช…ํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? codemod ์™€ ๊ฐ™์€ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž๋™ํ™”ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ํ˜„์žฌ ์ฝ”๋“œ์˜ ๋™์ž‘์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฌผ๋ก  ์•„๋ฆ„๋‹ค์šด ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ ์•„๋‹ˆ์ง€๋งŒ ํ”Œ๋ž˜๊ทธ ์—†์ด ์ด ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋„์ž…ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด 4.0.0-breaking ์™€ ๊ฐ™์ด ํŒจ์น˜๋œ ts ๋ฒ„์ „์˜ ์ž๋™ ๊ฒŒ์‹œ์— ๋Œ€ํ•ด ์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•˜์‹ญ๋‹ˆ๊นŒ? ์ถฉ๋Œ์— ๋Œ€ํ•œ ๋ช‡ ๊ฐ€์ง€(๋งŽ์€?) ์ž‘์—…์„ ์†Œ๊ฐœํ•˜์ง€๋งŒ ๋ชจ๋“  ์‚ฌ๋žŒ์ด ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ํ…Œ์ŠคํŠธํ•˜๊ณ  ์ฝ”๋“œ ๊ธฐ๋ฐ˜์„ ์ค€๋น„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์ด ๊ธฐ๋Šฅ ์š”์ฒญ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ). ์ด๊ฒƒ์€ 3-6๊ฐœ์›”๊ณผ ๊ฐ™์€ ์ œํ•œ๋œ ๊ธฐ๊ฐ„ ๋™์•ˆ ์ˆ˜ํ–‰๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ด ๋ฒ„์ „์„ ์‚ฌ์šฉํ•  ์ฒซ ๋ฒˆ์งธ ์‚ฌ๋žŒ์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋” ์ด์ƒ. ์ฐฌ์„ฑ: 365์™€ ๋ฐ˜๋Œ€: 6์„ ๋น„๊ตํ•˜์„ธ์š”! ๋‹จ 6! ์œ ํ˜• ์•ˆ์ „์„ฑ์— ๋Œ€ํ•œ ์—„์ฒญ๋‚œ ์š”๊ตฌ๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.
- @๋ฒ ์†Œ๋…ธํ”„

ใ…‹.
@RyanCavanaugh ์˜ ์ „์ฒด ๊ฒŒ์‹œ๋ฌผ์— ๋™์˜ํ•˜๋Š”
์ˆ˜๋ฐฑ๋งŒ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ๊ฑฐ๊ธฐ์— TS์œ ์ €๋“ค?!? 365๋Š” ์ด ์Šค๋ ˆ๋“œ์— ๋Œ“๊ธ€์„ ๋‹ฌ๊ณ  ์ฐฌ์„ฑํ•  ์ˆ˜ ์žˆ์„ ๋งŒํผ ์ด ๊ธฐ๋Šฅ์„ ์›ํ•ฉ๋‹ˆ๋‹ค...

github์˜ ์•Œ๋ฆผ์€ ์—†์ง€๋งŒ ์ด ๋ฌธ์ œ์˜ ์ •์˜๋˜์ง€ ์•Š์€ ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•˜๋Š” ๋ชจ๋“  ์‚ฌ๋žŒ์€ ๋‚ด ์˜๊ฒฌ ์œ„์— ์žˆ๋Š” PR ์ดˆ์•ˆ์„ ์‚ดํŽด๋ณด์„ธ์š”.

@RyanCavanaugh ์šฐ๋ฆฌ์—๊ฒŒ ๊ฒŒ์ž„์„ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐํšŒ๋ฅผ ์ฃผ์…”์„œ ๋Œ€๋‹จํžˆ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ฝค ์ž‘์€(~105 ts(x) ํŒŒ์ผ) ์ฝ”๋“œ ๋ฒ ์ด์Šค์— ๋Œ€ํ•ด ๊ทธ๊ฒƒ์„ ์‹คํ–‰ํ•˜๊ณ  ์กฐ๊ธˆ ๊ฐ€์ง€๊ณ  ๋†€์•˜์Šต๋‹ˆ๋‹ค. ์ค‘์š”ํ•œ ๋ฌธ์ œ๋ฅผ ์ฐพ์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์—์„œ ๋ณ€๊ฒฝ๋œ ํ•œ ์ค„:

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

์—๊ฒŒ:

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

๋‚˜๋Š” ๋‹ค์Œ ์ฃผ์— ์ค‘๊ฐ„ ํ”„๋กœ์ ํŠธ์—์„œ ๊ทธ๊ฒƒ์„ ์‹œ๋„ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@lonewarrior556 60๋ฐฐ ๋” ๋งŽ๊ณ  upvotes๋กœ ์ •๋ ฌํ•˜๋ฉด ์ฒซ ํŽ˜์ด์ง€์— ์žˆ์Šต๋‹ˆ๋‹ค :)

@Bessonov Typescript ์ปดํŒŒ์ผ๋Ÿฌ ์ฝ”๋“œ๋ฒ ์ด์Šค์—์„œ ์‹œ๋„ํ•ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. for-loop์˜ ์‚ฌ์†Œํ•œ ์‚ฌ์šฉ์œผ๋กœ ์ธํ•ด ๋Œ€๊ทœ๋ชจ ์†์ƒ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด์ „ ๋ฒ„์ „๊ณผ์˜ ํ˜ธํ™˜์„ฑ์„ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด ์˜ตํŠธ์ธ/์•„์›ƒํ•˜๋Š” ํ”Œ๋ž˜๊ทธ๋ฅผ ๊ฐ€์งˆ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์ถ”๊ฐ€ํ•˜๋Š” ๋ชจ๋“  ํ”Œ๋ž˜๊ทธ๋Š” ํ…Œ์ŠคํŠธ ๋ฐ ์ง€์›์ด ํ•„์š”ํ•œ ๋˜ ๋‹ค๋ฅธ ๊ตฌ์„ฑ ๋งคํŠธ๋ฆญ์Šค์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ด์œ ๋กœ TypeScript๋Š” ํ”Œ๋ž˜๊ทธ๋ฅผ ์ตœ์†Œ๋กœ ์œ ์ง€ํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

@MatthiasKunnen ์ด๊ฒƒ์ด ์ž‘์€ ๊ฒฝ์šฐ์˜ ๊ธฐ๋Šฅ์ด๋ผ๋ฉด ํ”Œ๋ž˜๊ทธ๋ฅผ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š๋Š” ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ์ด์œ ๋ผ๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ง์ ‘ ๋ฐฐ์—ด ์•ก์„ธ์Šค๋Š” ์ฝ”๋“œ์— ๋งค์šฐ ์ž์ฃผ ๋‚˜ํƒ€๋‚˜๋ฉฐ ์œ ํ˜• ์‹œ์Šคํ…œ์˜ ๋ˆˆ์— ๋„๋Š” ๊ตฌ๋ฉ์ด์ž ์ˆ˜์ •ํ•ด์•ผ ํ•  ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด๋ฏ€๋กœ ํ”Œ๋ž˜๊ทธ๊ฐ€ ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

ํ”Œ๋ž˜๊ทธ๋Š” ์ด๊ฒƒ์— ๋Œ€ํ•œ ์ž˜๋ชป๋œ ์ ‘๊ทผ์ž…๋‹ˆ๋‹ค. ๋ถ€๋ถ„์ ์œผ๋กœ๋Š” ์กฐํ•ฉ
๋ฌธ์ œ. ์šฐ๋ฆฌ๋Š” ์ด๊ฒƒ์„ TypeScript v5... ๊ทธ๋Ÿฐ ์ข…๋ฅ˜์˜ ์ ‘๊ทผ ๋ฐฉ์‹์ด๋ผ๊ณ  ๋ถˆ๋Ÿฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.
ํ…Œ์ŠคํŠธ ๊ฐ€๋Šฅํ•œ ์กฐํ•ฉ์˜ ์ˆ˜๋ฅผ 2^N์—์„œ N์œผ๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค...

2020๋…„ 8์›” 15์ผ ํ† ์š”์ผ 15:56, Michael Burkman [email protected]
์ผ๋‹ค:

@MatthiasKunnen https://github.com/MatthiasKunnen ์ด๊ฒƒ์ด ์ผ๋ถ€๋ผ๋ฉด
์ž‘์€ ์—ฃ์ง€ ์ผ€์ด์Šค ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋ฉด
์ด๋ฅผ ์œ„ํ•ด ํ”Œ๋ž˜๊ทธ๋ฅผ ์ถ”๊ฐ€ํ•˜์‹ญ์‹œ์˜ค. ๊ทธ๋Ÿฌ๋‚˜ ์ง์ ‘ ๋ฐฐ์—ด ์•ก์„ธ์Šค๋Š” ์ฝ”๋“œ์— ๊ฝค ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.
์ž์ฃผ ๋ฐœ์ƒํ•˜๋ฉฐ ์œ ํ˜• ์‹œ์Šคํ…œ์˜ ๋ˆˆ๋ถ€์‹  ๊ตฌ๋ฉ์ด์ž ๋™์‹œ์—
์ˆ˜์ •์„ ์œ„ํ•œ ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด๋ฏ€๋กœ ํ”Œ๋ž˜๊ทธ๊ฐ€ ์ •๋‹นํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

โ€”
์ด ์Šค๋ ˆ๋“œ์— ๊ฐ€์ž…ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ณ  GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/microsoft/TypeScript/issues/13778#issuecomment-674408067 ,
๋˜๋Š” ๊ตฌ๋… ์ทจ์†Œ
https://github.com/notifications/unsubscribe-auth/AAADY5AXEY65S5HDGNGIPZDSA2O3FANCNFSM4C6KEKAA
.

๋ฐฉ๊ธˆ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ์ •์˜๋˜์ง€ ์•Š์€ ์˜ค๋ฅ˜๊ฐ€ ์ˆ˜๋ฐฑ ๋ช…์˜ ์‚ฌ์šฉ์ž์— ๋Œ€ํ•œ ๋‚ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ค‘๋‹จ์‹œ์ผฐ์Šต๋‹ˆ๋‹ค. ์ด ์œ ํ˜• ๊ฒ€์‚ฌ๊ฐ€ ์žˆ์—ˆ๋‹ค๋ฉด ๋นŒ๋“œ ์‹œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. TypeScript๋Š” ์šฐ๋ฆฌ์—๊ฒŒ ๋” ์•ˆ์ •์ ์ธ ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ์ œ๊ณตํ•˜๋Š” ๋†€๋ผ์šด ๋ฐฉ๋ฒ•์ด์—ˆ์ง€๋งŒ ์ด ํ•œ ๋ฒˆ์˜ ๋ˆ„๋ฝ์œผ๋กœ ์ธํ•ด ๊ทธ ๋›ฐ์–ด๋‚œ ์œ ํ‹ธ๋ฆฌํ‹ฐ๊ฐ€ ํ›ผ์†๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์— ๋Œ“๊ธ€์„ ๋‹ฌ๊ณ ์ž ํ•˜๋Š” ๋‹ค์Œ 10๋ช…์€ PR #39560 ์ดˆ์•ˆ์„ ๋Œ€์‹  ํ…Œ์ŠคํŠธํ•ด ๋ณด๋Š” ๊ฒƒ์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ?

ESLint์˜ @typescript-eslint/no-unnecessary-condition ๊ทœ์น™์„ ํ™œ์„ฑํ™”ํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ๋ชจ๋“  ์ธ์Šคํ„ด์Šค์— ๋Œ€ํ•ด ๋ถˆํ‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Š” ๋งค์šฐ ์„ฑ๊ฐ€์‹  ์ผ์ž…๋‹ˆ๋‹ค.

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

๊ทธ๊ฒƒ์€ ๊ทธ๊ฒƒ์ด ๋ถˆํ•„์š”ํ•œ ์กฐ๊ฑด์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ(Typescript๊ฐ€ ๊ทธ๋ ‡๊ฒŒ ๋งํ•˜๊ธฐ ๋•Œ๋ฌธ์—!) ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚ด ์ฝ”๋“œ๋ฒ ์ด์Šค ์ „์ฒด์— // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์„ ์ ์ ˆํ•˜๊ฒŒ ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ์ด ๊ฒŒ์œผ๋ฅธ Javascript ํ”„๋กœ๊ทธ๋ž˜๋จธ ์—๊ฒŒ ๋„ˆ๋ฌด ๋งŽ์€ ์ž‘์—…์ด๋ผ๋ฉด undefined ์ถ”๊ฐ€ํ•˜๋Š” ๋Œ€์ฒด ๋ฐฐ์—ด ์•ก์„ธ์Šค ๊ตฌ๋ฌธ์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

(์ž„์˜์˜ ๊ตฌ๋ฌธ ์ œ์•ˆ, ๋Œ€์•ˆ ํ™˜์˜)

@Timmmm ๋‹˜์ด ์ž‘์„ฑํ•œ ๋Œ“๊ธ€ ๋ฐ”๋กœ ์œ„์— ์žˆ๋Š” ๋Œ“๊ธ€์„ ์ฝ์–ด์ฃผ์„ธ์š”. ์ด ์ œ์•ˆ์˜ ๋ฒ„์ „์„ ๊ตฌํ˜„ํ•˜๋Š” ๋นŒ๋“œ๋ฅผ ์‹œ๋„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. eslint ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜๋ฉด ๊ฑฐ๊ธฐ์—์„œ ์•Œ๋ ค์ฃผ์‹ญ์‹œ์˜ค.

@0rted ๊ทธ ๋Œ“๊ธ€์„ ์ฝ์—ˆ์Šต๋‹ˆ๋‹ค. ๋‚ด ์ œ์•ˆ์˜ ๋ฒ„์ „์„ ๊ตฌํ˜„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์–ด์ฉŒ๋ฉด ๋‹น์‹ ์€ ๋‹ค์‹œ ์ฝ์–ด์•ผํ•œ๋‹ค.

์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. "์ด" ์ œ์•ˆ์ด๋ผ๊ณ  ํ–ˆ์„ ๋•Œ OP์˜ ๊ธฐ๋Šฅ, ์ฆ‰ array_of_T[i] ์„ T | undefined ๋กœ ์ทจ๊ธ‰ํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ–ˆ์Šต๋‹ˆ๋‹ค. ํŠน์ • ์ธ๋ฑ์Šค ์—ฐ์‚ฐ์ž๋ฅผ "์ •์˜๋˜์ง€ ์•Š์•˜์„ ์ˆ˜ ์žˆ์Œ"์œผ๋กœ ํ‘œ์‹œํ•˜๋Š” ๊ตฌ๋ฌธ์— ๋Œ€ํ•ด ๋ฌป๋Š” ๊ฒƒ์„ ์•Œ์ง€๋งŒ Ryan์˜ PR์—์„œ ๊ตฌํ˜„์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๋ชจ๋“  ์ธ๋ฑ์Šค ์—ฐ์‚ฐ์ž๊ฐ€ "์ •์˜๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Œ"์ด๋ฏ€๋กœ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. . ๊ทธ๊ฒƒ์ด ๋‹น์‹ ์˜ ํ•„์š”๋ฅผ ์ถฉ์กฑ์‹œํ‚ค์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

์˜ˆ, - ๋งŒ์•ฝ/์–ธ์ œ ๊ทธ๊ฒƒ์ด ์ฐฉ๋ฅ™ํ•œ๋‹ค๋ฉด ๋‚˜๋Š” ํ™•์‹คํžˆ ๊ทธ๊ฒƒ์„ ์‚ฌ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด ํ† ๋ก ์—์„œ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ์ถ”๊ฐ€ ํ”Œ๋ž˜๊ทธ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ๋” ๋ณต์žกํ•˜๊ฒŒ ์ž‘๋™ํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๋Š” ์ฝ”๋“œ๋ฅผ ๋งŒ๋“ค๊ธฐ ๋•Œ๋ฌธ์—(๋‹จ์ˆœํ•œ for ๋ฃจํ”„ ์˜ˆ์ œ) ๊ทธ๊ฒƒ์— ์ €ํ•ญํ–ˆ๋‹ค๋Š” ์ธ์ƒ์„ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ๋Œ€์•ˆ์„ ์ œ์‹œํ•˜๊ณ  ์‹ถ์—ˆ์ง€๋งŒ ์‚ฌ๋žŒ๋“ค์ด ์‹ซ์–ดํ•˜๋Š” ๊ฒƒ ๊ฐ™๋‹ค. :-/

๋ชจ๋“  ์ข‹์€ ์˜๋„์˜ ์ž…๋ ฅ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. @Timmmm์„ ์ž˜๋ชป๋œ ๋ฐฉ์‹์œผ๋กœ ๋ฐ›์•„๋“ค์ด์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ๋‚˜๋Š” downvotes๊ฐ€ ์ด๊ฒƒ์ด์ด ์‹œ์ ์—์„œ์ด ์Šค๋ ˆ๋“œ์—์„œ ์ด๋ฏธ ์ž˜ ๋ฐŸํžŒ ๊ธฐ๋ฐ˜์ด๋ผ๋Š” ๊ฒƒ์„ ์ „๋‹ฌํ•  ๋ฟ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ €์—๊ฒŒ๋Š” ์ „๋ฐ˜์ ์œผ๋กœ ์œ ํ˜• ์•ˆ์ „์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚ค๋Š” ํ”Œ๋ž˜๊ทธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ์ƒˆ๋กœ์šด ์˜ตํŠธ์ธ ๊ตฌ๋ฌธ์„ ๋„์ž…ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋น„์šฉ์ด ํ›จ์”ฌ ์ €๋ ดํ•ฉ๋‹ˆ๋‹ค.

์œ„์—์„œ ์–ธ๊ธ‰ํ•˜์ง€ ์•Š์•˜์ง€๋งŒ ์ผํšŒ์„ฑ ์žฌ์ •์˜ ๊ตฌ๋ฌธ์ด ์ด๋ฏธ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค: if ((some_array[i] as MyType | undefined) === undefined) . ๊ทธ๊ฒƒ์€ ์ƒˆ๋กœ์šด ์†๊ธฐ๋กœ ๊ฐ„๊ฒฐ๋กœ ์•„๋‹ˆ์ง€๋งŒ ์ž˜ํ•˜๋ฉด ๋‹น์‹ ์ด ์ž์ฃผ ์‚ฌ์šฉํ•ด์•ผ ํ•  ๊ฑฐ๋ผ๊ณ  ๊ตฌ์กฐ ์•„๋‹ˆ์—์š”.

_Originally์— @osyrisrblx์— ์˜ํ•ด ๊ฒŒ์‹œ https://github.com/microsoft/TypeScript/issues/40435#issuecomment -690017567_

์ด๊ฒƒ์ด ํ›จ์”ฌ ์•ˆ์ „ํ•œ ์˜ต์…˜์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ ํ•ญ์ƒ ์ •์˜๋˜์–ด ์žˆ๋‹ค๊ณ  100% ํ™•์‹ ํ•˜๋Š” ๋“œ๋ฌธ ๊ฒฝ์šฐ๋ฅผ ์œ„ํ•ด ๋ณ„๋„์˜ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด ๋™์ž‘์„ ์˜ตํŠธ์•„์›ƒํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

!: ๊ฐ€ ํ•ญ์ƒ ์ •์˜๋œ ๊ฒƒ์„ ์ฃผ์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

interface X {
    [index: string]!: number; // -> number
}

interface Y {
    [index: string]: number; // -> number | undefined
}

๊ทธ ์ œ์•ˆ์€ ๋ฌธ์ œ๋ฅผ ์ž˜๋ชป ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ์ œ๋Š” ์œ ํ˜• ์ž์ฒด์— ๋Œ€ํ•œ TypeScript์˜ ์ดํ•ด์— ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ๋Š” ์ด ์Šค๋ ˆ๋“œ์˜ ์•ž๋ถ€๋ถ„์—์„œ ์ด๋ฏธ ์ƒˆ๋กœ์šด ๊ตฌ๋ฌธ์ด ์ œ์•ˆ๋œ ๋ฐ์ดํ„ฐ _์•ก์„ธ์Šค_์—์„œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

๊ณง ์ถœ์‹œ๋  TypeScript 4.1 ๋ฒ ํƒ€์—์„œ ์ด ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•ด ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด์ „์— ์ œ๊ณต๋˜์—ˆ๋‹ค๋ฉด ์ฃ„์†กํ•˜์ง€๋งŒ {[index: string]?: number} // -> number | undefined ๋ฅผ ์ง€์›ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์ธํ„ฐํŽ˜์ด์Šค ์„ ํƒ์  ์†์„ฑ ๊ตฌ๋ฌธ๊ณผ ์ผ์น˜ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ํ•„์š”ํ•˜๋ฉฐ "?"๋กœ ์ •์˜๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

4.1์˜ ์ปดํŒŒ์ผ๋Ÿฌ ์˜ต์…˜์€ ํ›Œ๋ฅญํ•˜์ง€๋งŒ ๋” ์„ธ๋ถ€์ ์œผ๋กœ ์ œ์–ดํ•˜๋Š” โ€‹โ€‹๊ฒƒ๋„ ์ข‹์Šต๋‹ˆ๋‹ค.

๋‹น์‹ ์˜ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์—์„œ ๊ทธ๊ฒƒ์„ ์‹œ๋„ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด (๋‚˜๋ฅผ ์•Œ์•„๋‚ด๋Š” ๋ฐ ์•ฝ๊ฐ„์˜ ์‹œ๊ฐ„์ด ๊ฑธ๋ ธ์Šต๋‹ˆ๋‹ค):

  1. typescript@next 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];

์ด ๊ฒฝ์šฐ key ๊ฐ€ keyof MyRecord ์ œํ•œ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— myRecord[key] ๊ฐ€ MyRecord[Key] | undefined ์œ ํ˜•์„ ๋ฐ˜ํ™˜ํ•  ๊ฒƒ์ด๋ผ๊ณ  ๊ธฐ๋Œ€ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

์—…๋ฐ์ดํŠธ : ์ œ์ถœ๋œ ๋ฌธ์ œ 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];

์ด ๊ฒฝ์šฐ key ๊ฐ€ keyof MyRecord ์ œํ•œ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— myRecord[key] ๊ฐ€ MyRecord[Key] | undefined ์œ ํ˜•์„ ๋ฐ˜ํ™˜ํ•  ๊ฒƒ์ด๋ผ๊ณ  ๊ธฐ๋Œ€ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ๋ฒ„๊ทธ๋ผ๊ณ  ๋งํ•˜๊ณ  ์‹ถ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ 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 ๋“ฑ๊ธ‰