conditional type

declare function t<T>(arg: T extends string ? string : number):any

위와 같은 functino 이 있다고 했을때 arg 를 infer 할때는 T 가 무엇인지 몰라서 extends(extendsType) 를 체크할수 없다

그래서 inferToConditionalType 를 호출하고

 // inside inferToConditionalType
 const targetTypes = [getTrueTypeFromConditionalType(target), getFalseTypeFromConditionalType(target)];
 inferToMultipleTypesWithPriority(source, targetTypes, target.flags, contravariant ? InferencePriority.ContravariantConditional : 0);

truetype string, falsetype numbertarget 으로 infertypes 를 호출해서 candidate 를 검사한다.

함수명 그대로 string 이나 number 는 Type varibale 을가질수 없다. T 같은 타입 파라미터가 있어야한다.

하지만 couldContainTypeVariables 에서 false 가 리턴되어서 더이상 동작하지 않는다.

위처럼 infer 가 실패하면 arg 의 Contextual Type 값은 항상 falsetype을 가진다 .

이 페이지에서 다루는 내용에서는 벗어나서 코드는 다루지 않음

위의 코드에서 arg 의 뭘입력하든 number 로 유추된다.

declare function t<T>(arg: T extends string ? T : never):any

만약 이런 함수라면 Context (T) 가 같기때문에 TsourceType 을 추가한다.

원하는대로 T 가 string 일때만 arg 가 T 타입이고 나머지 타입은 never 이다

declare function t:<T>(arg: T extends { a : infer B } ? B : C):any

infer 로 만든 제너릭일 경우에는 Context (T) 가 다르기 때문에 T나 , B 에 아무 candidtate 도 추가되지 않는다.

candidate 가 없는데 infer 를 쓰면 안된다.

예제