File: recursiveMappedTypes.types

package info (click to toggle)
node-typescript 5.0.4%2Bds1-1
  • links: PTS, VCS
  • area: main
  • in suites: experimental
  • size: 459,116 kB
  • sloc: javascript: 1,972,754; makefile: 6; sh: 1
file content (153 lines) | stat: -rw-r--r-- 3,424 bytes parent folder | download | duplicates (3)
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
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
=== tests/cases/conformance/types/mapped/recursiveMappedTypes.ts ===
// Recursive mapped types simply appear empty

type Recurse = {
>Recurse : any

    [K in keyof Recurse]: Recurse[K]
}

type Recurse1 = {
>Recurse1 : any

    [K in keyof Recurse2]: Recurse2[K]
}

type Recurse2 = {
>Recurse2 : any

    [K in keyof Recurse1]: Recurse1[K]
}

// Repro from #27881

export type Circular<T> = {[P in keyof T]: Circular<T>};
>Circular : Circular<T>

type tup = [number, number, number, number];
>tup : [number, number, number, number]

function foo(arg: Circular<tup>): tup {
>foo : (arg: any) => tup
>arg : any

  return arg;
>arg : any
}

// Repro from #29442

type DeepMap<T extends unknown[], R> = {
>DeepMap : DeepMap<T, R>

  [K in keyof T]: T[K] extends unknown[] ? DeepMap<T[K], R> : R;
};

type tpl = [string, [string, [string]]];
>tpl : [string, [string, [string]]]

type arr = string[][];
>arr : string[][]

type t1 = DeepMap<tpl, number>;  // [number, [number, [number]]]
>t1 : [number, [number, [number]]]

type t2 = DeepMap<arr, number>;  // number[][]
>t2 : number[][]

// Repro from #29577

type Transform<T> = { [K in keyof T]: Transform<T[K]> };
>Transform : Transform<T>

interface User {
    avatar: string;
>avatar : string
}

interface Guest {
    displayName: string;
>displayName : string
}

interface Product {
    users: (User | Guest)[];
>users : (User | Guest)[]
}

declare var product: Transform<Product>;
>product : Transform<Product>

product.users;  // (Transform<User> | Transform<Guest>)[]
>product.users : Transform<User | Guest>[]
>product : Transform<Product>
>users : Transform<User | Guest>[]

// Repro from #29702

type Remap1<T> = { [P in keyof T]: Remap1<T[P]>; };
>Remap1 : Remap1<T>

type Remap2<T> = T extends object ? { [P in keyof T]: Remap2<T[P]>; } : T;
>Remap2 : Remap2<T>
  
type a = Remap1<string[]>;  // string[]
>a : string[]

type b = Remap2<string[]>;  // string[]
>b : string[]

// Repro from #29992

type NonOptionalKeys<T> = { [P in keyof T]: undefined extends T[P] ? never : P }[keyof T];
>NonOptionalKeys : NonOptionalKeys<T>

type Child<T> = { [P in NonOptionalKeys<T>]: T[P] }
>Child : Child<T>

export interface ListWidget {
    "type": "list",
>"type" : "list"

    "minimum_count": number,
>"minimum_count" : number

    "maximum_count": number,
>"maximum_count" : number

    "collapsable"?: boolean, //default to false, means all expanded
>"collapsable" : boolean

    "each": Child<ListWidget>;
>"each" : any
}

type ListChild = Child<ListWidget>
>ListChild : { [x: string]: any; }

declare let x: ListChild;
>x : ListChild

x.type;
>x.type : any
>x : ListChild
>type : any

// Repros from #41790

export type TV<T, K extends keyof T> = T[K] extends Record<infer E, any> ? E : never;
>TV : TV<T, K>

export type ObjectOrArray<T, K extends keyof any = keyof any> = T[] | Record<K, T | Record<K, T> | T[]>;
>ObjectOrArray : ObjectOrArray<T, K>

export type ThemeValue<K extends keyof ThemeType, ThemeType, TVal = any> =
>ThemeValue : ThemeValue<K, ThemeType, TVal>

    ThemeType[K] extends TVal[] ? number :
    ThemeType[K] extends Record<infer E, TVal> ? E :
    ThemeType[K] extends ObjectOrArray<infer F> ? F : never;

export type Foo<T> = T extends { [P in infer E]: any } ? E : never;
>Foo : Foo<T>