컨디셔널 타입
핵심 포인트
컨디셔널 타입에
never를 사용할 때가 많은데 제너릭과 같이 쓸 때에만 의미가 있다.매핑된 객체 타입에서 키가
never이면 해당 속성은 제거된다.검사하려는 타입이 제너릭이면서 유니언이면 분배법칙이 실행됨
boolean은 분배법칙이 일어나면
true | false로 인식하게 된다.분배법칙을 막고 싶다면 배열로 감싸라
never도 분배법칙의 대상이 된다. -> never는 유니언으로 보이진 않지만 유니언으로 생각하는것이 좋다.
never는 분배법칙이 일어나면 never 가 된다.
간단하게 제너릭과 never가 만나면 never가 된다고 생각하자.
never를 타입인수로 사용할 때는 분배법칙을 막기 위해 배열로 감싸라
타입스크립트는 제너릭이 들어있는 컨디셔널 타입을 판단할 때 값의 판단을 뒤로 미룬다.
이 때도 타입스크립트가 판단을 뒤로 미루지 못하도록 배열로 제너릭을 감싸면 된다.
컨디셔널 타입
조건에 따라 다른 타입이되는 컨디셔널 타입
type A1 = string;
type B1 = A1 extends string ? number : boolean; // type B1 = number
type A2 = number;
type B2 = A2 extends string ? number : boolean; // type B2 = booleanextends연산자가 삼항연산자와 같이 사용됨특정 타입 extends 다른 타입 ? 참일 때 타입 : 거짓일 때 타입
특정 타입이 다른 타입의 부분집합일 때 참
컨디셔널 타입은 타입 검사를 위해서도 많이 사용함
컨디셔널 타입은 never와 함께 사용할 때 도 많다.
never와 함께 사용할 때 도 많다.보통은 제너릭과 더불어 쓸 때만
never가 의미가 있다.
❓ 그냥
type New = Start[]로 사용해도 되지 않나??사실 그렇다.
단순한 상황에서는
never와 함께 쓸 이유가 없다.보통은 제너릭과 더불어 쓸 때만
never가 의미가 있다.
매핑된 객체 타입에서 키가 never 이면 해당 속성은 제거된다.
never 이면 해당 속성은 제거된다.중첩 삼항연산자
컨디셔널 타입은 자바스크립트 삼항연산자처럼 중첩해서 만들기 가능
인덱스 접근 타입으로 컨디셔널 타입을 표현 가능
분배 법칙
제너릭과 never의 조합은 더 복잡한 상황에서 진가를 발휘함
string | number 타입으로부터 string[] 타입을 얻고 싶을 때?
검사하려는 타입이 제너릭이면서 유니언이면 분배법칙이 실행됨
Result<string | number>는 Result<string> | Result<number> 가 된다.따라서
Key extends string | boolean ? Key[] : never를 거치면서 string [] | never가 되고 never는 사라져서 최종적으로 string[] 타입이 된 것
boolean에 분배법칙이 적용될 떄는 조심!!boolean을 true | false 로 인식하게 된다.
분배법칙을 막고 싶다면?
배열로 감싸면 분배법칙이 일어나지 않는다.
never도 분배법칙의 대상이 된다.
never가 유니언으로 보이지는 않지만 유니언으로 생각하는것이 좋다.
never가 분배법칙이 일어나면 never가 된다. (공집합에서 분배법칙이 일어나면 아무것도 실행하지 않기때문)
never는 공집합과 같으므로 공집합에서 분배법칙을 실행하는 것은 아무것도 실행하지 않는것과 같다.간단하게 제너릭과 never가 만나면 never가 된다고 생각하자.
따라서 never를 타입인수로 사용하려면 분배법칙이 일어나는것을 막아야 한다.
같은 이유로 제너릭과 컨디셔널 타입을 같이 사용할 때는 다음을 조심하자.
타입스크립트는 제너릭이 들어있는 컨디셔널 타입을 판단할 때 값의 판단을 뒤로 미룬다.
이 때도 타입스크립트가 판단을 뒤로 미루지 못하도록 배열로 제너릭을 감싸면 된다.
컨디셔널 타입은 infer를 통해 더 강력하게 사용 가능
Last updated