Skip to content

Commit 806e142

Browse files
Add error message
Add error message when trying to relate primitives to the boxed/apparent backing types.
1 parent d8ab098 commit 806e142

15 files changed

+95
-1
lines changed

src/compiler/checker.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6258,13 +6258,20 @@ namespace ts {
62586258
targetType = typeToString(target, /*enclosingDeclaration*/ undefined, TypeFormatFlags.UseFullyQualifiedType);
62596259
}
62606260

6261+
// check if trying to relate primitives to the boxed/apparent backing types.
6262+
if ((sourceType === "Number" && targetType === "number") ||
6263+
(sourceType === "String" && targetType === "string") ||
6264+
(sourceType === "Boolean" && targetType === "boolean")) {
6265+
reportError(Diagnostics._0_is_a_primitive_type_while_1_is_a_boxed_object_Prefer_using_0_when_possible, targetType, sourceType);
6266+
}
6267+
62616268
if (!message) {
62626269
message = relation === comparableRelation ?
62636270
Diagnostics.Type_0_is_not_comparable_to_type_1 :
62646271
Diagnostics.Type_0_is_not_assignable_to_type_1;
62656272
}
62666273

6267-
reportError(message, sourceType, targetType);
6274+
reportError(message, sourceType, targetType);
62686275
}
62696276

62706277
// Compare two types and return

src/compiler/diagnosticMessages.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1955,6 +1955,10 @@
19551955
"category": "Error",
19561956
"code": 2691
19571957
},
1958+
"'{0}' is a primitive type while '{1}' is a boxed object. Prefer using '{0}' when possible.": {
1959+
"category": "Error",
1960+
"code": 2692
1961+
},
19581962
"Import declaration '{0}' is using private name '{1}'.": {
19591963
"category": "Error",
19601964
"code": 4000

tests/baselines/reference/apparentTypeSubtyping.errors.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
tests/cases/conformance/types/typeRelationships/apparentType/apparentTypeSubtyping.ts(9,7): error TS2415: Class 'Derived<U>' incorrectly extends base class 'Base<string>'.
22
Types of property 'x' are incompatible.
33
Type 'String' is not assignable to type 'string'.
4+
'string' is a primitive type while 'String' is a boxed object. Prefer using 'string' when possible.
45

56

67
==== tests/cases/conformance/types/typeRelationships/apparentType/apparentTypeSubtyping.ts (1 errors) ====
@@ -17,6 +18,7 @@ tests/cases/conformance/types/typeRelationships/apparentType/apparentTypeSubtypi
1718
!!! error TS2415: Class 'Derived<U>' incorrectly extends base class 'Base<string>'.
1819
!!! error TS2415: Types of property 'x' are incompatible.
1920
!!! error TS2415: Type 'String' is not assignable to type 'string'.
21+
!!! error TS2415: 'string' is a primitive type while 'String' is a boxed object. Prefer using 'string' when possible.
2022
x: String;
2123
}
2224

tests/baselines/reference/apparentTypeSupertype.errors.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ tests/cases/conformance/types/typeRelationships/apparentType/apparentTypeSuperty
22
Types of property 'x' are incompatible.
33
Type 'U' is not assignable to type 'string'.
44
Type 'String' is not assignable to type 'string'.
5+
'string' is a primitive type while 'String' is a boxed object. Prefer using 'string' when possible.
56

67

78
==== tests/cases/conformance/types/typeRelationships/apparentType/apparentTypeSupertype.ts (1 errors) ====
@@ -19,5 +20,6 @@ tests/cases/conformance/types/typeRelationships/apparentType/apparentTypeSuperty
1920
!!! error TS2415: Types of property 'x' are incompatible.
2021
!!! error TS2415: Type 'U' is not assignable to type 'string'.
2122
!!! error TS2415: Type 'String' is not assignable to type 'string'.
23+
!!! error TS2415: 'string' is a primitive type while 'String' is a boxed object. Prefer using 'string' when possible.
2224
x: U;
2325
}

tests/baselines/reference/arrayLiterals3.errors.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ tests/cases/conformance/expressions/arrayLiterals/arrayLiterals3.ts(34,5): error
1818
Types of parameters 'items' and 'items' are incompatible.
1919
Type 'Number' is not assignable to type 'string | number'.
2020
Type 'Number' is not assignable to type 'number'.
21+
'number' is a primitive type while 'Number' is a boxed object. Prefer using 'number' when possible.
2122

2223

2324
==== tests/cases/conformance/expressions/arrayLiterals/arrayLiterals3.ts (6 errors) ====
@@ -81,4 +82,5 @@ tests/cases/conformance/expressions/arrayLiterals/arrayLiterals3.ts(34,5): error
8182
!!! error TS2322: Types of parameters 'items' and 'items' are incompatible.
8283
!!! error TS2322: Type 'Number' is not assignable to type 'string | number'.
8384
!!! error TS2322: Type 'Number' is not assignable to type 'number'.
85+
!!! error TS2322: 'number' is a primitive type while 'Number' is a boxed object. Prefer using 'number' when possible.
8486

