forked from microsoft/TypeScript
-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathdeferredLookupTypeResolution.js
More file actions
81 lines (66 loc) · 2.07 KB
/
Copy pathdeferredLookupTypeResolution.js
File metadata and controls
81 lines (66 loc) · 2.07 KB
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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
//// [tests/cases/compiler/deferredLookupTypeResolution.ts] ////
//// [deferredLookupTypeResolution.ts]
// Repro from #17456
type StringContains<S extends string, L extends string> = (
{ [K in S]: 'true' } &
{ [key: string]: 'false' }
)[L]
type ObjectHasKey<O, L extends string> = StringContains<Extract<keyof O, string>, L>
type First<T> = ObjectHasKey<T, '0'>; // Should be deferred
type T1 = ObjectHasKey<{ a: string }, 'a'>; // 'true'
type T2 = ObjectHasKey<{ a: string }, 'b'>; // 'false'
// Verify that mapped type isn't eagerly resolved in type-to-string operation
declare function f1<A extends string, B extends string>(a: A, b: B): { [P in A | B]: any };
function f2<A extends string>(a: A) {
return f1(a, 'x');
}
function f3(x: 'a' | 'b') {
return f2(x);
}
//// [deferredLookupTypeResolution.js]
"use strict";
// Repro from #17456
function f2(a) {
return f1(a, 'x');
}
function f3(x) {
return f2(x);
}
//// [deferredLookupTypeResolution.d.ts]
type StringContains<S extends string, L extends string> = ({
[K in S]: 'true';
} & {
[key: string]: 'false';
})[L];
type ObjectHasKey<O, L extends string> = StringContains<Extract<keyof O, string>, L>;
type First<T> = ObjectHasKey<T, '0'>;
type T1 = ObjectHasKey<{
a: string;
}, 'a'>;
type T2 = ObjectHasKey<{
a: string;
}, 'b'>;
declare function f1<A extends string, B extends string>(a: A, b: B): {
[P in A | B]: any;
};
declare function f2<A extends string>(a: A): { [P in A | "x"]: any; };
declare function f3(x: 'a' | 'b'): {
a: any;
b: any;
x: any;
};
!!!! File deferredLookupTypeResolution.d.ts differs from original emit in noCheck emit
//// [deferredLookupTypeResolution.d.ts]
===================================================================
--- Expected The full check baseline
+++ Actual with noCheck set
@@ -15,8 +15,8 @@
[P in A | B]: any;
};
declare function f2<A extends string>(a: A): { [P in A | "x"]: any; };
declare function f3(x: 'a' | 'b'): {
+ x: any;
a: any;
b: any;
- x: any;
};