“타입 시스템은 집합의 개념이다.”
이 문장을 지금 당장 이해하지 못해도 좋다. 하지만 집합의 개념에서 타입 시스템을 바라보지 않는 다면, 기본은 알아도 활용할 때에 바로 한계에 부딪칠 가능성이 크다. 아래 글을 읽으면서 모르는 문제가 나왔을 때 집합의 개념에서 접근해 보자.
아래 코드를 먼저 살펴보자
function getKey<K extends string>(value: any, key: K) {
console.log(value.key);
}
여기서 extends string
이 의미하는 것은 무엇일까? 이것을 설명할 수 있다면 이 글은 넘겨도 된다. 하지만, 아니라면 곰곰히 생각 후에 아래 내용을 읽어보자
만약 상속 의 의미로 위 문제에 대한 답을 접근했다면, 매우 복잡한 논리가 머리속에서 그려져야 설명이 가능할 것이다. 이런 논리라면 굳이 상속을 하지 않고 string 을 딱 정해도 되는 일이 아닌가?
그렇다면 editor 를 사용해서 도움 메시지를 참고해 보자.
key 는 string 이라고 알려주고 있다.
그렇다면 집합의 개념으로 다가가보자. extend
는 하위 집합
의 개념이다.
A extends B 라고 한다면, A는 B의 하위 집합인 것이다. K는 string의 하위 집합이다. 따라서 K 는 string 타입이 가질 수 있는 것들을 가질 수 있다. string 자체 뿐만 아니라 string literal types, union of string literal types 도 해당되는 것이다.
*keyof
는 하나의 object의 key들을 타입으로 변환해 준다.*
type PointKeys = keyof Point; // type PointKeys === "x" | "y"
function sortBy<K extends keyof T, T>(inputArray: T[], key: K): T[] {
return inputArray;
}
const inputArray: Point[] = [{x: 10, y: 20}, {x: 3, y: 7}];
keyof 와 extends를 같이 사용했지만, 사용된 의미나 방법은 위에 예제랑 다를 게 없다.
좀 더 확실하게 보기 위해, editor을 사용해 봤다.