• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    미해결

질문 있습니다.

20.12.13 01:28 작성 조회수 128

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;

답변 1

답변을 작성해보세요.

0

안녕하세요
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)[]
```

푸린님의 프로필

푸린

2022.07.25

감사합니다. 머리 뽀개지기 직전인데 설명 보고 겨우 안정화 되었습니다.