Skip to content

Commit df695d9

Browse files
committed
Remove reportErrors check in relateVariances
1 parent cd23992 commit df695d9

File tree

5 files changed

+245
-1
lines changed

5 files changed

+245
-1
lines changed

src/compiler/checker.ts

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2206,6 +2206,17 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
22062206
var identityRelation = new Map<string, RelationComparisonResult>();
22072207
var enumRelation = new Map<string, RelationComparisonResult>();
22082208

2209+
// function relationName(relation: Map<string, RelationComparisonResult>): string {
2210+
// if (relation === subtypeRelation) return "subtype";
2211+
// if (relation === strictSubtypeRelation) return "strict subtype";
2212+
// if (relation === assignableRelation) return "assignable";
2213+
// if (relation === comparableRelation) return "comparable";
2214+
// if (relation === identityRelation) return "identity";
2215+
// if (relation === enumRelation) return "enum";
2216+
// Debug.fail("Unknown relation");
2217+
// }
2218+
// (globalThis as any).__relationName = relationName;
2219+
22092220
var builtinGlobals = createSymbolTable();
22102221
builtinGlobals.set(undefinedSymbol.escapedName, undefinedSymbol);
22112222

@@ -21286,6 +21297,11 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
2128621297
tracing?.pop();
2128721298
}
2128821299

