Frontend/TypeScript

TypeScript What does "keyof typeof" mean?

ej503 2023. 1. 18. 14:52

리터럴 타입과 유니온 타입을 아는가? 이 둘을 명확히 알아야 keyof typeof에 대해 설명할 수 있다.

 

1. Literal Types 

 

타입 스크립트에서 리터럴 타입은 string, number, boolean 등 타입의 더욱 구체적인 타입이다. 예를 들어, "Hello World!" 는 string 타입이지만 string 타입은 "Hello World!" 가 아니다. 즉, "Hello World!"는 더욱 구체적인 스트링 타입, 리터럴 타입이다.

 

type Greeting = "Hello"

 

Greeting은 String value로 "Hello"만을 가질 수 있는 객체이다.

 

let greeting: Greeting
greeting = "Hello" // OK
greeting = "Hi" // Error: Type '"Hi"' is not assignable to type '"Hello"'

 

리터럴 타입은 그 자체로는 유용하지 않지만 union types들과 함께 쓰일 때 굉장히 강해진다.

 

type Greeting = "Hello" | "Hi" | "Welcome"

 

이제 Greeting의 값은 여러 가지 (Hello, Hi, Welcome) 으로 사용 가능하다.

 

let greeting = Greeting
greeting = "Hello"
greeting = "Hi"
greeting = "Welcome"
greeting = "Goodbye" // Error

 

2.  keyof only

 

keyof는 리터럴 타입의 유니온이다. 

 

interface Person {
    name: string,
    age: number,
    location: string
}

 

 

type NewType = keyof Person
let newType: NewType
newType = "name"           // OK
newType = "age"            // OK
newType = "location"       // OK
newType = "anyOtherValue"  // Error

 

3. keyof typeof Together

 

위의 예시들을 보면, typeof는 타입을 반환해주며 keyof는 타입을 명시해주었기 때문에 type을 안 채로 union으로 literal type을 사용할 수 있었다. 그렇지만 아래와 같은 예시들은 어떨까?

 

const newPerson = { name: "lee", age: "100" }

type Person = keyof typeof newPerson
let person: Person
person = "name" //OK
person = "age" // OK
person = "job" // Error

 

 

'Frontend > TypeScript' 카테고리의 다른 글

TypeScript 추상 클래스 (Abstract class)  (0) 2023.01.21
TypeScript super vs this & setter/getter  (0) 2023.01.16
TypeScript - infer  (0) 2023.01.14
TypeScript type vs interface  (0) 2023.01.14
TypeScript 전개 연산자(Spread 문법)  (0) 2023.01.13