[TS] T extends never의 의미

QT-HH·2022년 2월 11일
0

typescript

목록 보기
1/1

typeChallenge를 하다가 T extends never이라는 구문을 봤다.
뭔지 궁금해서 찾아봤다.

never?

never은 다른 모든 타입들의 서브셋이다.

T | never = T
type Test1 = string extends never ? true : false // false
type Test2 = never extends string ? true : false // true

T extends never?

keyof는 오브젝트의 known key를 union type으로 생성한다.

type Test3 = keyof 'hello' // ( === keyof string )
// type Test3 = number | typeof Symbol.iterator | "toString" | "charAt" | "charCodeAt" | "concat" | "indexOf" | "lastIndexOf" | "localeCompare" | "match" | "replace" | "search" | "slice" | ... 30 more ... | "padEnd"

type Test4 = keyof 5 // ( === keyof number)
// type test4 = "toString" | "toFixed" | "toExponential" | "toPrecision" | "valueOf" | "toLocaleString"

T extends never ? ~~ : ~~

이 표현식은 T에 known key가 있는지 없는지 판별한다.


예를 들면

type Test<T> = keyof T extends never ? true : false

type t1 = Test<{a: string}> // false, a가 known key임
type t2 = Test<{}> // true, known key가 없음
type t3 = Test<object> // true, known key가 없음
type t4 = Test<string> // false, string의 메서드(toUpperCase 등)이 known key로 잡힘
type t5 = Test<{a: string} | {b: string}> // true, 두 타입의 common known key가 없음

참고

profile
FE 초짜

0개의 댓글