문자열 리터럴 타입
일반적인 객체지향 언어들을 보면
프리미티브 타입 or 클래스 타입 등으로 타입 지정이 가능한데
타입스크립트에서는 특이하게 문자열 리터럴 타입 도 사용할 수 있다
예를 들어보자
var tempVar : string = "hello";var tempVar : number = 123;위와 같이 tempVar 변수의 타입을 string 또는 number 으로 선언하는 것은 자연스럽다
그런데 아래와 같이도 타입을 지정할 수 있다
var tempVar : "hello"hello 라는 문자열 리터럴을 타입으로 지정하고 있다, 보통의 문자열은 타입이 아닌 값으로 쓰이는데 타입스크립트에서는 타입으로도 사용될 수 있다
만약 아래와 같이 hello 로 타입이 지정된 변수에 hi 라는 값을 넣으려하면, 오류가 발생한다
var tempVar : "hello" = "hi"tempVar 는 이제 오로지 값으로 hello만 갖을 수 있게된다
이를 응용해보자
응용
lib.dom.d.ts
interface WebSocketEventMap {
"close": CloseEvent;
"error": Event;
"message": MessageEvent;
"open": Event;
}lib.dom.d.ts
addEventListener<K extends keyof WebSocketEventMap>(type: K, listener: (this: WebSocket, ev: WebSocketEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;위 코드는 lib.dom.d.ts 에 정의된 interface WebSocket 의 일부를 가져왔다
제네릭 K 의 타입이 WebSocketEventMap 의 key들을 문자열 리터널으로 가져온 값이다
ℹ
keyof 는 객체의 모든 속성 이름(키)를 문자열 리터럴로 추출하는 기능이다
즉 K 는 "close" | "error" | "message" | "open" 을 확장한 타입으로 지정된다
그렇다면 파라미터 type: K 의 경우 type : "close" | "error" | "message" | "open" 로 해석된다
결과적으로 K는 문자열 close, error, message, open 네개 중 하나만을 타입으로 갖을 수 있다