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 ๊ฐ์ฒด๋ก ๋ณํ ๋๊ธฐ ๋๋ฌธ์ด๋ค.