2019년 1월 6일 23:01

타입스크립트 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"'.

©2022 heecheolman

Built with Gatsby