TypeScript keyof typeof - boostcamp-2020/Project15-C-Client-Based-Formula-Editor GitHub Wiki

keyof typeof๊ฐ€ ์ดํ•ด๊ฐ€ ์ž˜ ์•ˆ ๋ผ์„œ ๊ณต๋ถ€ํ•ด๋ณด๊ณ  ์ ๋Š” ๊ธ€์ž…๋‹ˆ๋‹ค.

enum Brand {
    Nike = 'nike',
    Adidas = 'adidas',
    Puma = 'puma'
}

๊ฐ„๋‹จํ•˜๊ฒŒ ์ด๋Ÿฐ ์ฝ”๋“œ๊ฐ€ ์žˆ๋‹ค๊ณ  ํ•ด๋ณด์ž. ๊ทธ๋Ÿด ๋•Œ typeof ๋ฅผ ์‚ฌ์šฉํ•ด๋ณธ๋‹ค.

let type: typeof Brand = {Nike: Brand.Nike, Adidas: Brand.Adidas, puma: Brand.puma}; 

๊ทธ๋Ÿผ ์ด๋ ‡๊ฒŒ ๋ฐ–์— ์‚ฌ์šฉ์ด ์•ˆ๋˜๋Š” ๊ฑธ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. enum ์€ ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜๋œ๋‹ค. typeof๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด ๊ทธ๋ƒฅ ๊ทธ ๊ฐ์ฒด ์ž์ฒด๊ฐ€ type์ด ๋˜์–ด๋ฒ„๋ ค ๋˜‘๊ฐ™์ด ์‚ฌ์šฉํ•ด์•ผ๋งŒ ํ•œ๋‹ค. ๊ทธ๋Ÿผ ์ด typeof ๋ฅผ ํ–ˆ์„ ๋•Œ ๋งŒ๋“ค์–ด์ง„ type์ด interface์™€ ๋น„์Šทํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค.

let type: keyof Brand 

์ด๋Ÿฐ์‹์œผ๋กœ ํ•˜๊ณ  type์— ๋งˆ์šฐ์Šค๋ฅผ ์˜ฌ๋ ค๋ณด๋ฉด ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ๋“ค์ด ์ฐํžˆ๋Š”๊ฑธ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. Brand๊ฐ€ Object์ด๊ธฐ ๋•Œ๋ฌธ์— ๋‚˜์˜ค๋Š” ๊ฒƒ์ด๋‹ค.

let type: keyof typeof Brand 

์ด ์ฝ”๋“œ์˜ type์— ๋งˆ์šฐ์Šค๋ฅผ ์˜ฌ๋ ค๋ณด๋ฉด 'Nike' | 'Adidas' | 'Puma'๊ฐ€ ๋‚˜์˜ค๋Š”๊ฑธ ํ™•์ธํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค. typeof Brand๊ฐ€ enum ๊ฐ์ฒด ๊ทธ ์ž์ฒด์ด๊ณ  ๊ทธ๊ฒƒ์˜ key๋“ค์„ ๋ฝ‘์•„๋ƒˆ๊ธฐ ๋•Œ๋ฌธ์— ์ €๋ ‡๊ฒŒ ๋๋‹ค๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.

interface Brand {
    Nike: 'nike';
    Adidas: 'adidas';
    Puma: 'puma';
}

let type: keyof Brand

์ด๋Ÿฐ์‹์œผ๋กœ ์ž‘์„ฑํ•˜๊ณ  type์— ๋งˆ์šฐ์Šค๋ฅผ ์˜ฌ๋ ค๋ณด๋ฉด ์•„๊นŒ ์œ„์™€ ๋˜‘๊ฐ™์ด 'Nike' | 'Adidas' | 'Puma'๋กœ ๋‚˜์˜ค๋Š”๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

์ฆ‰, enum์˜ keyof typeof๋Š” instance์˜ keyof์™€ ๋˜‘๊ฐ™๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™๋‹ค. enum์€ ๊ฐ์ฒด์ด๊ธฐ ๋•Œ๋ฌธ์— keyof๋งŒ ํ–ˆ์„ ๋•Œ๋Š” ๊ฐ์ฒด์˜ key๋“ค์ด ๋‚˜์˜ค๊ณ  keyof typeof๋ฅผ ํ–ˆ์„ ๋•Œ ์›ํ•˜๋Š” ๊ฐ’์ด ๋‚˜์™”๋‹ค. interface๋Š” ๊ฐ์ฒด๊ฐ€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— keyof๋งŒ ํ–ˆ์„ ๋•Œ๋„ ๋ฐ”๋กœ ์›ํ•˜๋Š” ๊ฐ’์ด ๋‚˜์˜จ๋‹ค.

const object =  {
    Nike: 'nike',
    Adidas: 'adidas',
    Puma: 'puma'
}

let type: keyof typeof object

๊ฐ์ฒด์˜ ๊ฒฝ์šฐ์—๋„ enum๊ณผ ๋˜‘๊ฐ™์ด ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์—ˆ๋‹ค. ์ฆ‰ enum ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.