TypeScript/tests/baselines/reference/nonNullableReduction.types
Anders Hejlsberg 3938958d36
Properly remove generic types that are constrained to 'null | undefined' in getNonNullableType (#44219)
* Improve getNonNullableType function

* Add tests

* More closely match previous behavior

* Add non-strict mode test
2021-05-25 11:40:28 -07:00

51 lines
1.4 KiB
Plaintext

=== tests/cases/compiler/nonNullableReduction.ts ===
// Repros from #43425
type Transform1<T> = ((value: string) => T) | (string extends T ? undefined : never);
>Transform1 : Transform1<T>
>value : string
type Transform2<T> = string extends T ? ((value: string) => T) | undefined : (value: string) => T;
>Transform2 : Transform2<T>
>value : string
>value : string
function test<T>(f1: Transform1<T>, f2: Transform2<T>) {
>test : <T>(f1: Transform1<T>, f2: Transform2<T>) => void
>f1 : Transform1<T>
>f2 : Transform2<T>
f1?.("hello");
>f1?.("hello") : T | undefined
>f1 : ((value: string) => T) | undefined
>"hello" : "hello"
f2?.("hello");
>f2?.("hello") : T | undefined
>f2 : ((value: string) => T) | ((value: string) => T) | undefined
>"hello" : "hello"
}
function f1<T>(x: T | (string extends T ? null | undefined : never)) {
>f1 : <T>(x: T | (string extends T ? null | undefined : never)) => void
>x : T | (string extends T ? null | undefined : never)
>null : null
let z = x!; // NonNullable<T>
>z : NonNullable<T>
>x! : NonNullable<T>
>x : T | (string extends T ? null | undefined : never)
}
function f2<T, U extends null | undefined>(x: T | U) {
>f2 : <T, U extends null | undefined>(x: T | U) => void
>null : null
>x : T | U
let z = x!; // NonNullable<T>
>z : NonNullable<T>
>x! : NonNullable<T>
>x : T | U
}