lodash에서 get 함수는 자바스크립트의 중첩 값에 접근하기 위한 꽤 편리한 도우미이다.
그러나, 타입스크립트에 관해서, 이것처럼 사용하면 타입 정보를 잃을 수 있다. 다가오는 템플릿 리터럴 타입 기능과 함께, 적절하게 get 타입핑은 가능해 질 수 있다. 구현할 수 있겠는가?
The get function in lodash is a quite convenient helper for accessing nested values in JavaScript. However, when we come to TypeScript, using functions like this will make you lose the type information. With TS 4.1's upcoming Template Literal Types feature, properly typing get becomes possible. Can you implement it?
type Get<T, K extends string> =
K extends keyof T?T[K]:
K extends `${infer Head}.${infer Tail}`?
Head extends keyof T?Get<T[Head],Tail>
:never
:never
3 가지 경우로 상황이 갈린다.
1. K가 T의 키 타입인 경우(이때, T의 키 타입에 .이 포함된 경우도 적용된다)
2. K가 T의 키 타입에 해당하지 않으면서 .이 포함된 경우
3. 위 두 조건을 만족하지 않는 경우
1번의 경우에는 해당 값을 바로 반환한다.
2번의 경우에는 . 뒤에 있는 값(Tail)을 .앞에 있는 값(Head)의 K(T[K])에 대응시켜 재귀적으로 Get을 실행한다.
3번의 경우에는 해당 값이 없으므로 never를 반환한다.