forked from microsoft/TypeScript
-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathsubtypeReductionUnionConstraints.types
99 lines (76 loc) · 2.17 KB
/
subtypeReductionUnionConstraints.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
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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
=== tests/cases/compiler/subtypeReductionUnionConstraints.ts ===
// Repro from #53311
type FooNode = {
>FooNode : { kind: 'foo'; children: Node[]; }
kind: 'foo';
>kind : "foo"
children: Node[];
>children : Node[]
};
type BarNode = {
>BarNode : { kind: 'bar'; }
kind: 'bar';
>kind : "bar"
}
type Node = FooNode | BarNode;
>Node : FooNode | BarNode
type Document = {
>Document : { kind: 'document'; children: Node[]; }
kind: 'document';
>kind : "document"
children: Node[];
>children : Node[]
};
declare function isNode(node: unknown): node is Node;
>isNode : (node: unknown) => node is Node
>node : unknown
declare function isBar(node: Node): node is BarNode;
>isBar : (node: Node) => node is BarNode
>node : Node
export function visitNodes<T extends Node>(node: Document | Node, predicate: (testNode: Node) => testNode is T): void {
>visitNodes : <T extends Node>(node: Document | Node, predicate: (testNode: Node) => testNode is T) => void
>node : Node | Document
>predicate : (testNode: Node) => testNode is T
>testNode : Node
isNode(node) && predicate(node);
>isNode(node) && predicate(node) : boolean
>isNode(node) : boolean
>isNode : (node: unknown) => node is Node
>node : Node | Document
>predicate(node) : boolean
>predicate : (testNode: Node) => testNode is T
>node : Node
if (!isNode(node) || !isBar(node)) {
>!isNode(node) || !isBar(node) : boolean
>!isNode(node) : boolean
>isNode(node) : boolean
>isNode : (node: unknown) => node is Node
>node : Node | Document
>!isBar(node) : boolean
>isBar(node) : boolean
>isBar : (node: Node) => node is BarNode
>node : Node
const nodes: Node[] = node.children;
>nodes : Node[]
>node.children : Node[]
>node : FooNode | Document
>children : Node[]
}
}
// Repro from #53311
type A = { a: string };
>A : { a: string; }
>a : string
type B = { b: string };
>B : { b: string; }
>b : string
function f1<T extends A | B>(t: T, x: A | B) {
>f1 : <T extends A | B>(t: T, x: A | B) => void
>t : T
>x : A | B
const a = [t, x]; // (A | B)[] by subtype reduction
>a : (A | B)[]
>[t, x] : (A | B)[]
>t : T
>x : A | B
}