-
Notifications
You must be signed in to change notification settings - Fork 12.8k
/
Copy pathnonNullableReductionNonStrict.types
50 lines (40 loc) · 1.31 KB
/
nonNullableReductionNonStrict.types
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
=== tests/cases/compiler/nonNullableReductionNonStrict.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
>f1 : (value: string) => T
>"hello" : "hello"
f2?.("hello");
>f2?.("hello") : T
>f2 : ((value: string) => T) | ((value: string) => T)
>"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 : never)
>null : null
let z = x!; // NonNullable<T>
>z : T | (string extends T ? null : never)
>x! : T | (string extends T ? null : never)
>x : T | (string extends T ? null : never)
}
function f2<T, U extends null | undefined>(x: T | U) {
>f2 : <T, U extends null>(x: T | U) => void
>null : null
>x : T | U
let z = x!; // NonNullable<T>
>z : T | U
>x! : T | U
>x : T | U
}