Skip to content

Commit 9bb594b

Browse files
committed
Fix translation bug causing unknown infer-extends constraint to be emitted
1 parent 8cf32b4 commit 9bb594b

19 files changed

+75
-156
lines changed

internal/checker/nodebuilderimpl.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1440,7 +1440,7 @@ func (b *nodeBuilderImpl) createMappedTypeNodeFromType(t *Type) *ast.TypeNode {
14401440
originalConstraint := b.ch.instantiateType(rawConstraintTypeFromDeclaration, mapped.mapper)
14411441

14421442
var originalConstraintNode *ast.Node
1443-
if originalConstraint.flags&TypeFlagsUnknown != 0 {
1443+
if originalConstraint.flags&TypeFlagsUnknown == 0 {
14441444
originalConstraintNode = b.typeToTypeNode(originalConstraint)
14451445
}
14461446

testdata/baselines/reference/submodule/compiler/computedTypesKeyofNoIndexSignatureType.types

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
=== computedTypesKeyofNoIndexSignatureType.ts ===
44
type Compute<A> = { [K in keyof A]: Compute<A[K]>; } & {};
5-
>Compute : { [K in keyof A]: A[K_1] extends infer T extends unknown ? { [K in keyof T]: A[K_1][K_2] extends infer T extends unknown ? { [K in keyof T]: A[K_1][K_2][K_3] extends infer T extends unknown ? { [K in keyof T]: A[K_1][K_2][K_3][K_4] extends infer T extends unknown ? { [K in keyof T]: A[K_1][K_2][K_3][K_4][K_5] extends infer T extends unknown ? { [K in keyof T]: A[K_1][K_2][K_3][K_4][K_5][K_6] extends infer T extends unknown ? { [K in keyof T]: A[K_1][K_2][K_3][K_4][K_5][K_6][K_7] extends infer T extends unknown ? { [K in keyof T]: A[K_1][K_2][K_3][K_4][K_5][K_6][K_7][K_8] extends infer T extends unknown ? { [K in keyof T]: A[K_1][K_2][K_3][K_4][K_5][K_6][K_7][K_8][K_9] extends infer T extends unknown ? { [K in keyof T]: A[K_1][K_2][K_3][K_4][K_5][K_6][K_7][K_8][K_9][K_10] extends infer T extends unknown ? { [K in keyof T]: any; } : never; } : never; } : never; } : never; } : never; } : never; } : never; } : never; } : never; } : never; }
5+
>Compute : { [K in keyof A]: A[K_1] extends infer T ? { [K in keyof T]: A[K_1][K_2] extends infer T ? { [K in keyof T]: A[K_1][K_2][K_3] extends infer T ? { [K in keyof T]: A[K_1][K_2][K_3][K_4] extends infer T ? { [K in keyof T]: A[K_1][K_2][K_3][K_4][K_5] extends infer T ? { [K in keyof T]: A[K_1][K_2][K_3][K_4][K_5][K_6] extends infer T ? { [K in keyof T]: A[K_1][K_2][K_3][K_4][K_5][K_6][K_7] extends infer T ? { [K in keyof T]: A[K_1][K_2][K_3][K_4][K_5][K_6][K_7][K_8] extends infer T ? { [K in keyof T]: A[K_1][K_2][K_3][K_4][K_5][K_6][K_7][K_8][K_9] extends infer T ? { [K in keyof T]: A[K_1][K_2][K_3][K_4][K_5][K_6][K_7][K_8][K_9][K_10] extends infer T ? { [K in keyof T]: any; } : never; } : never; } : never; } : never; } : never; } : never; } : never; } : never; } : never; } : never; }
66

77
type EqualsTest<T> = <A>() => A extends T ? 1 : 0;
88
>EqualsTest : EqualsTest<T>

testdata/baselines/reference/submodule/compiler/computedTypesKeyofNoIndexSignatureType.types.diff

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
=== computedTypesKeyofNoIndexSignatureType.ts ===
66
type Compute<A> = { [K in keyof A]: Compute<A[K]>; } & {};
77
->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; }
8-
+>Compute : { [K in keyof A]: A[K_1] extends infer T extends unknown ? { [K in keyof T]: A[K_1][K_2] extends infer T extends unknown ? { [K in keyof T]: A[K_1][K_2][K_3] extends infer T extends unknown ? { [K in keyof T]: A[K_1][K_2][K_3][K_4] extends infer T extends unknown ? { [K in keyof T]: A[K_1][K_2][K_3][K_4][K_5] extends infer T extends unknown ? { [K in keyof T]: A[K_1][K_2][K_3][K_4][K_5][K_6] extends infer T extends unknown ? { [K in keyof T]: A[K_1][K_2][K_3][K_4][K_5][K_6][K_7] extends infer T extends unknown ? { [K in keyof T]: A[K_1][K_2][K_3][K_4][K_5][K_6][K_7][K_8] extends infer T extends unknown ? { [K in keyof T]: A[K_1][K_2][K_3][K_4][K_5][K_6][K_7][K_8][K_9] extends infer T extends unknown ? { [K in keyof T]: A[K_1][K_2][K_3][K_4][K_5][K_6][K_7][K_8][K_9][K_10] extends infer T extends unknown ? { [K in keyof T]: any; } : never; } : never; } : never; } : never; } : never; } : never; } : never; } : never; } : never; } : never; }
8+
+>Compute : { [K in keyof A]: A[K_1] extends infer T ? { [K in keyof T]: A[K_1][K_2] extends infer T ? { [K in keyof T]: A[K_1][K_2][K_3] extends infer T ? { [K in keyof T]: A[K_1][K_2][K_3][K_4] extends infer T ? { [K in keyof T]: A[K_1][K_2][K_3][K_4][K_5] extends infer T ? { [K in keyof T]: A[K_1][K_2][K_3][K_4][K_5][K_6] extends infer T ? { [K in keyof T]: A[K_1][K_2][K_3][K_4][K_5][K_6][K_7] extends infer T ? { [K in keyof T]: A[K_1][K_2][K_3][K_4][K_5][K_6][K_7][K_8] extends infer T ? { [K in keyof T]: A[K_1][K_2][K_3][K_4][K_5][K_6][K_7][K_8][K_9] extends infer T ? { [K in keyof T]: A[K_1][K_2][K_3][K_4][K_5][K_6][K_7][K_8][K_9][K_10] extends infer T ? { [K in keyof T]: any; } : never; } : never; } : never; } : never; } : never; } : never; } : never; } : never; } : never; } : never; }
99

1010
type EqualsTest<T> = <A>() => A extends T ? 1 : 0;
1111
>EqualsTest : EqualsTest<T>

testdata/baselines/reference/submodule/compiler/declarationEmitMappedTypeDistributivityPreservesConstraints.js

Lines changed: 6 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -50,50 +50,12 @@ export default _default;
5050
declare const _default: {
5151
test: {
5252
fn: <T extends {
53-
x: T["x"] extends infer T_1 ? { [K in keyof T_1]: T["x"][K]; } : never;
54-
}>(sliceIndex: T) => T["x"] extends infer T_1 ? { [K in keyof T_1]: Parameters<T["x"][K]>; } : never;
53+
x: T["x"] extends infer T_1 extends {
54+
[x: string]: (...params: unknown[]) => unknown;
55+
} ? { [K in keyof T_1]: T["x"][K]; } : never;
56+
}>(sliceIndex: T) => T["x"] extends infer T_1 extends {
57+
[x: string]: (...params: unknown[]) => unknown;
58+
} ? { [K in keyof T_1]: Parameters<T["x"][K]>; } : never;
5559
};
5660
};
5761
export default _default;
58-
59-
60-
//// [DtsFileErrors]
61-
62-
63-
reexport.d.ts(5,88): error TS2344: Type 'T["x"][K]' does not satisfy the constraint '(...args: any) => any'.
64-
Type 'T["x"][keyof T_1]' is not assignable to type '(...args: any) => any'.
65-
Type 'T["x"][string] | T["x"][number] | T["x"][symbol]' is not assignable to type '(...args: any) => any'.
66-
Type 'T["x"][string]' is not assignable to type '(...args: any) => any'.
67-
68-
69-
==== types.d.ts (0 errors) ====
70-
type Fns = Record<string, (...params: unknown[]) => unknown>;
71-
type Map<T extends Fns> = {
72-
[K in keyof T]: T[K];
73-
};
74-
type AllArg<T extends Fns> = {
75-
[K in keyof T]: Parameters<T[K]>;
76-
};
77-
declare function fn<T extends {
78-
x: Map<T['x']>;
79-
}>(sliceIndex: T): AllArg<T['x']>;
80-
declare const _default: {
81-
fn: typeof fn;
82-
};
83-
export default _default;
84-
85-
==== reexport.d.ts (1 errors) ====
86-
declare const _default: {
87-
test: {
88-
fn: <T extends {
89-
x: T["x"] extends infer T_1 ? { [K in keyof T_1]: T["x"][K]; } : never;
90-
}>(sliceIndex: T) => T["x"] extends infer T_1 ? { [K in keyof T_1]: Parameters<T["x"][K]>; } : never;
91-
~~~~~~~~~
92-
!!! error TS2344: Type 'T["x"][K]' does not satisfy the constraint '(...args: any) => any'.
93-
!!! error TS2344: Type 'T["x"][keyof T_1]' is not assignable to type '(...args: any) => any'.
94-
!!! error TS2344: Type 'T["x"][string] | T["x"][number] | T["x"][symbol]' is not assignable to type '(...args: any) => any'.
95-
!!! error TS2344: Type 'T["x"][string]' is not assignable to type '(...args: any) => any'.
96-
};
97-
};
98-
export default _default;
99-

