
Typescript Challenges에 있는 타입스크립트 문제를 easy 단계부터 풀어 보려고 합니다. easy에서는 3문제씩 풀이와 함께 업로드합니다.
First of Array
- https://github.com/type-challenges/type-challenges/blob/master/questions/14-easy-first/README.md
- 문제: 배열을 generic 타입으로 입력했을 때 해당 배열의 첫 번째 요소 타입을 구현하는 문제.
1) 우선 대부분의 경우에는 T[0]
로 하게 되면 배열 자신의 값으로 되기 때문에 타입이 지정이 됩니다.
2) 고려해야 할 부분은 빈 배열을 넣었을 경우입니다. 타입스크립트에서도 삼항연산자를 쓸 수 있습니다. 조건은 extends 키워드를 한정적으로 부여해 equal과 같은 효과가 나도록 하여 작성할 수 있습니다. T extends []
3) 삼항연산자를 사용하여 빈 배열일 경우([]
)에만 never 타입으로 지정하면 완성됩니다.
type First<T extends any[]> = T extends [] ? never : T[0];
Length of Tuple
- https://github.com/type-challenges/type-challenges/blob/master/questions/18-easy-tuple-length/README.md
- 문제: 튜플을 generic으로 넣으면 그 길이를 타입으로 구현하는 문제. 단, 배열이 아닐 경우에는 에러가 발생해야 함.
1) 예제를 보면 as const 단언으로 인해 타입이 readonly
로 됩니다. 이를 이용하여 들어올 수 있는 generic 타입을 readonly로 지정해 줍니다.
<T extends readonly any[]>`

2) T가 any[] 형태로 들어온다고 범위가 정해졌으므로 배열에 있는 속성을 가져다 쓸 수 있습니다. 단, 타입스크립트에서는 T.length와 같은 형태로는 작성이 되지 않습니다. T['length']
와 같은 형태로 array.length 속성을 꺼내쓸 수 있습니다.
type Length<T extends readonly any[]> = T['length'];
Exclude
- https://github.com/type-challenges/type-challenges/blob/master/questions/43-easy-exclude/README.md
- 문제:
Exclude<"a" | "b" | "c", "a">
를 타입스크립트로 구현하는 문제. 이 문제의 답은 실제Exclude
가 구현되어 있는 것과 동일하여 원리에 대해 이해한 내용을 설명하겠습니다.
1) T extends U
는 union으로 들어온 T 타입 (ex: "a" | "b" | "c")을 하나씩 체크하는 부분입니다. "a" extends "b", "b" extends "b",..이런 식으로 말이죠.
2) U와 타입이 같으면 never 입니다. never는 아무것도 없는 타입이기 때문에 아무것도 남지 않게 됩니다.
3) U와 타입이 다르면 T 자신을 보냅니다. MyExclude<"a" | "b" | "c", "b">
결과가 "a" | "c" 로 나오게 됩니다.
type MyExclude<T, U> = T extends U ? never : T;