Merge pull request #12301 from Microsoft/recursiveMappedTypes

Fix recursive mapped types
This commit is contained in:
Anders Hejlsberg
2016-11-16 10:23:14 -08:00
committed by GitHub
5 changed files with 113 additions and 0 deletions
+2
View File
@@ -4489,6 +4489,8 @@ namespace ts {
const members: SymbolTable = createMap<Symbol>();
let stringIndexInfo: IndexInfo;
let numberIndexInfo: IndexInfo;
// Resolve upfront such that recursive references see an empty object type.
setStructuredTypeMembers(type, emptySymbols, emptyArray, emptyArray, undefined, undefined);
// In { [P in K]: T }, we refer to P as the type parameter type, K as the constraint type,
// and T as the template type.
const typeParameter = getTypeParameterFromMappedType(type);
@@ -0,0 +1,30 @@
//// [recursiveMappedTypes.ts]
// 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]
}
//// [recursiveMappedTypes.js]
// Recursive mapped types simply appear empty
//// [recursiveMappedTypes.d.ts]
declare type Recurse = {
[K in keyof Recurse]: Recurse[K];
};
declare type Recurse1 = {
[K in keyof Recurse2]: Recurse2[K];
};
declare type Recurse2 = {
[K in keyof Recurse1]: Recurse1[K];
};
@@ -0,0 +1,33 @@
=== tests/cases/conformance/types/mapped/recursiveMappedTypes.ts ===
// Recursive mapped types simply appear empty
type Recurse = {
>Recurse : Symbol(Recurse, Decl(recursiveMappedTypes.ts, 0, 0))
[K in keyof Recurse]: Recurse[K]
>K : Symbol(K, Decl(recursiveMappedTypes.ts, 4, 5))
>Recurse : Symbol(Recurse, Decl(recursiveMappedTypes.ts, 0, 0))
>Recurse : Symbol(Recurse, Decl(recursiveMappedTypes.ts, 0, 0))
>K : Symbol(K, Decl(recursiveMappedTypes.ts, 4, 5))
}
type Recurse1 = {
>Recurse1 : Symbol(Recurse1, Decl(recursiveMappedTypes.ts, 5, 1))
[K in keyof Recurse2]: Recurse2[K]
>K : Symbol(K, Decl(recursiveMappedTypes.ts, 8, 5))
>Recurse2 : Symbol(Recurse2, Decl(recursiveMappedTypes.ts, 9, 1))
>Recurse2 : Symbol(Recurse2, Decl(recursiveMappedTypes.ts, 9, 1))
>K : Symbol(K, Decl(recursiveMappedTypes.ts, 8, 5))
}
type Recurse2 = {
>Recurse2 : Symbol(Recurse2, Decl(recursiveMappedTypes.ts, 9, 1))
[K in keyof Recurse1]: Recurse1[K]
>K : Symbol(K, Decl(recursiveMappedTypes.ts, 12, 5))
>Recurse1 : Symbol(Recurse1, Decl(recursiveMappedTypes.ts, 5, 1))
>Recurse1 : Symbol(Recurse1, Decl(recursiveMappedTypes.ts, 5, 1))
>K : Symbol(K, Decl(recursiveMappedTypes.ts, 12, 5))
}
@@ -0,0 +1,33 @@
=== tests/cases/conformance/types/mapped/recursiveMappedTypes.ts ===
// Recursive mapped types simply appear empty
type Recurse = {
>Recurse : Recurse
[K in keyof Recurse]: Recurse[K]
>K : K
>Recurse : Recurse
>Recurse : Recurse
>K : K
}
type Recurse1 = {
>Recurse1 : Recurse1
[K in keyof Recurse2]: Recurse2[K]
>K : K
>Recurse2 : Recurse2
>Recurse2 : Recurse2
>K : K
}
type Recurse2 = {
>Recurse2 : Recurse2
[K in keyof Recurse1]: Recurse1[K]
>K : K
>Recurse1 : Recurse1
>Recurse1 : Recurse1
>K : K
}
@@ -0,0 +1,15 @@
// @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]
}