testdata/baselines/reference/submodule/compiler/declarationEmitMappedTypeDistributivityPreservesConstraints.js.diff

Lines changed: 8 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -9,60 +9,17 @@
99
exports.default = { test: types_1.default };
1010

1111

12-
@@= skipped -23, +23 lines =@@
13-
declare const _default: {
14-
test: {
12+
@@= skipped -25, +25 lines =@@
1513
fn: <T extends {
16-
- x: T["x"] extends infer T_1 extends {
17-
- [x: string]: (...params: unknown[]) => unknown;
14+
x: T["x"] extends infer T_1 extends {
15+
[x: string]: (...params: unknown[]) => unknown;
1816
- } ? { [K in keyof T_1]: T_1[K]; } : never;
1917
- }>(sliceIndex: T) => T["x"] extends infer T_2 extends {
20-
- [x: string]: (...params: unknown[]) => unknown;
18+
+ } ? { [K in keyof T_1]: T["x"][K]; } : never;
19+
+ }>(sliceIndex: T) => T["x"] extends infer T_1 extends {
20+
[x: string]: (...params: unknown[]) => unknown;
2121
- } ? { [K_1 in keyof T_2]: Parameters<T_2[K_1]>; } : never;
22-
+ x: T["x"] extends infer T_1 ? { [K in keyof T_1]: T["x"][K]; } : never;
23-
+ }>(sliceIndex: T) => T["x"] extends infer T_1 ? { [K in keyof T_1]: Parameters<T["x"][K]>; } : never;
22+
+ } ? { [K in keyof T_1]: Parameters<T["x"][K]>; } : never;
2423
};
2524
};
26-
export default _default;
27-
+
28-
+
29-
+//// [DtsFileErrors]
30-
+
31-
+
32-
+reexport.d.ts(5,88): error TS2344: Type 'T["x"][K]' does not satisfy the constraint '(...args: any) => any'.
33-
+ Type 'T["x"][keyof T_1]' is not assignable to type '(...args: any) => any'.
34-
+ Type 'T["x"][string] | T["x"][number] | T["x"][symbol]' is not assignable to type '(...args: any) => any'.
35-
+ Type 'T["x"][string]' is not assignable to type '(...args: any) => any'.
36-
+
37-
+
38-
+==== types.d.ts (0 errors) ====
39-
+ type Fns = Record<string, (...params: unknown[]) => unknown>;
40-
+ type Map<T extends Fns> = {
41-
+ [K in keyof T]: T[K];
42-
+ };
43-
+ type AllArg<T extends Fns> = {
44-
+ [K in keyof T]: Parameters<T[K]>;
45-
+ };
46-
+ declare function fn<T extends {
47-
+ x: Map<T['x']>;
48-
+ }>(sliceIndex: T): AllArg<T['x']>;
49-
+ declare const _default: {
50-
+ fn: typeof fn;
51-
+ };
52-
+ export default _default;
53-
+
54-
+==== reexport.d.ts (1 errors) ====
55-
+ declare const _default: {
56-
+ test: {
57-
+ fn: <T extends {
58-
+ x: T["x"] extends infer T_1 ? { [K in keyof T_1]: T["x"][K]; } : never;
59-
+ }>(sliceIndex: T) => T["x"] extends infer T_1 ? { [K in keyof T_1]: Parameters<T["x"][K]>; } : never;
60-
+ ~~~~~~~~~
61-
+!!! error TS2344: Type 'T["x"][K]' does not satisfy the constraint '(...args: any) => any'.
62-
+!!! error TS2344: Type 'T["x"][keyof T_1]' is not assignable to type '(...args: any) => any'.
63-
+!!! error TS2344: Type 'T["x"][string] | T["x"][number] | T["x"][symbol]' is not assignable to type '(...args: any) => any'.
64-
+!!! error TS2344: Type 'T["x"][string]' is not assignable to type '(...args: any) => any'.
65-
+ };
66-
+ };
67-
+ export default _default;
68-
+
25+
export default _default;