tests/baselines/reference/assignFromBooleanInterface.errors.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
tests/cases/conformance/types/primitives/boolean/assignFromBooleanInterface.ts(3,1): error TS2322: Type 'Boolean' is not assignable to type 'boolean'.
2+
'boolean' is a primitive type while 'Boolean' is a boxed object. Prefer using 'boolean' when possible.
23

34

45
==== tests/cases/conformance/types/primitives/boolean/assignFromBooleanInterface.ts (1 errors) ====
@@ -7,4 +8,5 @@ tests/cases/conformance/types/primitives/boolean/assignFromBooleanInterface.ts(3
78
x = a;
89
~
910
!!! error TS2322: Type 'Boolean' is not assignable to type 'boolean'.
11+
!!! error TS2322: 'boolean' is a primitive type while 'Boolean' is a boxed object. Prefer using 'boolean' when possible.
1012
a = x;

tests/baselines/reference/assignFromBooleanInterface2.errors.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ tests/cases/conformance/types/primitives/boolean/assignFromBooleanInterface2.ts(
33
Type '() => Object' is not assignable to type '() => boolean'.
44
Type 'Object' is not assignable to type 'boolean'.
55
tests/cases/conformance/types/primitives/boolean/assignFromBooleanInterface2.ts(19,1): error TS2322: Type 'Boolean' is not assignable to type 'boolean'.
6+
'boolean' is a primitive type while 'Boolean' is a boxed object. Prefer using 'boolean' when possible.
67
tests/cases/conformance/types/primitives/boolean/assignFromBooleanInterface2.ts(20,1): error TS2322: Type 'NotBoolean' is not assignable to type 'boolean'.
78

89

@@ -33,6 +34,7 @@ tests/cases/conformance/types/primitives/boolean/assignFromBooleanInterface2.ts(
3334
x = a; // expected error
3435
~
3536
!!! error TS2322: Type 'Boolean' is not assignable to type 'boolean'.
37+
!!! error TS2322: 'boolean' is a primitive type while 'Boolean' is a boxed object. Prefer using 'boolean' when possible.
3638
x = b; // expected error
3739
~
3840
!!! error TS2322: Type 'NotBoolean' is not assignable to type 'boolean'.

tests/baselines/reference/assignFromNumberInterface.errors.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
tests/cases/conformance/types/primitives/number/assignFromNumberInterface.ts(3,1): error TS2322: Type 'Number' is not assignable to type 'number'.
2+
'number' is a primitive type while 'Number' is a boxed object. Prefer using 'number' when possible.
23

34

45
==== tests/cases/conformance/types/primitives/number/assignFromNumberInterface.ts (1 errors) ====
@@ -7,4 +8,5 @@ tests/cases/conformance/types/primitives/number/assignFromNumberInterface.ts(3,1
78
x = a;
89
~
910
!!! error TS2322: Type 'Number' is not assignable to type 'number'.
11+
!!! error TS2322: 'number' is a primitive type while 'Number' is a boxed object. Prefer using 'number' when possible.
1012
a = x;

tests/baselines/reference/assignFromNumberInterface2.errors.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
tests/cases/conformance/types/primitives/number/assignFromNumberInterface2.ts(24,1): error TS2322: Type 'Number' is not assignable to type 'number'.
2+
'number' is a primitive type while 'Number' is a boxed object. Prefer using 'number' when possible.
23
tests/cases/conformance/types/primitives/number/assignFromNumberInterface2.ts(25,1): error TS2322: Type 'NotNumber' is not assignable to type 'number'.
34

45

@@ -29,6 +30,7 @@ tests/cases/conformance/types/primitives/number/assignFromNumberInterface2.ts(25
2930
x = a; // expected error
3031
~
3132
!!! error TS2322: Type 'Number' is not assignable to type 'number'.
33+
!!! error TS2322: 'number' is a primitive type while 'Number' is a boxed object. Prefer using 'number' when possible.
3234
x = b; // expected error
3335
~
3436
!!! error TS2322: Type 'NotNumber' is not assignable to type 'number'.

tests/baselines/reference/assignFromStringInterface.errors.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
tests/cases/conformance/types/primitives/string/assignFromStringInterface.ts(3,1): error TS2322: Type 'String' is not assignable to type 'string'.
2+
'string' is a primitive type while 'String' is a boxed object. Prefer using 'string' when possible.
23

34

45
==== tests/cases/conformance/types/primitives/string/assignFromStringInterface.ts (1 errors) ====
@@ -7,4 +8,5 @@ tests/cases/conformance/types/primitives/string/assignFromStringInterface.ts(3,1
78
x = a;
89
~
910
!!! error TS2322: Type 'String' is not assignable to type 'string'.
11+
!!! error TS2322: 'string' is a primitive type while 'String' is a boxed object. Prefer using 'string' when possible.
1012
a = x;

tests/baselines/reference/assignFromStringInterface2.errors.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
tests/cases/conformance/types/primitives/string/assignFromStringInterface2.ts(47,1): error TS2322: Type 'String' is not assignable to type 'string'.
2+
'string' is a primitive type while 'String' is a boxed object. Prefer using 'string' when possible.
23
tests/cases/conformance/types/primitives/string/assignFromStringInterface2.ts(48,1): error TS2322: Type 'NotString' is not assignable to type 'string'.
34

45

@@ -52,6 +53,7 @@ tests/cases/conformance/types/primitives/string/assignFromStringInterface2.ts(48
5253
x = a; // expected error
5354
~
5455
!!! error TS2322: Type 'String' is not assignable to type 'string'.
56+
!!! error TS2322: 'string' is a primitive type while 'String' is a boxed object. Prefer using 'string' when possible.
5557
x = b; // expected error
5658
~
5759
!!! error TS2322: Type 'NotString' is not assignable to type 'string'.
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
tests/cases/compiler/nativeToBoxedTypes.ts(3,1): error TS2322: Type 'Number' is not assignable to type 'number'.
2+
'number' is a primitive type while 'Number' is a boxed object. Prefer using 'number' when possible.
3+
tests/cases/compiler/nativeToBoxedTypes.ts(7,1): error TS2322: Type 'String' is not assignable to type 'string'.
4+
'string' is a primitive type while 'String' is a boxed object. Prefer using 'string' when possible.
5+
tests/cases/compiler/nativeToBoxedTypes.ts(11,1): error TS2322: Type 'Boolean' is not assignable to type 'boolean'.
6+
'boolean' is a primitive type while 'Boolean' is a boxed object. Prefer using 'boolean' when possible.
7+
8+
9+
==== tests/cases/compiler/nativeToBoxedTypes.ts (3 errors) ====
10+
var N = new Number();
11+
var n = 100;
12+
n = N;
13+
~
14+
!!! error TS2322: Type 'Number' is not assignable to type 'number'.
15+
!!! error TS2322: 'number' is a primitive type while 'Number' is a boxed object. Prefer using 'number' when possible.
16+
17+
var S = new String();
18+
var s = "foge";
19+
s = S;
20+
~
21+
!!! error TS2322: Type 'String' is not assignable to type 'string'.
22+
!!! error TS2322: 'string' is a primitive type while 'String' is a boxed object. Prefer using 'string' when possible.
23+
24+
var B = new Boolean();
25+
var b = true;
26+
b = B;
27+
~
28+
!!! error TS2322: Type 'Boolean' is not assignable to type 'boolean'.
29+
!!! error TS2322: 'boolean' is a primitive type while 'Boolean' is a boxed object. Prefer using 'boolean' when possible.
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
//// [nativeToBoxedTypes.ts]
2+
var N = new Number();
3+
var n = 100;
4+
n = N;
5+
6+
var S = new String();
7+
var s = "foge";
8+
s = S;
9+
10+
var B = new Boolean();
11+
var b = true;
12+
b = B;
13+
14+
//// [nativeToBoxedTypes.js]
15+
var N = new Number();
16+
var n = 100;
17+
n = N;
18+
var S = new String();
19+
var s = "foge";
20+
s = S;
21+
var B = new Boolean();
22+
var b = true;
23+
b = B;

tests/baselines/reference/primitiveMembers.errors.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
tests/cases/compiler/primitiveMembers.ts(5,3): error TS2339: Property 'toBAZ' does not exist on type 'number'.
22
tests/cases/compiler/primitiveMembers.ts(11,1): error TS2322: Type 'Number' is not assignable to type 'number'.
3+
'number' is a primitive type while 'Number' is a boxed object. Prefer using 'number' when possible.
34

45

56
==== tests/cases/compiler/primitiveMembers.ts (2 errors) ====
@@ -18,6 +19,7 @@ tests/cases/compiler/primitiveMembers.ts(11,1): error TS2322: Type 'Number' is n
1819
n = N; // should not work, as 'number' has a different brand
1920
~
2021
!!! error TS2322: Type 'Number' is not assignable to type 'number'.
22+
!!! error TS2322: 'number' is a primitive type while 'Number' is a boxed object. Prefer using 'number' when possible.
2123
N = n; // should work
2224

2325
var o: Object = {}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
var N = new Number();
2+
var n = 100;
3+
n = N;
4+
5+
var S = new String();
6+
var s = "foge";
7+
s = S;
8+
9+
var B = new Boolean();
10+
var b = true;
11+
b = B;

0 commit comments

Comments
 (0)