/
genericObjectRest.types
110 lines (93 loc) · 2.32 KB
/
genericObjectRest.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
100
101
102
103
104
105
106
107
108
109
110
=== tests/cases/conformance/types/rest/genericObjectRest.ts ===
const a = 'a';
>a : "a"
>'a' : "a"
function f1<T extends { a: string, b: number }>(obj: T) {
>f1 : <T extends { a: string; b: number; }>(obj: T) => void
>a : string
>b : number
>obj : T
let { ...r0 } = obj;
>r0 : T
>obj : T
let { a: a1, ...r1 } = obj;
>a : any
>a1 : string
>r1 : Pick<T, Exclude<keyof T, "a">>
>obj : T
let { a: a2, b: b2, ...r2 } = obj;
>a : any
>a2 : string
>b : any
>b2 : number
>r2 : Pick<T, Exclude<keyof T, "a" | "b">>
>obj : T
let { 'a': a3, ...r3 } = obj;
>a3 : string
>r3 : Pick<T, Exclude<keyof T, "a">>
>obj : T
let { ['a']: a4, ...r4 } = obj;
>'a' : "a"
>a4 : string
>r4 : Pick<T, Exclude<keyof T, "a">>
>obj : T
let { [a]: a5, ...r5 } = obj;
>a : "a"
>a5 : string
>r5 : Pick<T, Exclude<keyof T, "a">>
>obj : T
}
const sa = Symbol();
>sa : unique symbol
>Symbol() : unique symbol
>Symbol : SymbolConstructor
const sb = Symbol();
>sb : unique symbol
>Symbol() : unique symbol
>Symbol : SymbolConstructor
function f2<T extends { [sa]: string, [sb]: number }>(obj: T) {
>f2 : <T extends { [sa]: string; [sb]: number; }>(obj: T) => void
>[sa] : string
>sa : unique symbol
>[sb] : number
>sb : unique symbol
>obj : T
let { [sa]: a1, [sb]: b1, ...r1 } = obj;
>sa : unique symbol
>a1 : string
>sb : unique symbol
>b1 : number
>r1 : Pick<T, Exclude<keyof T, unique symbol | unique symbol>>
>obj : T
}
function f3<T, K1 extends keyof T, K2 extends keyof T>(obj: T, k1: K1, k2: K2) {
>f3 : <T, K1 extends keyof T, K2 extends keyof T>(obj: T, k1: K1, k2: K2) => void
>obj : T
>k1 : K1
>k2 : K2
let { [k1]: a1, [k2]: a2, ...r1 } = obj;
>k1 : K1
>a1 : T[K1]
>k2 : K2
>a2 : T[K2]
>r1 : Pick<T, Exclude<keyof T, K1 | K2>>
>obj : T
}
type Item = { a: string, b: number, c: boolean };
>Item : Item
>a : string
>b : number
>c : boolean
function f4<K1 extends keyof Item, K2 extends keyof Item>(obj: Item, k1: K1, k2: K2) {
>f4 : <K1 extends "a" | "b" | "c", K2 extends "a" | "b" | "c">(obj: Item, k1: K1, k2: K2) => void
>obj : Item
>k1 : K1
>k2 : K2
let { [k1]: a1, [k2]: a2, ...r1 } = obj;
>k1 : K1
>a1 : Item[K1]
>k2 : K2
>a2 : Item[K2]
>r1 : Pick<Item, Exclude<"a", K1 | K2> | Exclude<"b", K1 | K2> | Exclude<"c", K1 | K2>>
>obj : Item
}