Typescript Generic Last<T>

박새·2023년 4월 19일
0

타스로 배열의 마지막 요소 뽑아내기 공부 중 신기한 문법을 발견해서 정리해둔다.

type arr1 = ['a', 'b', 'c']
type arr2 = [3, 2, 1]

type tail1 = Last<arr1> // expected to be 'c'
type tail2 = Last<arr2> // expected to be 1
type Last<T extends any[]> = [any,...T][T["length"]]
// type Last<T extends any[]> = T extends [...any, infer L] ? L : never

1 [any, ...T]any가 추가된 새로운 배열이다.
2 배열은 객체로 { 0: any, 1: value, 2: value ... length: number}과 같이 저장된다.

2.1 물론 여기서 any는 타입으로 명시되어 있음을 주의하자. (any 대신 1, "a"과 같은 더미 값을 넣어도 된다.)
2.2 정리하자면 any가 추가된 배열은 [any, 1, 2, 3]이다.
3 그렇다면 [any, ...T][T["length"]는 무엇을 의미하는가?
3.1 [1,2,3][0]는 객체의 키값 0에 접근한다.
3.2 이를 통해서 [T["length"]]가 앞에 선언된 배열(객체)의 키값에 접근함을 알 수 있다.
3.3 여기서 T["length"]Array<T>.length로 원본 배열의 길이(3)이다.
3.4 결론은[any, ...T][T["length"]] === [길이가 1증가한 T 배열][T배열의 length]이다.
4. 놀랍다.

문제 링크: https://github.com/type-challenges/type-challenges/blob/main/questions/00015-medium-last/README.md

profile
pending...

0개의 댓글