Skip to content

Commit 6b9bf89

Browse files
author
王文璐
committed
allow string concat in enum member declaration
1 parent d0721e4 commit 6b9bf89

6 files changed

+172
-0
lines changed

src/compiler/checker.ts

+7
Original file line numberDiff line numberDiff line change
@@ -22962,9 +22962,16 @@ namespace ts {
2296222962
case SyntaxKind.AsteriskAsteriskToken: return left ** right;
2296322963
}
2296422964
}
22965+
if (typeof left === "string" && typeof right === "string") {
22966+
switch ((<BinaryExpression>expr).operatorToken.kind) {
22967+
case SyntaxKind.PlusToken: return left + right;
22968+
}
22969+
}
2296522970
break;
2296622971
case SyntaxKind.StringLiteral:
2296722972
return (<StringLiteral>expr).text;
22973+
case SyntaxKind.NoSubstitutionTemplateLiteral:
22974+
return (<NoSubstitutionTemplateLiteral>expr).text;
2296822975
case SyntaxKind.NumericLiteral:
2296922976
checkGrammarNumericLiteral(<NumericLiteral>expr);
2297022977
return +(<NumericLiteral>expr).text;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
tests/cases/conformance/enums/enumConstantMemberWithString.ts(5,9): error TS2362: The left-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type.
2+
tests/cases/conformance/enums/enumConstantMemberWithString.ts(5,15): error TS2363: The right-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type.
3+
tests/cases/conformance/enums/enumConstantMemberWithString.ts(6,9): error TS2322: Type 'string' is not assignable to type 'T2'.
4+
tests/cases/conformance/enums/enumConstantMemberWithString.ts(7,9): error TS2322: Type 'string' is not assignable to type 'T2'.
5+
6+
7+
==== tests/cases/conformance/enums/enumConstantMemberWithString.ts (4 errors) ====
8+
enum T2 {
9+
a = "1" + "2",
10+
b = `a`,
11+
c = "a" + `b`,
12+
d = "a" - "a",
13+
~~~
14+
!!! error TS2362: The left-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type.
15+
~~~
16+
!!! error TS2363: The right-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type.
17+
e = "a" + 1,
18+
~~~~~~~
19+
!!! error TS2322: Type 'string' is not assignable to type 'T2'.
20+
f = `a${1}`
21+
~~~~~~~
22+
!!! error TS2322: Type 'string' is not assignable to type 'T2'.
23+
}
24+
25+
declare enum T3 {
26+
a = "1" + "2",
27+
b = `a`,
28+
c = "a" + `b`
29+
}
30+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
//// [enumConstantMemberWithString.ts]
2+
enum T2 {
3+
a = "1" + "2",
4+
b = `a`,
5+
c = "a" + `b`,
6+
d = "a" - "a",
7+
e = "a" + 1,
8+
f = `a${1}`
9+
}
10+
11+
declare enum T3 {
12+
a = "1" + "2",
13+
b = `a`,
14+
c = "a" + `b`
15+
}
16+
17+
18+
//// [enumConstantMemberWithString.js]
19+
var T2;
20+
(function (T2) {
21+
T2["a"] = "12";
22+
T2["b"] = "a";
23+
T2["c"] = "ab";
24+
T2[T2["d"] = "a" - "a"] = "d";
25+
T2[T2["e"] = "a" + 1] = "e";
26+
T2[T2["f"] = "a" + 1] = "f";
27+
})(T2 || (T2 = {}));
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
=== tests/cases/conformance/enums/enumConstantMemberWithString.ts ===
2+
enum T2 {
3+
>T2 : Symbol(T2, Decl(enumConstantMemberWithString.ts, 0, 0))
4+
5+
a = "1" + "2",
6+
>a : Symbol(T2.a, Decl(enumConstantMemberWithString.ts, 0, 9))
7+
8+
b = `a`,
9+
>b : Symbol(T2.b, Decl(enumConstantMemberWithString.ts, 1, 18))
10+
11+
c = "a" + `b`,
12+
>c : Symbol(T2.c, Decl(enumConstantMemberWithString.ts, 2, 12))
13+
14+
d = "a" - "a",
15+
>d : Symbol(T2.d, Decl(enumConstantMemberWithString.ts, 3, 18))
16+
17+
e = "a" + 1,
18+
>e : Symbol(T2.e, Decl(enumConstantMemberWithString.ts, 4, 18))
19+
20+
f = `a${1}`
21+
>f : Symbol(T2.f, Decl(enumConstantMemberWithString.ts, 5, 16))
22+
}
23+
24+
declare enum T3 {
25+
>T3 : Symbol(T3, Decl(enumConstantMemberWithString.ts, 7, 1))
26+
27+
a = "1" + "2",
28+
>a : Symbol(T3.a, Decl(enumConstantMemberWithString.ts, 9, 17))
29+
30+
b = `a`,
31+
>b : Symbol(T3.b, Decl(enumConstantMemberWithString.ts, 10, 18))
32+
33+
c = "a" + `b`
34+
>c : Symbol(T3.c, Decl(enumConstantMemberWithString.ts, 11, 12))
35+
}
36+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
=== tests/cases/conformance/enums/enumConstantMemberWithString.ts ===
2+
enum T2 {
3+
>T2 : T2
4+
5+
a = "1" + "2",
6+
>a : T2
7+
>"1" + "2" : string
8+
>"1" : "1"
9+
>"2" : "2"
10+
11+
b = `a`,
12+
>b : T2
13+
>`a` : "a"
14+
15+
c = "a" + `b`,
16+
>c : T2
17+
>"a" + `b` : string
18+
>"a" : "a"
19+
>`b` : "b"
20+
21+
d = "a" - "a",
22+
>d : T2
23+
>"a" - "a" : number
24+
>"a" : "a"
25+
>"a" : "a"
26+
27+
e = "a" + 1,
28+
>e : T2
29+
>"a" + 1 : string
30+
>"a" : "a"
31+
>1 : 1
32+
33+
f = `a${1}`
34+
>f : T2
35+
>`a${1}` : string
36+
>1 : 1
37+
}
38+
39+
declare enum T3 {
40+
>T3 : T3
41+
42+
a = "1" + "2",
43+
>a : T3
44+
>"1" + "2" : string
45+
>"1" : "1"
46+
>"2" : "2"
47+
48+
b = `a`,
49+
>b : T3
50+
>`a` : "a"
51+
52+
c = "a" + `b`
53+
>c : T3
54+
>"a" + `b` : string
55+
>"a" : "a"
56+
>`b` : "b"
57+
}
58+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
enum T2 {
2+
a = "1" + "2",
3+
b = `a`,
4+
c = "a" + `b`,
5+
d = "a" - "a",
6+
e = "a" + 1,
7+
f = `a${1}`
8+
}
9+
10+
declare enum T3 {
11+
a = "1" + "2",
12+
b = `a`,
13+
c = "a" + `b`
14+
}

0 commit comments

Comments
 (0)