forked from microsoft/TypeScript
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdiscriminatedUnionFlatMap.types
More file actions
91 lines (82 loc) · 4.31 KB
/
discriminatedUnionFlatMap.types
File metadata and controls
91 lines (82 loc) · 4.31 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
82
83
84
85
86
87
88
89
90
91
//// [tests/cases/compiler/discriminatedUnionFlatMap.ts] ////
=== discriminatedUnionFlatMap.ts ===
// https://github.com/microsoft/typescript-go/issues/1057
export type InputOp = { op: "add" } | { op: "remove"; value?: Array<unknown> };
>InputOp : InputOp
> : ^^^^^^^
>op : "add"
> : ^^^^^
>op : "remove"
> : ^^^^^^^^
>value : unknown[] | undefined
> : ^^^^^^^^^^^^^^^^^^^^^
export type OutputOp = { op: "add" | "remove" };
>OutputOp : OutputOp
> : ^^^^^^^^
>op : "add" | "remove"
> : ^^^^^^^^^^^^^^^^
export function f(operations: InputOp[]): OutputOp[] {
>f : (operations: InputOp[]) => OutputOp[]
> : ^ ^^ ^^^^^
>operations : InputOp[]
> : ^^^^^^^^^
return operations.flatMap((operation) => {
>operations.flatMap((operation) => { if (operation.op === "remove" && operation.value) { return [].map(() => ({ op: "remove" })); } else { return [operation]; } }) : InputOp[]
> : ^^^^^^^^^
>operations.flatMap : <U, This = undefined>(callback: (this: This, value: InputOp, index: number, array: InputOp[]) => U | readonly U[], thisArg?: This | undefined) => U[]
> : ^ ^^ ^^^^^^^^^^^^^^ ^^^ ^^^^^^^^ ^^^^^^^^^^^ ^^ ^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^
>operations : InputOp[]
> : ^^^^^^^^^
>flatMap : <U, This = undefined>(callback: (this: This, value: InputOp, index: number, array: InputOp[]) => U | readonly U[], thisArg?: This | undefined) => U[]
> : ^ ^^ ^^^^^^^^^^^^^^ ^^^ ^^^^^^^^ ^^^^^^^^^^^ ^^ ^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^
>(operation) => { if (operation.op === "remove" && operation.value) { return [].map(() => ({ op: "remove" })); } else { return [operation]; } } : (this: undefined, operation: InputOp) => InputOp[] | { op: "remove"; }[]
> : ^ ^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>operation : InputOp
> : ^^^^^^^
if (operation.op === "remove" && operation.value) {
>operation.op === "remove" && operation.value : false | unknown[] | undefined
> : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>operation.op === "remove" : boolean
> : ^^^^^^^
>operation.op : "add" | "remove"
> : ^^^^^^^^^^^^^^^^
>operation : InputOp
> : ^^^^^^^
>op : "add" | "remove"
> : ^^^^^^^^^^^^^^^^
>"remove" : "remove"
> : ^^^^^^^^
>operation.value : unknown[] | undefined
> : ^^^^^^^^^^^^^^^^^^^^^
>operation : { op: "remove"; value?: Array<unknown>; }
> : ^^^^^^ ^^^^^^^^^^ ^^^
>value : unknown[] | undefined
> : ^^^^^^^^^^^^^^^^^^^^^
return [].map(() => ({ op: "remove" }));
>[].map(() => ({ op: "remove" })) : { op: "remove"; }[]
> : ^^^^^^^^^^^^^^^^^^^
>[].map : <U>(callbackfn: (value: never, index: number, array: never[]) => U, thisArg?: any) => U[]
> : ^ ^^ ^^^ ^^^^^^^^^ ^^ ^^ ^^^^^^^^^^^^^^^^^ ^^^ ^^^^^^^^
>[] : never[]
> : ^^^^^^^
>map : <U>(callbackfn: (value: never, index: number, array: never[]) => U, thisArg?: any) => U[]
> : ^ ^^ ^^^ ^^^^^^^^^ ^^ ^^ ^^^^^^^^^^^^^^^^^ ^^^ ^^^^^^^^
>() => ({ op: "remove" }) : () => { op: "remove"; }
> : ^^^^^^^^^^^^^^^^^^^^^^^
>({ op: "remove" }) : { op: "remove"; }
> : ^^^^^^^^^^^^^^^^^
>{ op: "remove" } : { op: "remove"; }
> : ^^^^^^^^^^^^^^^^^
>op : "remove"
> : ^^^^^^^^
>"remove" : "remove"
> : ^^^^^^^^
} else {
return [operation];
>[operation] : InputOp[]
> : ^^^^^^^^^
>operation : InputOp
> : ^^^^^^^
}
});
}