타입스크립트 keyof
인덱스타입 (Index types)
인덱스 타입을 사용해 동적 프로퍼티이름을 사용하는 코드를 컴파일러가 검사하도록 할 수 있다.
예시 코드
function pluck<T, K extends keyof T>(o: T, names: K[]): T[K][] {
return names.map(n => o[n])
}
/*
o: T
names: K[]
keyof T 는 T의 키들
*/
인덱스 타입 쿼리 연산자
keyof T
는 인덱스 타입 쿼리 연산자이다. 어떤 타입의 T에 대해 T의 public 프로퍼티 이름들이다.
interface Person {
name: string
age: number
}
let personProps: keyof Person
// 'name' | 'age'
Person 에 키값이 추가된다면 자동으로 추가된 해당 키가 keyof T
에 업데이트된다. 타입검사이기때문에 미리 해당 키가 무엇인지는 알 수 없다. 컴파일러가 알맞은 프로퍼티를 전달했는지 체크유무정도 할 수 있다.
인덱스 접근 연산자
T[K]
는 인덱스 접근 연산자이다. K extends keyof T
로 기술을 해줘야 어떤키가 있는지 알 수 있는듯 하다.
T의 키들을 갖는 K 즉, person 의 키들을 갖는 name 헷갈리니 잘 되짚어보자
function getProperty<T, K extends keyof T>(o: T, name: K): T[K] {
return o[name]
}
o: T
name: K
o[name]: T[K]
let name: string = getProperty(person, 'age') // 나이
let name: string = getProperty(person, 'foo')
// TS2345: Argument of type '"foo"' is not assignable to parameter of type '"name" | "age"'.