Skip to content

Commit c9e06dc

Browse files
TypeScript BotAndarist
TypeScript Bot
andauthored
Cherry-pick PR microsoft#50540 into release-4.8 (microsoft#50588)
Component commits: 00e3926 Defer distributing index over generic object types 2ba9ff1 Only check if the index type should be deferred for intersection types 873dfea Add an additional test case Co-authored-by: Mateusz Burzyński <[email protected]>
1 parent 1f76a51 commit c9e06dc

4 files changed

+160
-1
lines changed

src/compiler/checker.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -15874,7 +15874,7 @@ namespace ts {
1587415874
// (T | U)[K] -> T[K] | U[K] (reading)
1587515875
// (T | U)[K] -> T[K] & U[K] (writing)
1587615876
// (T & U)[K] -> T[K] & U[K]
15877-
if (objectType.flags & TypeFlags.UnionOrIntersection) {
15877+
if (objectType.flags & TypeFlags.Union || objectType.flags & TypeFlags.Intersection && !shouldDeferIndexType(objectType)) {
1587815878
const types = map((objectType as UnionOrIntersectionType).types, t => getSimplifiedType(getIndexedAccessType(t, indexType), writing));
1587915879
return objectType.flags & TypeFlags.Intersection || writing ? getIntersectionType(types) : getUnionType(types);
1588015880
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
=== tests/cases/compiler/nonNullableWithNullableGenericIndexedAccessArg.ts ===
2+
// repro from #50539
3+
4+
interface StateSchema {
5+
>StateSchema : Symbol(StateSchema, Decl(nonNullableWithNullableGenericIndexedAccessArg.ts, 0, 0))
6+
7+
states?: {
8+
>states : Symbol(StateSchema.states, Decl(nonNullableWithNullableGenericIndexedAccessArg.ts, 2, 23))
9+
10+
[key: string]: StateSchema;
11+
>key : Symbol(key, Decl(nonNullableWithNullableGenericIndexedAccessArg.ts, 4, 5))
12+
>StateSchema : Symbol(StateSchema, Decl(nonNullableWithNullableGenericIndexedAccessArg.ts, 0, 0))
13+
14+
};
15+
}
16+
17+
declare class StateNode<TStateSchema extends StateSchema> {
18+
>StateNode : Symbol(StateNode, Decl(nonNullableWithNullableGenericIndexedAccessArg.ts, 6, 1))
19+
>TStateSchema : Symbol(TStateSchema, Decl(nonNullableWithNullableGenericIndexedAccessArg.ts, 8, 24))
20+
>StateSchema : Symbol(StateSchema, Decl(nonNullableWithNullableGenericIndexedAccessArg.ts, 0, 0))
21+
22+
schema: TStateSchema;
23+
>schema : Symbol(StateNode.schema, Decl(nonNullableWithNullableGenericIndexedAccessArg.ts, 8, 59))
24+
>TStateSchema : Symbol(TStateSchema, Decl(nonNullableWithNullableGenericIndexedAccessArg.ts, 8, 24))
25+
}
26+
27+
type StateNodesConfig<TStateSchema extends StateSchema> = {
28+
>StateNodesConfig : Symbol(StateNodesConfig, Decl(nonNullableWithNullableGenericIndexedAccessArg.ts, 10, 1))
29+
>TStateSchema : Symbol(TStateSchema, Decl(nonNullableWithNullableGenericIndexedAccessArg.ts, 12, 22))
30+
>StateSchema : Symbol(StateSchema, Decl(nonNullableWithNullableGenericIndexedAccessArg.ts, 0, 0))
31+
32+
[K in keyof TStateSchema["states"]]: StateNode<NonNullable<TStateSchema["states"]>[K]>;
33+
>K : Symbol(K, Decl(nonNullableWithNullableGenericIndexedAccessArg.ts, 13, 3))
34+
>TStateSchema : Symbol(TStateSchema, Decl(nonNullableWithNullableGenericIndexedAccessArg.ts, 12, 22))
35+
>StateNode : Symbol(StateNode, Decl(nonNullableWithNullableGenericIndexedAccessArg.ts, 6, 1))
36+
>NonNullable : Symbol(NonNullable, Decl(lib.es5.d.ts, --, --))
37+
>TStateSchema : Symbol(TStateSchema, Decl(nonNullableWithNullableGenericIndexedAccessArg.ts, 12, 22))
38+
>K : Symbol(K, Decl(nonNullableWithNullableGenericIndexedAccessArg.ts, 13, 3))
39+
40+
};
41+
42+
// repro from #50539#issuecomment-1234067835
43+
44+
type Ordering<TOrderBy extends string> = {
45+
>Ordering : Symbol(Ordering, Decl(nonNullableWithNullableGenericIndexedAccessArg.ts, 14, 2))
46+
>TOrderBy : Symbol(TOrderBy, Decl(nonNullableWithNullableGenericIndexedAccessArg.ts, 18, 14))
47+
48+
orderBy: TOrderBy
49+
>orderBy : Symbol(orderBy, Decl(nonNullableWithNullableGenericIndexedAccessArg.ts, 18, 42))
50+
>TOrderBy : Symbol(TOrderBy, Decl(nonNullableWithNullableGenericIndexedAccessArg.ts, 18, 14))
51+
}
52+
53+
type Query<TOrderBy extends string> = {
54+
>Query : Symbol(Query, Decl(nonNullableWithNullableGenericIndexedAccessArg.ts, 20, 1))
55+
>TOrderBy : Symbol(TOrderBy, Decl(nonNullableWithNullableGenericIndexedAccessArg.ts, 22, 11))
56+
57+
order?: Ordering<TOrderBy>
58+
>order : Symbol(order, Decl(nonNullableWithNullableGenericIndexedAccessArg.ts, 22, 39))
59+
>Ordering : Symbol(Ordering, Decl(nonNullableWithNullableGenericIndexedAccessArg.ts, 14, 2))
60+
>TOrderBy : Symbol(TOrderBy, Decl(nonNullableWithNullableGenericIndexedAccessArg.ts, 22, 11))
61+
}
62+
63+
type QueryHandler<
64+
>QueryHandler : Symbol(QueryHandler, Decl(nonNullableWithNullableGenericIndexedAccessArg.ts, 24, 1))
65+
66+
TQuery extends Query<TOrderBy>,
67+
>TQuery : Symbol(TQuery, Decl(nonNullableWithNullableGenericIndexedAccessArg.ts, 26, 18))
68+
>Query : Symbol(Query, Decl(nonNullableWithNullableGenericIndexedAccessArg.ts, 20, 1))
69+
>TOrderBy : Symbol(TOrderBy, Decl(nonNullableWithNullableGenericIndexedAccessArg.ts, 27, 35))
70+
71+
TOrderBy extends string = NonNullable<TQuery["order"]>["orderBy"]
72+
>TOrderBy : Symbol(TOrderBy, Decl(nonNullableWithNullableGenericIndexedAccessArg.ts, 27, 35))
73+
>NonNullable : Symbol(NonNullable, Decl(lib.es5.d.ts, --, --))
74+
>TQuery : Symbol(TQuery, Decl(nonNullableWithNullableGenericIndexedAccessArg.ts, 26, 18))
75+
76+
> = {}
77+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
=== tests/cases/compiler/nonNullableWithNullableGenericIndexedAccessArg.ts ===
2+
// repro from #50539
3+
4+
interface StateSchema {
5+
states?: {
6+
>states : { [key: string]: StateSchema; } | undefined
7+
8+
[key: string]: StateSchema;
9+
>key : string
10+
11+
};
12+
}
13+
14+
declare class StateNode<TStateSchema extends StateSchema> {
15+
>StateNode : StateNode<TStateSchema>
16+
17+
schema: TStateSchema;
18+
>schema : TStateSchema
19+
}
20+
21+
type StateNodesConfig<TStateSchema extends StateSchema> = {
22+
>StateNodesConfig : StateNodesConfig<TStateSchema>
23+
24+
[K in keyof TStateSchema["states"]]: StateNode<NonNullable<TStateSchema["states"]>[K]>;
25+
};
26+
27+
// repro from #50539#issuecomment-1234067835
28+
29+
type Ordering<TOrderBy extends string> = {
30+
>Ordering : Ordering<TOrderBy>
31+
32+
orderBy: TOrderBy
33+
>orderBy : TOrderBy
34+
}
35+
36+
type Query<TOrderBy extends string> = {
37+
>Query : Query<TOrderBy>
38+
39+
order?: Ordering<TOrderBy>
40+
>order : Ordering<TOrderBy> | undefined
41+
}
42+
43+
type QueryHandler<
44+
>QueryHandler : QueryHandler<TQuery, TOrderBy>
45+
46+
TQuery extends Query<TOrderBy>,
47+
TOrderBy extends string = NonNullable<TQuery["order"]>["orderBy"]
48+
> = {}
49+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
// @noEmit: true
2+
// @strict: true
3+
4+
// repro from #50539
5+
6+
interface StateSchema {
7+
states?: {
8+
[key: string]: StateSchema;
9+
};
10+
}
11+
12+
declare class StateNode<TStateSchema extends StateSchema> {
13+
schema: TStateSchema;
14+
}
15+
16+
type StateNodesConfig<TStateSchema extends StateSchema> = {
17+
[K in keyof TStateSchema["states"]]: StateNode<NonNullable<TStateSchema["states"]>[K]>;
18+
};
19+
20+
// repro from #50539#issuecomment-1234067835
21+
22+
type Ordering<TOrderBy extends string> = {
23+
orderBy: TOrderBy
24+
}
25+
26+
type Query<TOrderBy extends string> = {
27+
order?: Ordering<TOrderBy>
28+
}
29+
30+
type QueryHandler<
31+
TQuery extends Query<TOrderBy>,
32+
TOrderBy extends string = NonNullable<TQuery["order"]>["orderBy"]
33+
> = {}

0 commit comments

Comments
 (0)