Skip to content

Commit 98d7e0b

Browse files
authored
Fix double error on invalid delete of readonly property (#55449)
1 parent fecbae5 commit 98d7e0b

6 files changed

+63
-1
lines changed

src/compiler/checker.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36713,7 +36713,9 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
3671336713
if (isReadonlySymbol(symbol)) {
3671436714
error(expr, Diagnostics.The_operand_of_a_delete_operator_cannot_be_a_read_only_property);
3671536715
}
36716-
checkDeleteExpressionMustBeOptional(expr, symbol);
36716+
else {
36717+
checkDeleteExpressionMustBeOptional(expr, symbol);
36718+
}
3671736719
}
3671836720
return booleanType;
3671936721
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
deleteReadonlyInStrictNullChecks.ts(3,8): error TS2704: The operand of a 'delete' operator cannot be a read-only property.
2+
3+
4+
==== deleteReadonlyInStrictNullChecks.ts (1 errors) ====
5+
interface Function { readonly name: string; }
6+
class Foo {}
7+
delete Foo.name;
8+
~~~~~~~~
9+
!!! error TS2704: The operand of a 'delete' operator cannot be a read-only property.
10+
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
//// [tests/cases/compiler/deleteReadonlyInStrictNullChecks.ts] ////
2+
3+
//// [deleteReadonlyInStrictNullChecks.ts]
4+
interface Function { readonly name: string; }
5+
class Foo {}
6+
delete Foo.name;
7+
8+
9+
//// [deleteReadonlyInStrictNullChecks.js]
10+
var Foo = /** @class */ (function () {
11+
function Foo() {
12+
}
13+
return Foo;
14+
}());
15+
delete Foo.name;
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
//// [tests/cases/compiler/deleteReadonlyInStrictNullChecks.ts] ////
2+
3+
=== deleteReadonlyInStrictNullChecks.ts ===
4+
interface Function { readonly name: string; }
5+
>Function : Symbol(Function, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --), Decl(deleteReadonlyInStrictNullChecks.ts, 0, 0))
6+
>name : Symbol(Function.name, Decl(deleteReadonlyInStrictNullChecks.ts, 0, 20))
7+
8+
class Foo {}
9+
>Foo : Symbol(Foo, Decl(deleteReadonlyInStrictNullChecks.ts, 0, 45))
10+
11+
delete Foo.name;
12+
>Foo.name : Symbol(Function.name, Decl(deleteReadonlyInStrictNullChecks.ts, 0, 20))
13+
>Foo : Symbol(Foo, Decl(deleteReadonlyInStrictNullChecks.ts, 0, 45))
14+
>name : Symbol(Function.name, Decl(deleteReadonlyInStrictNullChecks.ts, 0, 20))
15+
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
//// [tests/cases/compiler/deleteReadonlyInStrictNullChecks.ts] ////
2+
3+
=== deleteReadonlyInStrictNullChecks.ts ===
4+
interface Function { readonly name: string; }
5+
>name : string
6+
7+
class Foo {}
8+
>Foo : Foo
9+
10+
delete Foo.name;
11+
>delete Foo.name : boolean
12+
>Foo.name : string
13+
>Foo : typeof Foo
14+
>name : string
15+
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
// @strictNullChecks: true
2+
3+
interface Function { readonly name: string; }
4+
class Foo {}
5+
delete Foo.name;

0 commit comments

Comments
 (0)