testdata/baselines/reference/submodule/compiler/declarationEmitMappedTypeDistributivityPreservesConstraints.types

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,9 @@ export default { fn };
2626

2727
=== reexport.ts ===
2828
import test from "./types";
29-
>test : { fn: <T extends { x: T["x"] extends infer T_1 ? { [K in keyof T_1]: T["x"][K]; } : never; }>(sliceIndex: T) => T["x"] extends infer T_1 ? { [K in keyof T_1]: Parameters<T["x"][K]>; } : never; }
29+
>test : { fn: <T extends { x: T["x"] extends infer T_1 extends { [x: string]: (...params: unknown[]) => 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<T["x"][K]>; } : never; }
3030

3131
export default { test };
32-
>{ test } : { test: { fn: <T extends { x: T["x"] extends infer T_1 ? { [K in keyof T_1]: T["x"][K]; } : never; }>(sliceIndex: T) => T["x"] extends infer T_1 ? { [K in keyof T_1]: Parameters<T["x"][K]>; } : never; }; }
33-
>test : { fn: <T extends { x: T["x"] extends infer T_1 ? { [K in keyof T_1]: T["x"][K]; } : never; }>(sliceIndex: T) => T["x"] extends infer T_1 ? { [K in keyof T_1]: Parameters<T["x"][K]>; } : never; }
32+
>{ test } : { test: { fn: <T extends { x: T["x"] extends infer T_1 extends { [x: string]: (...params: unknown[]) => 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<T["x"][K]>; } : never; }; }
33+
>test : { fn: <T extends { x: T["x"] extends infer T_1 extends { [x: string]: (...params: unknown[]) => 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<T["x"][K]>; } : never; }
3434

testdata/baselines/reference/submodule/compiler/declarationEmitMappedTypeDistributivityPreservesConstraints.types.diff

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,10 @@
55
=== reexport.ts ===
66
import test from "./types";
77
->test : { fn: <T extends { x: T["x"] extends infer T_1 extends { [x: string]: (...params: unknown[]) => 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<T_2[K_1]>; } : never; }
8-
+>test : { fn: <T extends { x: T["x"] extends infer T_1 ? { [K in keyof T_1]: T["x"][K]; } : never; }>(sliceIndex: T) => T["x"] extends infer T_1 ? { [K in keyof T_1]: Parameters<T["x"][K]>; } : never; }
8+
+>test : { fn: <T extends { x: T["x"] extends infer T_1 extends { [x: string]: (...params: unknown[]) => 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<T["x"][K]>; } : never; }
99

1010
export default { test };
1111
->{ test } : { test: { fn: <T extends { x: T["x"] extends infer T_1 extends { [x: string]: (...params: unknown[]) => 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<T_2[K_1]>; } : never; }; }
1212
->test : { fn: <T extends { x: T["x"] extends infer T_1 extends { [x: string]: (...params: unknown[]) => 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<T_2[K_1]>; } : never; }
13-
+>{ test } : { test: { fn: <T extends { x: T["x"] extends infer T_1 ? { [K in keyof T_1]: T["x"][K]; } : never; }>(sliceIndex: T) => T["x"] extends infer T_1 ? { [K in keyof T_1]: Parameters<T["x"][K]>; } : never; }; }
14-
+>test : { fn: <T extends { x: T["x"] extends infer T_1 ? { [K in keyof T_1]: T["x"][K]; } : never; }>(sliceIndex: T) => T["x"] extends infer T_1 ? { [K in keyof T_1]: Parameters<T["x"][K]>; } : never; }
13+
+>{ test } : { test: { fn: <T extends { x: T["x"] extends infer T_1 extends { [x: string]: (...params: unknown[]) => 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<T["x"][K]>; } : never; }; }
14+
+>test : { fn: <T extends { x: T["x"] extends infer T_1 extends { [x: string]: (...params: unknown[]) => 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<T["x"][K]>; } : never; }

0 commit comments

Comments
 (0)