21300+
// if (entry !== undefined) {
21301+
// // If the previous entry and the result disagree, then something has gone wrong.
21302+
// Debug.assert(!!(entry & RelationComparisonResult.Succeeded) === (result !== Ternary.False), "Cached relationship does not match recalculated result");
21303+
// }
21304+
2128921305
if (outofbandVarianceMarkerHandler) {
2129021306
outofbandVarianceMarkerHandler = originalHandler;
2129121307
}
@@ -21951,7 +21967,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
2195121967
// reveal the reason).
2195221968
// We can switch on `reportErrors` here, since varianceCheckFailed guarantees we return `False`,
2195321969
// we can return `False` early here to skip calculating the structural error message we don't need.
21954-
if (varianceCheckFailed && !(reportErrors && some(variances, v => (v & VarianceFlags.VarianceMask) === VarianceFlags.Invariant))) {
21970+
if (varianceCheckFailed && !(some(variances, v => (v & VarianceFlags.VarianceMask) === VarianceFlags.Invariant))) {
2195521971
return Ternary.False;
2195621972
}
2195721973
// We remember the original error information so we can restore it in case the structural
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
//// [tests/cases/compiler/issue55217.ts] ////
2+
3+
//// [types.ts]
4+
export type ProductName = 'a' | 'b'
5+
6+
export type SubproductNameForProductName<P extends ProductName> = P extends unknown
7+
? keyof EntitiesByProductName[P]
8+
: never
9+
10+
type EntitiesByProductName = {
11+
a: { a1: { value: 'a-a1' } }
12+
b: { b1: { value: 'b-b1' } }
13+
}
14+
15+
export type DiscriminatedUnion<
16+
P extends ProductName = ProductName,
17+
E extends SubproductNameForProductName<P> = SubproductNameForProductName<P>,
18+
> = P extends ProductName
19+
? E extends SubproductNameForProductName<P>
20+
// ? E extends unknown // With unknown, the exception doesn't happen.
21+
? EntitiesByProductName[P][E]
22+
: never
23+
: never
24+
25+
//// [app.ts]
26+
import { SubproductNameForProductName, DiscriminatedUnion, ProductName } from './types'
27+
28+
export const bug = <P extends ProductName>() => {
29+
const subproducts: DiscriminatedUnion<P, SubproductNameForProductName<P>>[] = []
30+
subproducts.map((_: DiscriminatedUnion) => null)
31+
}
32+
33+
34+
//// [types.js]
35+
"use strict";
36+
Object.defineProperty(exports, "__esModule", { value: true });
37+
//// [app.js]
38+
"use strict";
39+
Object.defineProperty(exports, "__esModule", { value: true });
40+
exports.bug = void 0;
41+
var bug = function () {
42+
var subproducts = [];
43+
subproducts.map(function (_) { return null; });
44+
};
45+
exports.bug = bug;
Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
//// [tests/cases/compiler/issue55217.ts] ////
2+
3+
=== types.ts ===
4+
export type ProductName = 'a' | 'b'
5+
>ProductName : Symbol(ProductName, Decl(types.ts, 0, 0))
6+
7+
export type SubproductNameForProductName<P extends ProductName> = P extends unknown
8+
>SubproductNameForProductName : Symbol(SubproductNameForProductName, Decl(types.ts, 0, 35))
9+
>P : Symbol(P, Decl(types.ts, 2, 41))
10+
>ProductName : Symbol(ProductName, Decl(types.ts, 0, 0))
11+
>P : Symbol(P, Decl(types.ts, 2, 41))
12+
13+
? keyof EntitiesByProductName[P]
14+
>EntitiesByProductName : Symbol(EntitiesByProductName, Decl(types.ts, 4, 9))
15+
>P : Symbol(P, Decl(types.ts, 2, 41))
16+
17+
: never
18+
19+
type EntitiesByProductName = {
20+
>EntitiesByProductName : Symbol(EntitiesByProductName, Decl(types.ts, 4, 9))
21+
22+
a: { a1: { value: 'a-a1' } }
23+
>a : Symbol(a, Decl(types.ts, 6, 30))
24+
>a1 : Symbol(a1, Decl(types.ts, 7, 6))
25+
>value : Symbol(value, Decl(types.ts, 7, 12))
26+
27+
b: { b1: { value: 'b-b1' } }
28+
>b : Symbol(b, Decl(types.ts, 7, 30))
29+
>b1 : Symbol(b1, Decl(types.ts, 8, 6))
30+
>value : Symbol(value, Decl(types.ts, 8, 12))
31+
}
32+
33+
export type DiscriminatedUnion<
34+
>DiscriminatedUnion : Symbol(DiscriminatedUnion, Decl(types.ts, 9, 1))
35+
36+
P extends ProductName = ProductName,
37+
>P : Symbol(P, Decl(types.ts, 11, 31))
38+
>ProductName : Symbol(ProductName, Decl(types.ts, 0, 0))
39+
>ProductName : Symbol(ProductName, Decl(types.ts, 0, 0))
40+
41+
E extends SubproductNameForProductName<P> = SubproductNameForProductName<P>,
42+
>E : Symbol(E, Decl(types.ts, 12, 38))
43+
>SubproductNameForProductName : Symbol(SubproductNameForProductName, Decl(types.ts, 0, 35))
44+
>P : Symbol(P, Decl(types.ts, 11, 31))
45+
>SubproductNameForProductName : Symbol(SubproductNameForProductName, Decl(types.ts, 0, 35))
46+
>P : Symbol(P, Decl(types.ts, 11, 31))
47+
48+
> = P extends ProductName
49+
>P : Symbol(P, Decl(types.ts, 11, 31))
50+
>ProductName : Symbol(ProductName, Decl(types.ts, 0, 0))
51+
52+
? E extends SubproductNameForProductName<P>
53+
>E : Symbol(E, Decl(types.ts, 12, 38))
54+
>SubproductNameForProductName : Symbol(SubproductNameForProductName, Decl(types.ts, 0, 35))
55+
>P : Symbol(P, Decl(types.ts, 11, 31))
56+
57+
// ? E extends unknown // With unknown, the exception doesn't happen.
58+
? EntitiesByProductName[P][E]
59+
>EntitiesByProductName : Symbol(EntitiesByProductName, Decl(types.ts, 4, 9))
60+
>P : Symbol(P, Decl(types.ts, 11, 31))
61+
>E : Symbol(E, Decl(types.ts, 12, 38))
62+
63+
: never
64+
: never
65+
66+
=== app.ts ===
67+
import { SubproductNameForProductName, DiscriminatedUnion, ProductName } from './types'
68+
>SubproductNameForProductName : Symbol(SubproductNameForProductName, Decl(app.ts, 0, 8))
69+
>DiscriminatedUnion : Symbol(DiscriminatedUnion, Decl(app.ts, 0, 38))
70+
>ProductName : Symbol(ProductName, Decl(app.ts, 0, 58))
71+
72+
export const bug = <P extends ProductName>() => {
73+
>bug : Symbol(bug, Decl(app.ts, 2, 12))
74+
>P : Symbol(P, Decl(app.ts, 2, 20))
75+
>ProductName : Symbol(ProductName, Decl(app.ts, 0, 58))
76+
77+
const subproducts: DiscriminatedUnion<P, SubproductNameForProductName<P>>[] = []
78+
>subproducts : Symbol(subproducts, Decl(app.ts, 3, 7))
79+
>DiscriminatedUnion : Symbol(DiscriminatedUnion, Decl(app.ts, 0, 38))
80+
>P : Symbol(P, Decl(app.ts, 2, 20))
81+
>SubproductNameForProductName : Symbol(SubproductNameForProductName, Decl(app.ts, 0, 8))
82+
>P : Symbol(P, Decl(app.ts, 2, 20))
83+
84+
subproducts.map((_: DiscriminatedUnion) => null)
85+
>subproducts.map : Symbol(Array.map, Decl(lib.es5.d.ts, --, --))
86+
>subproducts : Symbol(subproducts, Decl(app.ts, 3, 7))
87+
>map : Symbol(Array.map, Decl(lib.es5.d.ts, --, --))
88+
>_ : Symbol(_, Decl(app.ts, 4, 19))
89+
>DiscriminatedUnion : Symbol(DiscriminatedUnion, Decl(app.ts, 0, 38))
90+
}
91+
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
//// [tests/cases/compiler/issue55217.ts] ////
2+
3+
=== types.ts ===
4+
export type ProductName = 'a' | 'b'
5+
>ProductName : "a" | "b"
6+
7+
export type SubproductNameForProductName<P extends ProductName> = P extends unknown
8+
>SubproductNameForProductName : SubproductNameForProductName<P>
9+
10+
? keyof EntitiesByProductName[P]
11+
: never
12+
13+
type EntitiesByProductName = {
14+
>EntitiesByProductName : { a: { a1: { value: 'a-a1'; };}; b: { b1: { value: 'b-b1'; };}; }
15+
16+
a: { a1: { value: 'a-a1' } }
17+
>a : { a1: { value: 'a-a1';}; }
18+
>a1 : { value: 'a-a1'; }
19+
>value : "a-a1"
20+
21+
b: { b1: { value: 'b-b1' } }
22+
>b : { b1: { value: 'b-b1';}; }
23+
>b1 : { value: 'b-b1'; }
24+
>value : "b-b1"
25+
}
26+
27+
export type DiscriminatedUnion<
28+
>DiscriminatedUnion : DiscriminatedUnion<P, E>
29+
30+
P extends ProductName = ProductName,
31+
E extends SubproductNameForProductName<P> = SubproductNameForProductName<P>,
32+
> = P extends ProductName
33+
? E extends SubproductNameForProductName<P>
34+
// ? E extends unknown // With unknown, the exception doesn't happen.
35+
? EntitiesByProductName[P][E]
36+
: never
37+
: never
38+
39+
=== app.ts ===
40+
import { SubproductNameForProductName, DiscriminatedUnion, ProductName } from './types'
41+
>SubproductNameForProductName : any
42+
>DiscriminatedUnion : any
43+
>ProductName : any
44+
45+
export const bug = <P extends ProductName>() => {
46+
>bug : <P extends ProductName>() => void
47+
><P extends ProductName>() => { const subproducts: DiscriminatedUnion<P, SubproductNameForProductName<P>>[] = [] subproducts.map((_: DiscriminatedUnion) => null)} : <P extends ProductName>() => void
48+
49+
const subproducts: DiscriminatedUnion<P, SubproductNameForProductName<P>>[] = []
50+
>subproducts : DiscriminatedUnion<P, SubproductNameForProductName<P>>[]
51+
>[] : never[]
52+
53+
subproducts.map((_: DiscriminatedUnion) => null)
54+
>subproducts.map((_: DiscriminatedUnion) => null) : null[]
55+
>subproducts.map : <U>(callbackfn: (value: DiscriminatedUnion<P, SubproductNameForProductName<P>>, index: number, array: DiscriminatedUnion<P, SubproductNameForProductName<P>>[]) => U, thisArg?: any) => U[]
56+
>subproducts : DiscriminatedUnion<P, SubproductNameForProductName<P>>[]
57+
>map : <U>(callbackfn: (value: DiscriminatedUnion<P, SubproductNameForProductName<P>>, index: number, array: DiscriminatedUnion<P, SubproductNameForProductName<P>>[]) => U, thisArg?: any) => U[]
58+
>(_: DiscriminatedUnion) => null : (_: DiscriminatedUnion) => null
59+
>_ : DiscriminatedUnion
60+
}
61+

tests/cases/compiler/issue55217.ts

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
// @strict: true
2+
3+
// @filename: types.ts
4+
export type ProductName = 'a' | 'b'
5+
6+
export type SubproductNameForProductName<P extends ProductName> = P extends unknown
7+
? keyof EntitiesByProductName[P]
8+
: never
9+
10+
type EntitiesByProductName = {
11+
a: { a1: { value: 'a-a1' } }
12+
b: { b1: { value: 'b-b1' } }
13+
}
14+
15+
export type DiscriminatedUnion<
16+
P extends ProductName = ProductName,
17+
E extends SubproductNameForProductName<P> = SubproductNameForProductName<P>,
18+
> = P extends ProductName
19+
? E extends SubproductNameForProductName<P>
20+
// ? E extends unknown // With unknown, the exception doesn't happen.
21+
? EntitiesByProductName[P][E]
22+
: never
23+
: never
24+
25+
// @filename: app.ts
26+
import { SubproductNameForProductName, DiscriminatedUnion, ProductName } from './types'
27+
28+
export const bug = <P extends ProductName>() => {
29+
const subproducts: DiscriminatedUnion<P, SubproductNameForProductName<P>>[] = []
30+
subproducts.map((_: DiscriminatedUnion) => null)
31+
}

0 commit comments

Comments
 (0)