Skip to content

Commit 397ff84

Browse files
authored
Merge pull request #18317 from Microsoft/object-literal-enum-property-names
Object literals computed property names allow literal-typed expressions
2 parents 1b5a0ae + 3c5b2a5 commit 397ff84

15 files changed

+511
-23
lines changed

src/compiler/checker.ts

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13532,6 +13532,7 @@ namespace ts {
1353213532
for (let i = 0; i < node.properties.length; i++) {
1353313533
const memberDecl = node.properties[i];
1353413534
let member = memberDecl.symbol;
13535+
let literalName: __String | undefined;
1353513536
if (memberDecl.kind === SyntaxKind.PropertyAssignment ||
1353613537
memberDecl.kind === SyntaxKind.ShorthandPropertyAssignment ||
1353713538
isObjectLiteralMethod(memberDecl)) {
@@ -13542,6 +13543,12 @@ namespace ts {
1354213543

1354313544
let type: Type;
1354413545
if (memberDecl.kind === SyntaxKind.PropertyAssignment) {
13546+
if (memberDecl.name.kind === SyntaxKind.ComputedPropertyName) {
13547+
const t = checkComputedPropertyName(<ComputedPropertyName>memberDecl.name);
13548+
if (t.flags & TypeFlags.Literal) {
13549+
literalName = escapeLeadingUnderscores("" + (t as LiteralType).value);
13550+
}
13551+
}
1354513552
type = checkPropertyAssignment(<PropertyAssignment>memberDecl, checkMode);
1354613553
}
1354713554
else if (memberDecl.kind === SyntaxKind.MethodDeclaration) {
@@ -13558,7 +13565,7 @@ namespace ts {
1355813565
}
1355913566

1356013567
typeFlags |= type.flags;
13561-
const prop = createSymbol(SymbolFlags.Property | member.flags, member.escapedName);
13568+
const prop = createSymbol(SymbolFlags.Property | member.flags, literalName || member.escapedName);
1356213569
if (inDestructuringPattern) {
1356313570
// If object literal is an assignment pattern and if the assignment pattern specifies a default value
1356413571
// for the property, make the property optional.
@@ -13568,7 +13575,7 @@ namespace ts {
1356813575
if (isOptional) {
1356913576
prop.flags |= SymbolFlags.Optional;
1357013577
}
13571-
if (hasDynamicName(memberDecl)) {
13578+
if (!literalName && hasDynamicName(memberDecl)) {
1357213579
patternWithComputedProperties = true;
1357313580
}
1357413581
}
@@ -13626,7 +13633,7 @@ namespace ts {
1362613633
checkNodeDeferred(memberDecl);
1362713634
}
1362813635

13629-
if (hasDynamicName(memberDecl)) {
13636+
if (!literalName && hasDynamicName(memberDecl)) {
1363013637
if (isNumericName(memberDecl.name)) {
1363113638
hasComputedNumberProperty = true;
1363213639
}

tests/baselines/reference/computedPropertyNames46_ES5.types

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
=== tests/cases/conformance/es6/computedProperties/computedPropertyNames46_ES5.ts ===
22
var o = {
3-
>o : { [x: number]: number; }
4-
>{ ["" || 0]: 0} : { [x: number]: number; }
3+
>o : { ["" || 0]: number; }
4+
>{ ["" || 0]: 0} : { ["" || 0]: number; }
55

66
["" || 0]: 0
77
>"" || 0 : 0

tests/baselines/reference/computedPropertyNames46_ES6.types

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
=== tests/cases/conformance/es6/computedProperties/computedPropertyNames46_ES6.ts ===
22
var o = {
3-
>o : { [x: number]: number; }
4-
>{ ["" || 0]: 0} : { [x: number]: number; }
3+
>o : { ["" || 0]: number; }
4+
>{ ["" || 0]: 0} : { ["" || 0]: number; }
55

66
["" || 0]: 0
77
>"" || 0 : 0

tests/baselines/reference/computedPropertyNames47_ES5.types

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@ enum E2 { x }
88
>x : E2
99

1010
var o = {
11-
>o : { [x: number]: number; }
12-
>{ [E1.x || E2.x]: 0} : { [x: number]: number; }
11+
>o : { [E1.x || E2.x]: number; }
12+
>{ [E1.x || E2.x]: 0} : { [E1.x || E2.x]: number; }
1313

1414
[E1.x || E2.x]: 0
1515
>E1.x || E2.x : E2

tests/baselines/reference/computedPropertyNames47_ES6.types

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@ enum E2 { x }
88
>x : E2
99

1010
var o = {
11-
>o : { [x: number]: number; }
12-
>{ [E1.x || E2.x]: 0} : { [x: number]: number; }
11+
>o : { [E1.x || E2.x]: number; }
12+
>{ [E1.x || E2.x]: 0} : { [E1.x || E2.x]: number; }
1313

1414
[E1.x || E2.x]: 0
1515
>E1.x || E2.x : E2

tests/baselines/reference/computedPropertyNames48_ES5.types

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ extractIndexer({
2828
extractIndexer({
2929
>extractIndexer({ [E.x]: ""}) : string
3030
>extractIndexer : <T>(p: { [n: number]: T; }) => T
31-
>{ [E.x]: ""} : { [x: number]: string; }
31+
>{ [E.x]: ""} : { [E.x]: string; }
3232

3333
[E.x]: ""
3434
>E.x : E
@@ -41,7 +41,7 @@ extractIndexer({
4141
extractIndexer({
4242
>extractIndexer({ ["" || 0]: ""}) : string
4343
>extractIndexer : <T>(p: { [n: number]: T; }) => T
44-
>{ ["" || 0]: ""} : { [x: number]: string; }
44+
>{ ["" || 0]: ""} : { ["" || 0]: string; }
4545

4646
["" || 0]: ""
4747
>"" || 0 : 0

tests/baselines/reference/computedPropertyNames48_ES6.types

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ extractIndexer({
2828
extractIndexer({
2929
>extractIndexer({ [E.x]: ""}) : string
3030
>extractIndexer : <T>(p: { [n: number]: T; }) => T
31-
>{ [E.x]: ""} : { [x: number]: string; }
31+
>{ [E.x]: ""} : { [E.x]: string; }
3232

3333
[E.x]: ""
3434
>E.x : E
@@ -41,7 +41,7 @@ extractIndexer({
4141
extractIndexer({
4242
>extractIndexer({ ["" || 0]: ""}) : string
4343
>extractIndexer : <T>(p: { [n: number]: T; }) => T
44-
>{ ["" || 0]: ""} : { [x: number]: string; }
44+
>{ ["" || 0]: ""} : { ["" || 0]: string; }
4545

4646
["" || 0]: ""
4747
>"" || 0 : 0

tests/baselines/reference/computedPropertyNames4_ES5.types

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ var a: any;
99
>a : any
1010

1111
var v = {
12-
>v : { [x: string]: string | number; [x: number]: string | number; [""]: number; [0]: number; }
13-
>{ [s]: 0, [n]: n, [s + s]: 1, [s + n]: 2, [+s]: s, [""]: 0, [0]: 0, [a]: 1, [<any>true]: 0, [`hello bye`]: 0, [`hello ${a} bye`]: 0} : { [x: string]: string | number; [x: number]: string | number; [""]: number; [0]: number; }
12+
>v : { [x: string]: string | number; [x: number]: string | number; [""]: number; [0]: number; [`hello bye`]: number; }
13+
>{ [s]: 0, [n]: n, [s + s]: 1, [s + n]: 2, [+s]: s, [""]: 0, [0]: 0, [a]: 1, [<any>true]: 0, [`hello bye`]: 0, [`hello ${a} bye`]: 0} : { [x: string]: string | number; [x: number]: string | number; [""]: number; [0]: number; [`hello bye`]: number; }
1414

1515
[s]: 0,
1616
>s : string

tests/baselines/reference/computedPropertyNames4_ES6.types

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ var a: any;
99
>a : any
1010

1111
var v = {
12-
>v : { [x: string]: string | number; [x: number]: string | number; [""]: number; [0]: number; }
13-
>{ [s]: 0, [n]: n, [s + s]: 1, [s + n]: 2, [+s]: s, [""]: 0, [0]: 0, [a]: 1, [<any>true]: 0, [`hello bye`]: 0, [`hello ${a} bye`]: 0} : { [x: string]: string | number; [x: number]: string | number; [""]: number; [0]: number; }
12+
>v : { [x: string]: string | number; [x: number]: string | number; [""]: number; [0]: number; [`hello bye`]: number; }
13+
>{ [s]: 0, [n]: n, [s + s]: 1, [s + n]: 2, [+s]: s, [""]: 0, [0]: 0, [a]: 1, [<any>true]: 0, [`hello bye`]: 0, [`hello ${a} bye`]: 0} : { [x: string]: string | number; [x: number]: string | number; [""]: number; [0]: number; [`hello bye`]: number; }
1414

1515
[s]: 0,
1616
>s : string

tests/baselines/reference/computedPropertyNames7_ES5.types

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ enum E {
66
>member : E
77
}
88
var v = {
9-
>v : { [x: number]: number; }
10-
>{ [E.member]: 0} : { [x: number]: number; }
9+
>v : { [E.member]: number; }
10+
>{ [E.member]: 0} : { [E.member]: number; }
1111

1212
[E.member]: 0
1313
>E.member : E

0 commit comments

Comments
 (0)