mirror of
https://github.com/microsoft/TypeScript.git
synced 2025-11-18 17:21:48 +00:00
Merge pull request #12301 from Microsoft/recursiveMappedTypes
Fix recursive mapped types
This commit is contained in:
@@ -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]
|
||||
}
|
||||
Reference in New Issue
Block a user