Skip to content

Commit 7299bce

Browse files
ajafffweswigham
authored andcommitted
infer number index signature in JS object literals (#26221)
Fixes: #26208
1 parent 1634320 commit 7299bce

File tree

5 files changed

+121
-1
lines changed

5 files changed

+121
-1
lines changed

src/compiler/checker.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16836,7 +16836,7 @@ namespace ts {
1683616836

1683716837
function createObjectLiteralType() {
1683816838
const stringIndexInfo = hasComputedStringProperty ? getObjectLiteralIndexInfo(node.properties, offset, propertiesArray, IndexKind.String) : undefined;
16839-
const numberIndexInfo = hasComputedNumberProperty && !isJSObjectLiteral ? getObjectLiteralIndexInfo(node.properties, offset, propertiesArray, IndexKind.Number) : undefined;
16839+
const numberIndexInfo = hasComputedNumberProperty ? getObjectLiteralIndexInfo(node.properties, offset, propertiesArray, IndexKind.Number) : undefined;
1684016840
const result = createAnonymousType(node.symbol, propertiesTable, emptyArray, emptyArray, stringIndexInfo, numberIndexInfo);
1684116841
const freshObjectLiteralFlag = compilerOptions.suppressExcessPropertyErrors ? 0 : TypeFlags.FreshLiteral;
1684216842
result.flags |= TypeFlags.ContainsObjectLiteral | freshObjectLiteralFlag | (typeFlags & TypeFlags.PropagatingFlags);
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
//// [file.js]
2+
// @ts-check
3+
4+
let n = Math.random();
5+
let s = `${n}`;
6+
7+
const numericIndex = { [n]: 1 };
8+
numericIndex[n].toFixed();
9+
10+
const stringIndex = { [s]: 1 };
11+
stringIndex[s].toFixed();
12+
13+
14+
15+
//// [file.js]
16+
// @ts-check
17+
var _a, _b;
18+
var n = Math.random();
19+
var s = "" + n;
20+
var numericIndex = (_a = {}, _a[n] = 1, _a);
21+
numericIndex[n].toFixed();
22+
var stringIndex = (_b = {}, _b[s] = 1, _b);
23+
stringIndex[s].toFixed();
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
=== tests/cases/compiler/file.js ===
2+
// @ts-check
3+
4+
let n = Math.random();
5+
>n : Symbol(n, Decl(file.js, 2, 3))
6+
>Math.random : Symbol(Math.random, Decl(lib.es5.d.ts, --, --))
7+
>Math : Symbol(Math, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --))
8+
>random : Symbol(Math.random, Decl(lib.es5.d.ts, --, --))
9+
10+
let s = `${n}`;
11+
>s : Symbol(s, Decl(file.js, 3, 3))
12+
>n : Symbol(n, Decl(file.js, 2, 3))
13+
14+
const numericIndex = { [n]: 1 };
15+
>numericIndex : Symbol(numericIndex, Decl(file.js, 5, 5))
16+
>[n] : Symbol([n], Decl(file.js, 5, 22))
17+
>n : Symbol(n, Decl(file.js, 2, 3))
18+
19+
numericIndex[n].toFixed();
20+
>numericIndex[n].toFixed : Symbol(Number.toFixed, Decl(lib.es5.d.ts, --, --))
21+
>numericIndex : Symbol(numericIndex, Decl(file.js, 5, 5))
22+
>n : Symbol(n, Decl(file.js, 2, 3))
23+
>toFixed : Symbol(Number.toFixed, Decl(lib.es5.d.ts, --, --))
24+
25+
const stringIndex = { [s]: 1 };
26+
>stringIndex : Symbol(stringIndex, Decl(file.js, 8, 5))
27+
>[s] : Symbol([s], Decl(file.js, 8, 21))
28+
>s : Symbol(s, Decl(file.js, 3, 3))
29+
30+
stringIndex[s].toFixed();
31+
>stringIndex[s].toFixed : Symbol(Number.toFixed, Decl(lib.es5.d.ts, --, --))
32+
>stringIndex : Symbol(stringIndex, Decl(file.js, 8, 5))
33+
>s : Symbol(s, Decl(file.js, 3, 3))
34+
>toFixed : Symbol(Number.toFixed, Decl(lib.es5.d.ts, --, --))
35+
36+
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
=== tests/cases/compiler/file.js ===
2+
// @ts-check
3+
4+
let n = Math.random();
5+
>n : number
6+
>Math.random() : number
7+
>Math.random : () => number
8+
>Math : Math
9+
>random : () => number
10+
11+
let s = `${n}`;
12+
>s : string
13+
>`${n}` : string
14+
>n : number
15+
16+
const numericIndex = { [n]: 1 };
17+
>numericIndex : { [x: number]: number; }
18+
>{ [n]: 1 } : { [x: number]: number; }
19+
>[n] : number
20+
>n : number
21+
>1 : 1
22+
23+
numericIndex[n].toFixed();
24+
>numericIndex[n].toFixed() : string
25+
>numericIndex[n].toFixed : (fractionDigits?: number) => string
26+
>numericIndex[n] : number
27+
>numericIndex : { [x: number]: number; }
28+
>n : number
29+
>toFixed : (fractionDigits?: number) => string
30+
31+
const stringIndex = { [s]: 1 };
32+
>stringIndex : { [x: string]: number; }
33+
>{ [s]: 1 } : { [x: string]: number; }
34+
>[s] : number
35+
>s : string
36+
>1 : 1
37+
38+
stringIndex[s].toFixed();
39+
>stringIndex[s].toFixed() : string
40+
>stringIndex[s].toFixed : (fractionDigits?: number) => string
41+
>stringIndex[s] : number
42+
>stringIndex : { [x: string]: number; }
43+
>s : string
44+
>toFixed : (fractionDigits?: number) => string
45+
46+
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
// @allowJs: true
2+
// @noImplicitAny: true
3+
// @outDir: ./out
4+
// @filename: file.js
5+
// @ts-check
6+
7+
let n = Math.random();
8+
let s = `${n}`;
9+
10+
const numericIndex = { [n]: 1 };
11+
numericIndex[n].toFixed();
12+
13+
const stringIndex = { [s]: 1 };
14+
stringIndex[s].toFixed();
15+

0 commit comments

Comments
 (0)