diff --git a/internal/checker/nodebuilderimpl.go b/internal/checker/nodebuilderimpl.go
index 170ba9cca8..21cc1b67b6 100644
--- a/internal/checker/nodebuilderimpl.go
+++ b/internal/checker/nodebuilderimpl.go
@@ -1367,6 +1367,8 @@ func (b *nodeBuilderImpl) createMappedTypeNodeFromType(t *Type) *ast.TypeNode {
}
var appropriateConstraintTypeNode *ast.Node
var newTypeVariable *ast.Node
+ templateType := b.ch.getTemplateTypeFromMappedType(t)
+ typeParameter := b.ch.getTypeParameterFromMappedType(t)
// If the mapped type isn't `keyof` constraint-declared, _but_ still has modifiers preserved, and its naive instantiation won't preserve modifiers because its constraint isn't `keyof` constrained, we have work to do
needsModifierPreservingWrapper := !b.ch.isMappedTypeWithKeyofConstraintDeclaration(t) &&
@@ -1374,18 +1376,17 @@ func (b *nodeBuilderImpl) createMappedTypeNodeFromType(t *Type) *ast.TypeNode {
b.ctx.flags&nodebuilder.FlagsGenerateNamesForShadowedTypeParams != 0 &&
!(b.ch.getConstraintTypeFromMappedType(t).flags&TypeFlagsTypeParameter != 0 && b.ch.getConstraintOfTypeParameter(b.ch.getConstraintTypeFromMappedType(t)).flags&TypeFlagsIndex != 0)
- cleanup := b.enterNewScope(mapped.declaration.AsNode(), nil, []*Type{b.ch.getTypeParameterFromMappedType(t)}, nil, nil)
- defer cleanup()
-
if b.ch.isMappedTypeWithKeyofConstraintDeclaration(t) {
// We have a { [P in keyof T]: X }
// We do this to ensure we retain the toplevel keyof-ness of the type which may be lost due to keyof distribution during `getConstraintTypeFromMappedType`
if b.ctx.flags&nodebuilder.FlagsGenerateNamesForShadowedTypeParams != 0 && b.isHomomorphicMappedTypeWithNonHomomorphicInstantiation(mapped) {
- newParam := b.ch.newTypeParameter(
+ newConstraintParam := b.ch.newTypeParameter(
b.ch.newSymbol(ast.SymbolFlagsTypeParameter, "T"),
)
- name := b.typeParameterToName(newParam)
+ name := b.typeParameterToName(newConstraintParam)
+ target := t.Target()
newTypeVariable = b.f.NewTypeReferenceNode(name.AsNode(), nil)
+ templateType = b.ch.instantiateType(b.ch.getTemplateTypeFromMappedType(target), newTypeMapper([]*Type{b.ch.getTypeParameterFromMappedType(target), b.ch.getModifiersTypeFromMappedType(target)}, []*Type{typeParameter, newConstraintParam}))
}
indexTarget := newTypeVariable
if indexTarget == nil {
@@ -1405,15 +1406,18 @@ func (b *nodeBuilderImpl) createMappedTypeNodeFromType(t *Type) *ast.TypeNode {
appropriateConstraintTypeNode = b.typeToTypeNode(b.ch.getConstraintTypeFromMappedType(t))
}
- typeParameterNode := b.typeParameterToDeclarationWithConstraint(b.ch.getTypeParameterFromMappedType(t), appropriateConstraintTypeNode)
+ // nameType and templateType nodes have to be in the new scope
+ cleanup := b.enterNewScope(mapped.declaration.AsNode(), nil, []*Type{b.ch.getTypeParameterFromMappedType(t)}, nil, nil)
+ typeParameterNode := b.typeParameterToDeclarationWithConstraint(typeParameter, appropriateConstraintTypeNode)
var nameTypeNode *ast.Node
if mapped.declaration.NameType != nil {
nameTypeNode = b.typeToTypeNode(b.ch.getNameTypeFromMappedType(t))
}
templateTypeNode := b.typeToTypeNode(b.ch.removeMissingType(
- b.ch.getTemplateTypeFromMappedType(t),
+ templateType,
getMappedTypeModifiers(t)&MappedTypeModifiersIncludeOptional != 0,
))
+ cleanup()
result := b.f.NewMappedTypeNode(
readonlyToken,
typeParameterNode,
diff --git a/testdata/baselines/reference/submodule/compiler/computedTypesKeyofNoIndexSignatureType.types b/testdata/baselines/reference/submodule/compiler/computedTypesKeyofNoIndexSignatureType.types
index 441c9fb3a5..fac9a0142b 100644
--- a/testdata/baselines/reference/submodule/compiler/computedTypesKeyofNoIndexSignatureType.types
+++ b/testdata/baselines/reference/submodule/compiler/computedTypesKeyofNoIndexSignatureType.types
@@ -2,7 +2,7 @@
=== computedTypesKeyofNoIndexSignatureType.ts ===
type Compute = { [K in keyof A]: Compute; } & {};
->Compute : { [K in keyof A]: A[K] extends infer T ? { [K_1 in keyof T]: A[K][K_1] extends infer T_1 ? { [K_2 in keyof T_1]: A[K][K_1][K_2] extends infer T_2 ? { [K_3 in keyof T_2]: A[K][K_1][K_2][K_3] extends infer T_3 ? { [K_4 in keyof T_3]: A[K][K_1][K_2][K_3][K_4] extends infer T_4 ? { [K_5 in keyof T_4]: A[K][K_1][K_2][K_3][K_4][K_5] extends infer T_5 ? { [K_6 in keyof T_5]: A[K][K_1][K_2][K_3][K_4][K_5][K_6] extends infer T_6 ? { [K_7 in keyof T_6]: A[K][K_1][K_2][K_3][K_4][K_5][K_6][K_7] extends infer T_7 ? { [K_8 in keyof T_7]: A[K][K_1][K_2][K_3][K_4][K_5][K_6][K_7][K_8] extends infer T_8 ? { [K_9 in keyof T_8]: A[K][K_1][K_2][K_3][K_4][K_5][K_6][K_7][K_8][K_9] extends infer T_9 ? { [K_10 in keyof T_9]: any; } : never; } : never; } : never; } : never; } : never; } : never; } : never; } : never; } : never; } : never; }
+>Compute : { [K in keyof A]: A[K] extends infer T ? { [K_1 in keyof T]: T[K_1] extends infer T_1 ? { [K_2 in keyof T_1]: T_1[K_2] extends infer T_2 ? { [K_3 in keyof T_2]: T_2[K_3] extends infer T_3 ? { [K_4 in keyof T_3]: T_3[K_4] extends infer T_4 ? { [K_5 in keyof T_4]: T_4[K_5] extends infer T_5 ? { [K_6 in keyof T_5]: T_5[K_6] extends infer T_6 ? { [K_7 in keyof T_6]: T_6[K_7] extends infer T_7 ? { [K_8 in keyof T_7]: T_7[K_8] extends infer T_8 ? { [K_9 in keyof T_8]: T_8[K_9] extends infer T_9 ? { [K_10 in keyof T_9]: any; } : never; } : never; } : never; } : never; } : never; } : never; } : never; } : never; } : never; } : never; }
type EqualsTest = () => A extends T ? 1 : 0;
>EqualsTest : EqualsTest
diff --git a/testdata/baselines/reference/submodule/compiler/computedTypesKeyofNoIndexSignatureType.types.diff b/testdata/baselines/reference/submodule/compiler/computedTypesKeyofNoIndexSignatureType.types.diff
deleted file mode 100644
index a785dedc2a..0000000000
--- a/testdata/baselines/reference/submodule/compiler/computedTypesKeyofNoIndexSignatureType.types.diff
+++ /dev/null
@@ -1,11 +0,0 @@
---- old.computedTypesKeyofNoIndexSignatureType.types
-+++ new.computedTypesKeyofNoIndexSignatureType.types
-@@= skipped -1, +1 lines =@@
-
- === computedTypesKeyofNoIndexSignatureType.ts ===
- type Compute = { [K in keyof A]: Compute; } & {};
-->Compute : { [K in keyof A]: A[K] extends infer T ? { [K_1 in keyof T]: T[K_1] extends infer T_1 ? { [K_2 in keyof T_1]: T_1[K_2] extends infer T_2 ? { [K_3 in keyof T_2]: T_2[K_3] extends infer T_3 ? { [K_4 in keyof T_3]: T_3[K_4] extends infer T_4 ? { [K_5 in keyof T_4]: T_4[K_5] extends infer T_5 ? { [K_6 in keyof T_5]: T_5[K_6] extends infer T_6 ? { [K_7 in keyof T_6]: T_6[K_7] extends infer T_7 ? { [K_8 in keyof T_7]: T_7[K_8] extends infer T_8 ? { [K_9 in keyof T_8]: T_8[K_9] extends infer T_9 ? { [K_10 in keyof T_9]: any; } : never; } : never; } : never; } : never; } : never; } : never; } : never; } : never; } : never; } : never; }
-+>Compute : { [K in keyof A]: A[K] extends infer T ? { [K_1 in keyof T]: A[K][K_1] extends infer T_1 ? { [K_2 in keyof T_1]: A[K][K_1][K_2] extends infer T_2 ? { [K_3 in keyof T_2]: A[K][K_1][K_2][K_3] extends infer T_3 ? { [K_4 in keyof T_3]: A[K][K_1][K_2][K_3][K_4] extends infer T_4 ? { [K_5 in keyof T_4]: A[K][K_1][K_2][K_3][K_4][K_5] extends infer T_5 ? { [K_6 in keyof T_5]: A[K][K_1][K_2][K_3][K_4][K_5][K_6] extends infer T_6 ? { [K_7 in keyof T_6]: A[K][K_1][K_2][K_3][K_4][K_5][K_6][K_7] extends infer T_7 ? { [K_8 in keyof T_7]: A[K][K_1][K_2][K_3][K_4][K_5][K_6][K_7][K_8] extends infer T_8 ? { [K_9 in keyof T_8]: A[K][K_1][K_2][K_3][K_4][K_5][K_6][K_7][K_8][K_9] extends infer T_9 ? { [K_10 in keyof T_9]: any; } : never; } : never; } : never; } : never; } : never; } : never; } : never; } : never; } : never; } : never; }
-
- type EqualsTest = () => A extends T ? 1 : 0;
- >EqualsTest : EqualsTest
\ No newline at end of file
diff --git a/testdata/baselines/reference/submodule/compiler/declarationEmitMappedTypeDistributivityPreservesConstraints.js b/testdata/baselines/reference/submodule/compiler/declarationEmitMappedTypeDistributivityPreservesConstraints.js
index 251410e062..62c571420a 100644
--- a/testdata/baselines/reference/submodule/compiler/declarationEmitMappedTypeDistributivityPreservesConstraints.js
+++ b/testdata/baselines/reference/submodule/compiler/declarationEmitMappedTypeDistributivityPreservesConstraints.js
@@ -52,10 +52,10 @@ declare const _default: {
fn: unknown;
- } ? { [K in keyof T_1]: T["x"][K]; } : never;
- }>(sliceIndex: T) => T["x"] extends infer T_1 extends {
+ } ? { [K in keyof T_1]: T_1[K]; } : never;
+ }>(sliceIndex: T) => T["x"] extends infer T_2 extends {
[x: string]: (...params: unknown[]) => unknown;
- } ? { [K in keyof T_1]: Parameters; } : never;
+ } ? { [K in keyof T_2]: Parameters; } : never;
};
};
export default _default;
diff --git a/testdata/baselines/reference/submodule/compiler/declarationEmitMappedTypeDistributivityPreservesConstraints.js.diff b/testdata/baselines/reference/submodule/compiler/declarationEmitMappedTypeDistributivityPreservesConstraints.js.diff
index 180b1f2c78..42e8128dfa 100644
--- a/testdata/baselines/reference/submodule/compiler/declarationEmitMappedTypeDistributivityPreservesConstraints.js.diff
+++ b/testdata/baselines/reference/submodule/compiler/declarationEmitMappedTypeDistributivityPreservesConstraints.js.diff
@@ -9,17 +9,12 @@
exports.default = { test: types_1.default };
-@@= skipped -25, +25 lines =@@
- fn: unknown;
-- } ? { [K in keyof T_1]: T_1[K]; } : never;
-- }>(sliceIndex: T) => T["x"] extends infer T_2 extends {
-+ } ? { [K in keyof T_1]: T["x"][K]; } : never;
-+ }>(sliceIndex: T) => T["x"] extends infer T_1 extends {
+@@= skipped -28, +28 lines =@@
+ } ? { [K in keyof T_1]: T_1[K]; } : never;
+ }>(sliceIndex: T) => T["x"] extends infer T_2 extends {
[x: string]: (...params: unknown[]) => unknown;
- } ? { [K_1 in keyof T_2]: Parameters; } : never;
-+ } ? { [K in keyof T_1]: Parameters; } : never;
++ } ? { [K in keyof T_2]: Parameters; } : never;
};
};
export default _default;
\ No newline at end of file
diff --git a/testdata/baselines/reference/submodule/compiler/declarationEmitMappedTypeDistributivityPreservesConstraints.types b/testdata/baselines/reference/submodule/compiler/declarationEmitMappedTypeDistributivityPreservesConstraints.types
index b9a7cdfcae..a8a5ea57ec 100644
--- a/testdata/baselines/reference/submodule/compiler/declarationEmitMappedTypeDistributivityPreservesConstraints.types
+++ b/testdata/baselines/reference/submodule/compiler/declarationEmitMappedTypeDistributivityPreservesConstraints.types
@@ -26,9 +26,9 @@ export default { fn };
=== reexport.ts ===
import test from "./types";
->test : { fn: unknown; } ? { [K in keyof T_1]: T["x"][K]; } : never; }>(sliceIndex: T) => T["x"] extends infer T_1 extends { [x: string]: (...params: unknown[]) => unknown; } ? { [K in keyof T_1]: Parameters; } : never; }
+>test : { fn: unknown; } ? { [K in keyof T_1]: T_1[K]; } : never; }>(sliceIndex: T) => T["x"] extends infer T_2 extends { [x: string]: (...params: unknown[]) => unknown; } ? { [K in keyof T_2]: Parameters; } : never; }
export default { test };
->{ test } : { test: { fn: unknown; } ? { [K in keyof T_1]: T["x"][K]; } : never; }>(sliceIndex: T) => T["x"] extends infer T_1 extends { [x: string]: (...params: unknown[]) => unknown; } ? { [K in keyof T_1]: Parameters; } : never; }; }
->test : { fn: unknown; } ? { [K in keyof T_1]: T["x"][K]; } : never; }>(sliceIndex: T) => T["x"] extends infer T_1 extends { [x: string]: (...params: unknown[]) => unknown; } ? { [K in keyof T_1]: Parameters; } : never; }
+>{ test } : { test: { fn: unknown; } ? { [K in keyof T_1]: T_1[K]; } : never; }>(sliceIndex: T) => T["x"] extends infer T_2 extends { [x: string]: (...params: unknown[]) => unknown; } ? { [K in keyof T_2]: Parameters; } : never; }; }
+>test : { fn: unknown; } ? { [K in keyof T_1]: T_1[K]; } : never; }>(sliceIndex: T) => T["x"] extends infer T_2 extends { [x: string]: (...params: unknown[]) => unknown; } ? { [K in keyof T_2]: Parameters; } : never; }
diff --git a/testdata/baselines/reference/submodule/compiler/declarationEmitMappedTypeDistributivityPreservesConstraints.types.diff b/testdata/baselines/reference/submodule/compiler/declarationEmitMappedTypeDistributivityPreservesConstraints.types.diff
index 1b71974e57..5e519d4701 100644
--- a/testdata/baselines/reference/submodule/compiler/declarationEmitMappedTypeDistributivityPreservesConstraints.types.diff
+++ b/testdata/baselines/reference/submodule/compiler/declarationEmitMappedTypeDistributivityPreservesConstraints.types.diff
@@ -5,10 +5,10 @@
=== reexport.ts ===
import test from "./types";
->test : { fn: unknown; } ? { [K in keyof T_1]: T_1[K]; } : never; }>(sliceIndex: T) => T["x"] extends infer T_2 extends { [x: string]: (...params: unknown[]) => unknown; } ? { [K_1 in keyof T_2]: Parameters; } : never; }
-+>test : { fn: unknown; } ? { [K in keyof T_1]: T["x"][K]; } : never; }>(sliceIndex: T) => T["x"] extends infer T_1 extends { [x: string]: (...params: unknown[]) => unknown; } ? { [K in keyof T_1]: Parameters; } : never; }
++>test : { fn: unknown; } ? { [K in keyof T_1]: T_1[K]; } : never; }>(sliceIndex: T) => T["x"] extends infer T_2 extends { [x: string]: (...params: unknown[]) => unknown; } ? { [K in keyof T_2]: Parameters; } : never; }
export default { test };
->{ test } : { test: { fn: unknown; } ? { [K in keyof T_1]: T_1[K]; } : never; }>(sliceIndex: T) => T["x"] extends infer T_2 extends { [x: string]: (...params: unknown[]) => unknown; } ? { [K_1 in keyof T_2]: Parameters; } : never; }; }
->test : { fn: unknown; } ? { [K in keyof T_1]: T_1[K]; } : never; }>(sliceIndex: T) => T["x"] extends infer T_2 extends { [x: string]: (...params: unknown[]) => unknown; } ? { [K_1 in keyof T_2]: Parameters; } : never; }
-+>{ test } : { test: { fn: unknown; } ? { [K in keyof T_1]: T["x"][K]; } : never; }>(sliceIndex: T) => T["x"] extends infer T_1 extends { [x: string]: (...params: unknown[]) => unknown; } ? { [K in keyof T_1]: Parameters; } : never; }; }
-+>test : { fn: unknown; } ? { [K in keyof T_1]: T["x"][K]; } : never; }>(sliceIndex: T) => T["x"] extends infer T_1 extends { [x: string]: (...params: unknown[]) => unknown; } ? { [K in keyof T_1]: Parameters; } : never; }
++>{ test } : { test: { fn: unknown; } ? { [K in keyof T_1]: T_1[K]; } : never; }>(sliceIndex: T) => T["x"] extends infer T_2 extends { [x: string]: (...params: unknown[]) => unknown; } ? { [K in keyof T_2]: Parameters; } : never; }; }
++>test : { fn: unknown; } ? { [K in keyof T_1]: T_1[K]; } : never; }>(sliceIndex: T) => T["x"] extends infer T_2 extends { [x: string]: (...params: unknown[]) => unknown; } ? { [K in keyof T_2]: Parameters; } : never; }
diff --git a/testdata/baselines/reference/submodule/compiler/declarationEmitMappedTypePreservesTypeParameterConstraint.js b/testdata/baselines/reference/submodule/compiler/declarationEmitMappedTypePreservesTypeParameterConstraint.js
index 4450bcb490..43466056a4 100644
--- a/testdata/baselines/reference/submodule/compiler/declarationEmitMappedTypePreservesTypeParameterConstraint.js
+++ b/testdata/baselines/reference/submodule/compiler/declarationEmitMappedTypePreservesTypeParameterConstraint.js
@@ -94,9 +94,7 @@ export declare type ZodRawShape = {
};
export declare const buildSchema: (version: V) => addQuestionMarks;
-}>, undefined extends V ? never : "version"> extends infer T ? { [k in keyof T]: addQuestionMarks;
-}>, undefined extends V ? never : "version">[k]; } : never;
+}>, undefined extends V ? never : "version"> extends infer T ? { [k in keyof T]: T[k]; } : never;
type evaluate = {
[k in keyof t]: t[k];
} & unknown;
@@ -104,57 +102,5 @@ export type entryOf = evaluate<{
[k in keyof o]-?: [k, o[k] & ({} | null)];
}[o extends readonly unknown[] ? keyof o & number : keyof o]>;
export type entriesOf = evaluate[]>;
-export declare const entriesOf: (o: o) => ({ [k_1 in keyof o]-?: [k_1, o[k_1] & ({} | null)]; }[o extends readonly unknown[] ? keyof o & number : keyof o] extends infer T ? { [k in keyof T]: { [k_1 in keyof o]-?: [k_1, o[k_1] & ({} | null)]; }[o extends readonly unknown[] ? keyof o & number : keyof o][k]; } : never)[];
+export declare const entriesOf: (o: o) => ({ [k in keyof o]-?: [k, o[k] & ({} | null)]; }[o extends readonly unknown[] ? keyof o & number : keyof o] extends infer T ? { [k in keyof T]: T[k]; } : never)[];
export {};
-
-
-//// [DtsFileErrors]
-
-
-declarationEmitMappedTypePreservesTypeParameterConstraint.d.ts(24,82): error TS2536: Type 'k' cannot be used to index type 'addQuestionMarks; }>, undefined extends V ? never : "version">'.
-declarationEmitMappedTypePreservesTypeParameterConstraint.d.ts(34,210): error TS2536: Type 'k' cannot be used to index type '{ [k_1 in keyof o]-?: [k_1, o[k_1] & ({} | null)]; }[o extends readonly unknown[] ? keyof o & number : keyof o]'.
-
-
-==== declarationEmitMappedTypePreservesTypeParameterConstraint.d.ts (2 errors) ====
- declare type requiredKeys = {
- [k in keyof T]: undefined extends T[k] ? never : k;
- }[keyof T];
- declare type addQuestionMarks> = Pick, R> & Partial;
- declare type identity = T;
- declare type flatten = identity<{
- [k in keyof T]: T[k];
- }>;
- export declare abstract class ZodType