1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
|
=== tests/cases/compiler/simplifyingConditionalWithInteriorConditionalIsRelated.ts ===
// from https://github.com/microsoft/TypeScript/issues/30706
type ConditionalType<T> = T extends string ? string : number;
>ConditionalType : ConditionalType<T>
function ConditionalOrUndefined<T>(): ConditionalType<T> | undefined {
>ConditionalOrUndefined : <T>() => ConditionalType<T> | undefined
return 0 as any;
>0 as any : any
>0 : 0
}
function JustConditional<T>(): ConditionalType<T> {
>JustConditional : <T>() => ConditionalType<T>
return ConditionalOrUndefined<T>()!; // shouldn't error
>ConditionalOrUndefined<T>()! : ConditionalType<T>
>ConditionalOrUndefined<T>() : ConditionalType<T> | undefined
>ConditionalOrUndefined : <T>() => ConditionalType<T> | undefined
}
// For comparison...
function genericOrUndefined<T>(): T | undefined {
>genericOrUndefined : <T>() => T | undefined
return 0 as any;
>0 as any : any
>0 : 0
}
function JustGeneric<T>(): T {
>JustGeneric : <T>() => T
return genericOrUndefined<T>()!; // no error
>genericOrUndefined<T>()! : NonNullable<T>
>genericOrUndefined<T>() : T | undefined
>genericOrUndefined : <T>() => T | undefined
}
// Simplified example:
function f<T>() {
>f : <T>() => void
type One = T extends string ? string : string;
>One : T extends string ? string : string
type A = T extends number ? One : never;
>A : T extends number ? T extends string ? string : string : never
const x: One = null as any as A;
>x : T extends string ? string : string
>null as any as A : T extends number ? T extends string ? string : string : never
>null as any : any
>null : null
}
|