본문 바로가기
WEB/타입 챌린지

[Type Challenge] Length of Tuple

by IT황구 2023. 4. 2.
728x90
반응형

 

문제 의도 및 개념정리

  • as const로 array를 narrowing 하면 readonly로 변한다.
    • array -> readonly tuples
    • object -> readonly properties

 

내가 생각한 풀이 방법

  • as const로 길이가 고정된 array에 대해서 number를 반환하는 제네릭 만들기..
  • T.length로 하니 안된다.
    • T가 타입인데 namespace (internal module)로 쓰였다고 한다.
  • T를 unknown readonly array로 제한하고, T['length']로 하니까 실행이 되었다.

 

 

  • 왜 T.length는 안될까?
    • T가 Array라고 가정하면 T는 Array interface이다. 그리고 length는 interface에 정의된 property이다.
    • js의 object는 아니라는 뜻이다. js object처럼 dot notation으로 접근하려고 하면 안된다.
    • TS의 문법을 따라야 한다. indexed access types.
    • interface는 js runtime에는 사라진다.
    • 따라서 T["length"] 로 들어가야 interface T의 property가 반환하는 타입 number를 받을 수 있는것이다.

 

실행하지 못했던 이유 및 해결 방법

해답

Reference

 

왜 T.length는 안될까? 라는 의문을 해결하는데 기존에 스터디 했던 내용들이 굉장히 도움이 많이 되었습니다.

1. interface는 js 런타임에 사라진다. 그냥 타입을 표현하는데 도움을 줄 뿐이다.

2. 타입을 리턴해야한다. value와 type을 구분해야한다.

3. 우리가 object처럼 '[ ]' bracket notation 을 쓸 수 있었던건 TS가 우연히 indexed access type을 지원해줬기 때문이다.

 

TS Easy를 모두 해결했습니다. (Includes) 제외

아래의 내용정도를 익히게 되면 다 풀 수 있는것 같습니다. 익히다보면 풀리는건가..?

 

  • Array 순회는 T[number]
  • Union 순회는 어떻게 할까?
    • 'T extends number ? T : never', T가 유니온 리터럴 형식이라면 분배법칙이 적용됩니다.
    • { [ P in keyof T ] : T[P] }, Mapped Type 에서 rhs 부분이 유니온 타입이라면 in 키워드를 통해서 각각 적용할 수 있습니다.
  • 가변 튜플 타입들은 Rest param을 사용할 수 있다. <T extends unknown[]> = [...T]
  • indexed access type을 통해서 우리가 인터페이스 내의 property에 접근할 수 있다.

 

728x90
반응형

'WEB > 타입 챌린지' 카테고리의 다른 글

[Type Challenge] BEM style string  (0) 2023.04.07
[Type Challenge] Absolute  (0) 2023.04.03
[Type Challenge] Pick  (0) 2023.04.01
[Type Challenge] Exclude  (0) 2023.03.26
[Type Challenge] Concat  (0) 2023.03.23