// @declaration: true // Recursive mapped types simply appear empty type Recurse = { [K in keyof Recurse]: Recurse[K] } type Recurse1 = { [K in keyof Recurse2]: Recurse2[K] } type Recurse2 = { [K in keyof Recurse1]: Recurse1[K] } // Repro from #27881 export type Circular = {[P in keyof T]: Circular}; type tup = [number, number, number, number]; function foo(arg: Circular): tup { return arg; } // Repro from #29442 type DeepMap = { [K in keyof T]: T[K] extends unknown[] ? DeepMap : R; }; type tpl = [string, [string, [string]]]; type arr = string[][]; type t1 = DeepMap; // [number, [number, [number]]] type t2 = DeepMap; // number[][] // Repro from #29577 type Transform = { [K in keyof T]: Transform }; interface User { avatar: string; } interface Guest { displayName: string; } interface Product { users: (User | Guest)[]; } declare var product: Transform; product.users; // (Transform | Transform)[] // Repro from #29702 type Remap1 = { [P in keyof T]: Remap1; }; type Remap2 = T extends object ? { [P in keyof T]: Remap2; } : T; type a = Remap1; // string[] type b = Remap2; // string[] // Repro from #29992 type NonOptionalKeys = { [P in keyof T]: undefined extends T[P] ? never : P }[keyof T]; type Child = { [P in NonOptionalKeys]: T[P] } export interface ListWidget { "type": "list", "minimum_count": number, "maximum_count": number, "collapsable"?: boolean, //default to false, means all expanded "each": Child; } type ListChild = Child declare let x: ListChild; x.type;