-
카테고리
-
세부 분야
프로그래밍 언어
-
해결 여부
미해결
질문 있습니다.
20.12.13 01:28 작성 조회수 129
2
안녕하세요! 강의 잘 보고있습니다.
Extract나 Exclude를 보면서 궁금한게 생겼는데요.
유틸리티 타입을 풀어서 작성하면 생각한대로 잘 동작하지 않는데 왜 그런건가요?
type Extract<T, U> = T extends U ? T : never;
type T1 = Extract<(1 | 3 | 5 | 7), (1 | 5 | 9)>; // T1는 1 | 5
// T2의 타입은 string이 될 것으로 예상했지만 never가 됩니다. 왜 그런걸까요?
type T2 = (1 | 3 | 5 | 7) extends (1 | 5 | 9) ? string : never;
답변을 작성해보세요.
0
이재승
지식공유자2020.12.13
안녕하세요
distributive conditional types 속성 때문에 그렇습니다
conditional types 에서 (naked) type parameter 가 사용된 경우에 distributive 방식으로 동작합니다
제네릭에 사용된 변수가 type parameter 입니다
https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-8.html#distributive-conditional-types
naked 라는 단어는 아래 코드로 설명드릴게요
T1 처럼 type parameter 가 그대로 사용되면 naked 이고,
T2 처럼 변형된 형태(T[])로 사용되면 naked 가 아닙니다
```
type T1<T> = T extends number ? T[] : 'no';
type T2<T> = T[] extends number ? 'yes' : T[];
type T3 = T1<(1 | 3 | 5 | 7)>; // 1[] | 3[] | 5[] | 7[]
type T4 = T2<(1 | 3 | 5 | 7)>; // (1 | 3 | 5 | 7)[]
```
답변 1