Skip to content

Commit 3ba3ace

Browse files
authored
Remove incorrect handling of intersections in getStringMappingType (#53383)
1 parent 8814f6d commit 3ba3ace

6 files changed

+141
-3
lines changed

src/compiler/checker.ts

-1
Original file line numberDiff line numberDiff line change
@@ -17118,7 +17118,6 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
1711817118

1711917119
function getStringMappingType(symbol: Symbol, type: Type): Type {
1712017120
return type.flags & (TypeFlags.Union | TypeFlags.Never) ? mapType(type, t => getStringMappingType(symbol, t)) :
17121-
type.flags & TypeFlags.Intersection ? getIntersectionType(map((type as IntersectionType).types, t => getStringMappingType(symbol, t))) :
1712217121
type.flags & TypeFlags.StringLiteral ? getStringLiteralType(applyStringMapping(symbol, (type as StringLiteralType).value)) :
1712317122
type.flags & TypeFlags.TemplateLiteral ? getTemplateLiteralType(...applyTemplateStringMapping(symbol, (type as TemplateLiteralType).texts, (type as TemplateLiteralType).types)) :
1712417123
// Mapping<Mapping<T>> === Mapping<T>

tests/baselines/reference/templateLiteralIntersection3.types

+2-2
Original file line numberDiff line numberDiff line change
@@ -29,12 +29,12 @@ options1[`foo/${path}`] = false;
2929

3030
// Lowercase<`foo/${Path}`> => `foo/${Lowercase<Path>}`
3131
declare const lowercasePath: Lowercase<`foo/${Path}`>;
32-
>lowercasePath : `foo/${Lowercase<string> & { _pathBrand: any; }}`
32+
>lowercasePath : `foo/${Lowercase<`${Path}`>}`
3333

3434
options1[lowercasePath] = false;
3535
>options1[lowercasePath] = false : false
3636
>options1[lowercasePath] : boolean
3737
>options1 : { prop: number; } & { [k: string]: boolean; }
38-
>lowercasePath : `foo/${Lowercase<string> & { _pathBrand: any; }}`
38+
>lowercasePath : `foo/${Lowercase<`${Path}`>}`
3939
>false : false
4040

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
//// [templateLiteralIntersection4.ts]
2+
type StateHook<S> = () => [S, unknown];
3+
4+
type StoreUtils<Store extends { [K: string]: any }> = Omit<{
5+
[K in keyof Store as `use${Capitalize<string & K>}`]: StateHook<Store[K]>
6+
}, 'useStore'> & {
7+
Provider: unknown,
8+
useStore: StateHook<Store>
9+
};
10+
11+
declare function createStore<Store extends { [K: string]: any }>(store: Store): StoreUtils<Store>;
12+
13+
const { Provider, useUsername, useAge, useStore } = createStore({
14+
username: "Aral",
15+
age: 31
16+
});
17+
18+
19+
//// [templateLiteralIntersection4.js]
20+
"use strict";
21+
var _a = createStore({
22+
username: "Aral",
23+
age: 31
24+
}), Provider = _a.Provider, useUsername = _a.useUsername, useAge = _a.useAge, useStore = _a.useStore;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
=== tests/cases/compiler/templateLiteralIntersection4.ts ===
2+
type StateHook<S> = () => [S, unknown];
3+
>StateHook : Symbol(StateHook, Decl(templateLiteralIntersection4.ts, 0, 0))
4+
>S : Symbol(S, Decl(templateLiteralIntersection4.ts, 0, 15))
5+
>S : Symbol(S, Decl(templateLiteralIntersection4.ts, 0, 15))
6+
7+
type StoreUtils<Store extends { [K: string]: any }> = Omit<{
8+
>StoreUtils : Symbol(StoreUtils, Decl(templateLiteralIntersection4.ts, 0, 39))
9+
>Store : Symbol(Store, Decl(templateLiteralIntersection4.ts, 2, 16))
10+
>K : Symbol(K, Decl(templateLiteralIntersection4.ts, 2, 33))
11+
>Omit : Symbol(Omit, Decl(lib.es5.d.ts, --, --))
12+
13+
[K in keyof Store as `use${Capitalize<string & K>}`]: StateHook<Store[K]>
14+
>K : Symbol(K, Decl(templateLiteralIntersection4.ts, 3, 5))
15+
>Store : Symbol(Store, Decl(templateLiteralIntersection4.ts, 2, 16))
16+
>Capitalize : Symbol(Capitalize, Decl(lib.es5.d.ts, --, --))
17+
>K : Symbol(K, Decl(templateLiteralIntersection4.ts, 3, 5))
18+
>StateHook : Symbol(StateHook, Decl(templateLiteralIntersection4.ts, 0, 0))
19+
>Store : Symbol(Store, Decl(templateLiteralIntersection4.ts, 2, 16))
20+
>K : Symbol(K, Decl(templateLiteralIntersection4.ts, 3, 5))
21+
22+
}, 'useStore'> & {
23+
Provider: unknown,
24+
>Provider : Symbol(Provider, Decl(templateLiteralIntersection4.ts, 4, 18))
25+
26+
useStore: StateHook<Store>
27+
>useStore : Symbol(useStore, Decl(templateLiteralIntersection4.ts, 5, 20))
28+
>StateHook : Symbol(StateHook, Decl(templateLiteralIntersection4.ts, 0, 0))
29+
>Store : Symbol(Store, Decl(templateLiteralIntersection4.ts, 2, 16))
30+
31+
};
32+
33+
declare function createStore<Store extends { [K: string]: any }>(store: Store): StoreUtils<Store>;
34+
>createStore : Symbol(createStore, Decl(templateLiteralIntersection4.ts, 7, 2))
35+
>Store : Symbol(Store, Decl(templateLiteralIntersection4.ts, 9, 29))
36+
>K : Symbol(K, Decl(templateLiteralIntersection4.ts, 9, 46))
37+
>store : Symbol(store, Decl(templateLiteralIntersection4.ts, 9, 65))
38+
>Store : Symbol(Store, Decl(templateLiteralIntersection4.ts, 9, 29))
39+
>StoreUtils : Symbol(StoreUtils, Decl(templateLiteralIntersection4.ts, 0, 39))
40+
>Store : Symbol(Store, Decl(templateLiteralIntersection4.ts, 9, 29))
41+
42+
const { Provider, useUsername, useAge, useStore } = createStore({
43+
>Provider : Symbol(Provider, Decl(templateLiteralIntersection4.ts, 11, 7))
44+
>useUsername : Symbol(useUsername, Decl(templateLiteralIntersection4.ts, 11, 17))
45+
>useAge : Symbol(useAge, Decl(templateLiteralIntersection4.ts, 11, 30))
46+
>useStore : Symbol(useStore, Decl(templateLiteralIntersection4.ts, 11, 38))
47+
>createStore : Symbol(createStore, Decl(templateLiteralIntersection4.ts, 7, 2))
48+
49+
username: "Aral",
50+
>username : Symbol(username, Decl(templateLiteralIntersection4.ts, 11, 65))
51+
52+
age: 31
53+
>age : Symbol(age, Decl(templateLiteralIntersection4.ts, 12, 19))
54+
55+
});
56+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
=== tests/cases/compiler/templateLiteralIntersection4.ts ===
2+
type StateHook<S> = () => [S, unknown];
3+
>StateHook : StateHook<S>
4+
5+
type StoreUtils<Store extends { [K: string]: any }> = Omit<{
6+
>StoreUtils : StoreUtils<Store>
7+
>K : string
8+
9+
[K in keyof Store as `use${Capitalize<string & K>}`]: StateHook<Store[K]>
10+
}, 'useStore'> & {
11+
Provider: unknown,
12+
>Provider : unknown
13+
14+
useStore: StateHook<Store>
15+
>useStore : StateHook<Store>
16+
17+
};
18+
19+
declare function createStore<Store extends { [K: string]: any }>(store: Store): StoreUtils<Store>;
20+
>createStore : <Store extends { [K: string]: any; }>(store: Store) => StoreUtils<Store>
21+
>K : string
22+
>store : Store
23+
24+
const { Provider, useUsername, useAge, useStore } = createStore({
25+
>Provider : unknown
26+
>useUsername : StateHook<string>
27+
>useAge : StateHook<number>
28+
>useStore : StateHook<{ username: string; age: number; }>
29+
>createStore({ username: "Aral", age: 31}) : StoreUtils<{ username: string; age: number; }>
30+
>createStore : <Store extends { [K: string]: any; }>(store: Store) => StoreUtils<Store>
31+
>{ username: "Aral", age: 31} : { username: string; age: number; }
32+
33+
username: "Aral",
34+
>username : string
35+
>"Aral" : "Aral"
36+
37+
age: 31
38+
>age : number
39+
>31 : 31
40+
41+
});
42+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
// @strict: true
2+
3+
type StateHook<S> = () => [S, unknown];
4+
5+
type StoreUtils<Store extends { [K: string]: any }> = Omit<{
6+
[K in keyof Store as `use${Capitalize<string & K>}`]: StateHook<Store[K]>
7+
}, 'useStore'> & {
8+
Provider: unknown,
9+
useStore: StateHook<Store>
10+
};
11+
12+
declare function createStore<Store extends { [K: string]: any }>(store: Store): StoreUtils<Store>;
13+
14+
const { Provider, useUsername, useAge, useStore } = createStore({
15+
username: "Aral",
16+
age: 31
17+
});

0 commit comments

Comments
 (0)