Skip to content

Commit 87d88e2

Browse files
authored
Handle resolving and unknown symbols in getLiteralTypeFromPropertyName (#22406)
1 parent 17b10dc commit 87d88e2

6 files changed

+96
-1
lines changed

src/compiler/checker.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8026,7 +8026,7 @@ namespace ts {
80268026
function getLiteralTypeFromPropertyName(prop: Symbol) {
80278027
const links = getSymbolLinks(getLateBoundSymbol(prop));
80288028
if (!links.nameType) {
8029-
if (links.target) {
8029+
if (links.target && links.target !== unknownSymbol && links.target !== resolvingSymbol) {
80308030
Debug.assert(links.target.escapedName === prop.escapedName || links.target.escapedName === InternalSymbolName.Computed, "Target symbol and symbol do not have the same name");
80318031
links.nameType = getLiteralTypeFromPropertyName(links.target);
80328032
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
/a.ts(1,20): error TS2307: Cannot find module 'something'.
2+
/b.ts(3,6): error TS2345: Argument of type '""' is not assignable to parameter of type '"x"'.
3+
4+
5+
==== /b.ts (1 errors) ====
6+
import a = require('./a');
7+
declare function f<T>(obj: T, key: keyof T): void;
8+
f(a, "");
9+
~~
10+
!!! error TS2345: Argument of type '""' is not assignable to parameter of type '"x"'.
11+
12+
==== /a.ts (1 errors) ====
13+
import x = require("something");
14+
~~~~~~~~~~~
15+
!!! error TS2307: Cannot find module 'something'.
16+
export { x };
17+
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
//// [tests/cases/compiler/literalTypeNameAssertionNotTriggered.ts] ////
2+
3+
//// [a.ts]
4+
import x = require("something");
5+
export { x };
6+
7+
//// [b.ts]
8+
import a = require('./a');
9+
declare function f<T>(obj: T, key: keyof T): void;
10+
f(a, "");
11+
12+
13+
//// [a.js]
14+
"use strict";
15+
exports.__esModule = true;
16+
var x = require("something");
17+
exports.x = x;
18+
//// [b.js]
19+
"use strict";
20+
exports.__esModule = true;
21+
var a = require("./a");
22+
f(a, "");
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
=== /b.ts ===
2+
import a = require('./a');
3+
>a : Symbol(a, Decl(b.ts, 0, 0))
4+
5+
declare function f<T>(obj: T, key: keyof T): void;
6+
>f : Symbol(f, Decl(b.ts, 0, 26))
7+
>T : Symbol(T, Decl(b.ts, 1, 19))
8+
>obj : Symbol(obj, Decl(b.ts, 1, 22))
9+
>T : Symbol(T, Decl(b.ts, 1, 19))
10+
>key : Symbol(key, Decl(b.ts, 1, 29))
11+
>T : Symbol(T, Decl(b.ts, 1, 19))
12+
13+
f(a, "");
14+
>f : Symbol(f, Decl(b.ts, 0, 26))
15+
>a : Symbol(a, Decl(b.ts, 0, 0))
16+
17+
=== /a.ts ===
18+
import x = require("something");
19+
>x : Symbol(x, Decl(a.ts, 0, 0))
20+
21+
export { x };
22+
>x : Symbol(x, Decl(a.ts, 1, 8))
23+
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
=== /b.ts ===
2+
import a = require('./a');
3+
>a : typeof a
4+
5+
declare function f<T>(obj: T, key: keyof T): void;
6+
>f : <T>(obj: T, key: keyof T) => void
7+
>T : T
8+
>obj : T
9+
>T : T
10+
>key : keyof T
11+
>T : T
12+
13+
f(a, "");
14+
>f(a, "") : any
15+
>f : <T>(obj: T, key: keyof T) => void
16+
>a : typeof a
17+
>"" : ""
18+
19+
=== /a.ts ===
20+
import x = require("something");
21+
>x : any
22+
23+
export { x };
24+
>x : any
25+
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
// @Filename: /a.ts
2+
import x = require("something");
3+
export { x };
4+
5+
// @Filename: /b.ts
6+
import a = require('./a');
7+
declare function f<T>(obj: T, key: keyof T): void;
8+
f(a, "");

0 commit comments

Comments
 (0)