fix(44448): disallow 'delete' operator for optional properties (#44612)

This commit is contained in:
Oleksandr T 2021-06-30 02:56:45 +03:00 committed by GitHub
parent 4c19873b64
commit 5c8d76347c
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
16 changed files with 841 additions and 48 deletions

View file

@ -31409,8 +31409,9 @@ namespace ts {
}
function checkDeleteExpressionMustBeOptional(expr: AccessExpression, type: Type) {
const AnyOrUnknownOrNeverFlags = TypeFlags.AnyOrUnknown | TypeFlags.Never;
if (strictNullChecks && !(type.flags & AnyOrUnknownOrNeverFlags) && !(getFalsyFlags(type) & TypeFlags.Undefined)) {
if (strictNullChecks &&
!(type.flags & (TypeFlags.AnyOrUnknown | TypeFlags.Never)) &&
!(exactOptionalPropertyTypes ? 0 : getFalsyFlags(type) & TypeFlags.Undefined)) {
error(expr, Diagnostics.The_operand_of_a_delete_operator_must_be_optional);
}
}

View file

@ -136,6 +136,7 @@ namespace Harness {
"skipDefaultLibCheck",
"preserveConstEnums",
"skipLibCheck",
"exactOptionalPropertyTypes"
];
private fileName: string;
private justName: string;

View file

@ -43,4 +43,5 @@ tests/cases/compiler/deleteExpressionMustBeOptional.ts(34,10): error TS2339: Pro
delete a.b
delete b.a
delete b.b
delete b.b

View file

@ -38,7 +38,8 @@ delete a.a
delete a.b
delete b.a
delete b.b
delete b.b
//// [deleteExpressionMustBeOptional.js]
delete f.a;

View file

@ -49,4 +49,5 @@ tests/cases/compiler/deleteExpressionMustBeOptional.ts(34,10): error TS2339: Pro
delete a.b
delete b.a
delete b.b
delete b.b

View file

@ -38,7 +38,8 @@ delete a.a
delete a.b
delete b.a
delete b.b
delete b.b
//// [deleteExpressionMustBeOptional.js]
"use strict";

View file

@ -0,0 +1,53 @@
tests/cases/compiler/deleteExpressionMustBeOptional_exactOptionalPropertyTypes.ts(25,8): error TS2790: The operand of a 'delete' operator must be optional.
tests/cases/compiler/deleteExpressionMustBeOptional_exactOptionalPropertyTypes.ts(27,8): error TS2790: The operand of a 'delete' operator must be optional.
tests/cases/compiler/deleteExpressionMustBeOptional_exactOptionalPropertyTypes.ts(34,10): error TS2339: Property 'j' does not exist on type 'Foo'.
==== tests/cases/compiler/deleteExpressionMustBeOptional_exactOptionalPropertyTypes.ts (3 errors) ====
interface Foo {
a: number
b: number | undefined
c: number | null
d?: number
e: number | undefined | null
f?: number | undefined | null
g: unknown
h: any
i: never
}
interface AA {
[s: string]: number
}
type BB = {
[P in keyof any]: number
}
declare const f: Foo
declare const a: AA
declare const b: BB
delete f.a
~~~
!!! error TS2790: The operand of a 'delete' operator must be optional.
delete f.b
delete f.c
~~~
!!! error TS2790: The operand of a 'delete' operator must be optional.
delete f.d
delete f.e
delete f.f
delete f.g
delete f.h
delete f.i
delete f.j
~
!!! error TS2339: Property 'j' does not exist on type 'Foo'.
delete a.a
delete a.b
delete b.a
delete b.b

View file

@ -0,0 +1,58 @@
//// [deleteExpressionMustBeOptional_exactOptionalPropertyTypes.ts]
interface Foo {
a: number
b: number | undefined
c: number | null
d?: number
e: number | undefined | null
f?: number | undefined | null
g: unknown
h: any
i: never
}
interface AA {
[s: string]: number
}
type BB = {
[P in keyof any]: number
}
declare const f: Foo
declare const a: AA
declare const b: BB
delete f.a
delete f.b
delete f.c
delete f.d
delete f.e
delete f.f
delete f.g
delete f.h
delete f.i
delete f.j
delete a.a
delete a.b
delete b.a
delete b.b
//// [deleteExpressionMustBeOptional_exactOptionalPropertyTypes.js]
delete f.a;
delete f.b;
delete f.c;
delete f.d;
delete f.e;
delete f.f;
delete f.g;
delete f.h;
delete f.i;
delete f.j;
delete a.a;
delete a.b;
delete b.a;
delete b.b;

View file

@ -0,0 +1,118 @@
=== tests/cases/compiler/deleteExpressionMustBeOptional_exactOptionalPropertyTypes.ts ===
interface Foo {
>Foo : Symbol(Foo, Decl(deleteExpressionMustBeOptional_exactOptionalPropertyTypes.ts, 0, 0))
a: number
>a : Symbol(Foo.a, Decl(deleteExpressionMustBeOptional_exactOptionalPropertyTypes.ts, 0, 15))
b: number | undefined
>b : Symbol(Foo.b, Decl(deleteExpressionMustBeOptional_exactOptionalPropertyTypes.ts, 1, 13))
c: number | null
>c : Symbol(Foo.c, Decl(deleteExpressionMustBeOptional_exactOptionalPropertyTypes.ts, 2, 25))
d?: number
>d : Symbol(Foo.d, Decl(deleteExpressionMustBeOptional_exactOptionalPropertyTypes.ts, 3, 20))
e: number | undefined | null
>e : Symbol(Foo.e, Decl(deleteExpressionMustBeOptional_exactOptionalPropertyTypes.ts, 4, 14))
f?: number | undefined | null
>f : Symbol(Foo.f, Decl(deleteExpressionMustBeOptional_exactOptionalPropertyTypes.ts, 5, 32))
g: unknown
>g : Symbol(Foo.g, Decl(deleteExpressionMustBeOptional_exactOptionalPropertyTypes.ts, 6, 33))
h: any
>h : Symbol(Foo.h, Decl(deleteExpressionMustBeOptional_exactOptionalPropertyTypes.ts, 7, 14))
i: never
>i : Symbol(Foo.i, Decl(deleteExpressionMustBeOptional_exactOptionalPropertyTypes.ts, 8, 10))
}
interface AA {
>AA : Symbol(AA, Decl(deleteExpressionMustBeOptional_exactOptionalPropertyTypes.ts, 10, 1))
[s: string]: number
>s : Symbol(s, Decl(deleteExpressionMustBeOptional_exactOptionalPropertyTypes.ts, 13, 5))
}
type BB = {
>BB : Symbol(BB, Decl(deleteExpressionMustBeOptional_exactOptionalPropertyTypes.ts, 14, 1))
[P in keyof any]: number
>P : Symbol(P, Decl(deleteExpressionMustBeOptional_exactOptionalPropertyTypes.ts, 17, 5))
}
declare const f: Foo
>f : Symbol(f, Decl(deleteExpressionMustBeOptional_exactOptionalPropertyTypes.ts, 20, 13))
>Foo : Symbol(Foo, Decl(deleteExpressionMustBeOptional_exactOptionalPropertyTypes.ts, 0, 0))
declare const a: AA
>a : Symbol(a, Decl(deleteExpressionMustBeOptional_exactOptionalPropertyTypes.ts, 21, 13))
>AA : Symbol(AA, Decl(deleteExpressionMustBeOptional_exactOptionalPropertyTypes.ts, 10, 1))
declare const b: BB
>b : Symbol(b, Decl(deleteExpressionMustBeOptional_exactOptionalPropertyTypes.ts, 22, 13))
>BB : Symbol(BB, Decl(deleteExpressionMustBeOptional_exactOptionalPropertyTypes.ts, 14, 1))
delete f.a
>f.a : Symbol(Foo.a, Decl(deleteExpressionMustBeOptional_exactOptionalPropertyTypes.ts, 0, 15))
>f : Symbol(f, Decl(deleteExpressionMustBeOptional_exactOptionalPropertyTypes.ts, 20, 13))
>a : Symbol(Foo.a, Decl(deleteExpressionMustBeOptional_exactOptionalPropertyTypes.ts, 0, 15))
delete f.b
>f.b : Symbol(Foo.b, Decl(deleteExpressionMustBeOptional_exactOptionalPropertyTypes.ts, 1, 13))
>f : Symbol(f, Decl(deleteExpressionMustBeOptional_exactOptionalPropertyTypes.ts, 20, 13))
>b : Symbol(Foo.b, Decl(deleteExpressionMustBeOptional_exactOptionalPropertyTypes.ts, 1, 13))
delete f.c
>f.c : Symbol(Foo.c, Decl(deleteExpressionMustBeOptional_exactOptionalPropertyTypes.ts, 2, 25))
>f : Symbol(f, Decl(deleteExpressionMustBeOptional_exactOptionalPropertyTypes.ts, 20, 13))
>c : Symbol(Foo.c, Decl(deleteExpressionMustBeOptional_exactOptionalPropertyTypes.ts, 2, 25))
delete f.d
>f.d : Symbol(Foo.d, Decl(deleteExpressionMustBeOptional_exactOptionalPropertyTypes.ts, 3, 20))
>f : Symbol(f, Decl(deleteExpressionMustBeOptional_exactOptionalPropertyTypes.ts, 20, 13))
>d : Symbol(Foo.d, Decl(deleteExpressionMustBeOptional_exactOptionalPropertyTypes.ts, 3, 20))
delete f.e
>f.e : Symbol(Foo.e, Decl(deleteExpressionMustBeOptional_exactOptionalPropertyTypes.ts, 4, 14))
>f : Symbol(f, Decl(deleteExpressionMustBeOptional_exactOptionalPropertyTypes.ts, 20, 13))
>e : Symbol(Foo.e, Decl(deleteExpressionMustBeOptional_exactOptionalPropertyTypes.ts, 4, 14))
delete f.f
>f.f : Symbol(Foo.f, Decl(deleteExpressionMustBeOptional_exactOptionalPropertyTypes.ts, 5, 32))
>f : Symbol(f, Decl(deleteExpressionMustBeOptional_exactOptionalPropertyTypes.ts, 20, 13))
>f : Symbol(Foo.f, Decl(deleteExpressionMustBeOptional_exactOptionalPropertyTypes.ts, 5, 32))
delete f.g
>f.g : Symbol(Foo.g, Decl(deleteExpressionMustBeOptional_exactOptionalPropertyTypes.ts, 6, 33))
>f : Symbol(f, Decl(deleteExpressionMustBeOptional_exactOptionalPropertyTypes.ts, 20, 13))
>g : Symbol(Foo.g, Decl(deleteExpressionMustBeOptional_exactOptionalPropertyTypes.ts, 6, 33))
delete f.h
>f.h : Symbol(Foo.h, Decl(deleteExpressionMustBeOptional_exactOptionalPropertyTypes.ts, 7, 14))
>f : Symbol(f, Decl(deleteExpressionMustBeOptional_exactOptionalPropertyTypes.ts, 20, 13))
>h : Symbol(Foo.h, Decl(deleteExpressionMustBeOptional_exactOptionalPropertyTypes.ts, 7, 14))
delete f.i
>f.i : Symbol(Foo.i, Decl(deleteExpressionMustBeOptional_exactOptionalPropertyTypes.ts, 8, 10))
>f : Symbol(f, Decl(deleteExpressionMustBeOptional_exactOptionalPropertyTypes.ts, 20, 13))
>i : Symbol(Foo.i, Decl(deleteExpressionMustBeOptional_exactOptionalPropertyTypes.ts, 8, 10))
delete f.j
>f : Symbol(f, Decl(deleteExpressionMustBeOptional_exactOptionalPropertyTypes.ts, 20, 13))
delete a.a
>a : Symbol(a, Decl(deleteExpressionMustBeOptional_exactOptionalPropertyTypes.ts, 21, 13))
delete a.b
>a : Symbol(a, Decl(deleteExpressionMustBeOptional_exactOptionalPropertyTypes.ts, 21, 13))
delete b.a
>b : Symbol(b, Decl(deleteExpressionMustBeOptional_exactOptionalPropertyTypes.ts, 22, 13))
delete b.b
>b : Symbol(b, Decl(deleteExpressionMustBeOptional_exactOptionalPropertyTypes.ts, 22, 13))

View file

@ -0,0 +1,137 @@
=== tests/cases/compiler/deleteExpressionMustBeOptional_exactOptionalPropertyTypes.ts ===
interface Foo {
a: number
>a : number
b: number | undefined
>b : number | undefined
c: number | null
>c : number | null
>null : null
d?: number
>d : number | undefined
e: number | undefined | null
>e : number | null | undefined
>null : null
f?: number | undefined | null
>f : number | null | undefined
>null : null
g: unknown
>g : unknown
h: any
>h : any
i: never
>i : never
}
interface AA {
[s: string]: number
>s : string
}
type BB = {
>BB : BB
[P in keyof any]: number
}
declare const f: Foo
>f : Foo
declare const a: AA
>a : AA
declare const b: BB
>b : BB
delete f.a
>delete f.a : boolean
>f.a : number
>f : Foo
>a : number
delete f.b
>delete f.b : boolean
>f.b : number | undefined
>f : Foo
>b : number | undefined
delete f.c
>delete f.c : boolean
>f.c : number | null
>f : Foo
>c : number | null
delete f.d
>delete f.d : boolean
>f.d : number | undefined
>f : Foo
>d : number | undefined
delete f.e
>delete f.e : boolean
>f.e : number | null | undefined
>f : Foo
>e : number | null | undefined
delete f.f
>delete f.f : boolean
>f.f : number | null | undefined
>f : Foo
>f : number | null | undefined
delete f.g
>delete f.g : boolean
>f.g : unknown
>f : Foo
>g : unknown
delete f.h
>delete f.h : boolean
>f.h : any
>f : Foo
>h : any
delete f.i
>delete f.i : boolean
>f.i : never
>f : Foo
>i : never
delete f.j
>delete f.j : boolean
>f.j : any
>f : Foo
>j : any
delete a.a
>delete a.a : boolean
>a.a : number
>a : AA
>a : number
delete a.b
>delete a.b : boolean
>a.b : number
>a : AA
>b : number
delete b.a
>delete b.a : boolean
>b.a : number
>b : BB
>a : number
delete b.b
>delete b.b : boolean
>b.b : number
>b : BB
>b : number

View file

@ -0,0 +1,65 @@
tests/cases/compiler/deleteExpressionMustBeOptional_exactOptionalPropertyTypes.ts(25,8): error TS2790: The operand of a 'delete' operator must be optional.
tests/cases/compiler/deleteExpressionMustBeOptional_exactOptionalPropertyTypes.ts(26,8): error TS2790: The operand of a 'delete' operator must be optional.
tests/cases/compiler/deleteExpressionMustBeOptional_exactOptionalPropertyTypes.ts(27,8): error TS2790: The operand of a 'delete' operator must be optional.
tests/cases/compiler/deleteExpressionMustBeOptional_exactOptionalPropertyTypes.ts(28,8): error TS2790: The operand of a 'delete' operator must be optional.
tests/cases/compiler/deleteExpressionMustBeOptional_exactOptionalPropertyTypes.ts(29,8): error TS2790: The operand of a 'delete' operator must be optional.
tests/cases/compiler/deleteExpressionMustBeOptional_exactOptionalPropertyTypes.ts(30,8): error TS2790: The operand of a 'delete' operator must be optional.
tests/cases/compiler/deleteExpressionMustBeOptional_exactOptionalPropertyTypes.ts(34,10): error TS2339: Property 'j' does not exist on type 'Foo'.
==== tests/cases/compiler/deleteExpressionMustBeOptional_exactOptionalPropertyTypes.ts (7 errors) ====
interface Foo {
a: number
b: number | undefined
c: number | null
d?: number
e: number | undefined | null
f?: number | undefined | null
g: unknown
h: any
i: never
}
interface AA {
[s: string]: number
}
type BB = {
[P in keyof any]: number
}
declare const f: Foo
declare const a: AA
declare const b: BB
delete f.a
~~~
!!! error TS2790: The operand of a 'delete' operator must be optional.
delete f.b
~~~
!!! error TS2790: The operand of a 'delete' operator must be optional.
delete f.c
~~~
!!! error TS2790: The operand of a 'delete' operator must be optional.
delete f.d
~~~
!!! error TS2790: The operand of a 'delete' operator must be optional.
delete f.e
~~~
!!! error TS2790: The operand of a 'delete' operator must be optional.
delete f.f
~~~
!!! error TS2790: The operand of a 'delete' operator must be optional.
delete f.g
delete f.h
delete f.i
delete f.j
~
!!! error TS2339: Property 'j' does not exist on type 'Foo'.
delete a.a
delete a.b
delete b.a
delete b.b

View file

@ -0,0 +1,58 @@
//// [deleteExpressionMustBeOptional_exactOptionalPropertyTypes.ts]
interface Foo {
a: number
b: number | undefined
c: number | null
d?: number
e: number | undefined | null
f?: number | undefined | null
g: unknown
h: any
i: never
}
interface AA {
[s: string]: number
}
type BB = {
[P in keyof any]: number
}
declare const f: Foo
declare const a: AA
declare const b: BB
delete f.a
delete f.b
delete f.c
delete f.d
delete f.e
delete f.f
delete f.g
delete f.h
delete f.i
delete f.j
delete a.a
delete a.b
delete b.a
delete b.b
//// [deleteExpressionMustBeOptional_exactOptionalPropertyTypes.js]
delete f.a;
delete f.b;
delete f.c;
delete f.d;
delete f.e;
delete f.f;
delete f.g;
delete f.h;
delete f.i;
delete f.j;
delete a.a;
delete a.b;
delete b.a;
delete b.b;

View file

@ -0,0 +1,118 @@
=== tests/cases/compiler/deleteExpressionMustBeOptional_exactOptionalPropertyTypes.ts ===
interface Foo {
>Foo : Symbol(Foo, Decl(deleteExpressionMustBeOptional_exactOptionalPropertyTypes.ts, 0, 0))
a: number
>a : Symbol(Foo.a, Decl(deleteExpressionMustBeOptional_exactOptionalPropertyTypes.ts, 0, 15))
b: number | undefined
>b : Symbol(Foo.b, Decl(deleteExpressionMustBeOptional_exactOptionalPropertyTypes.ts, 1, 13))
c: number | null
>c : Symbol(Foo.c, Decl(deleteExpressionMustBeOptional_exactOptionalPropertyTypes.ts, 2, 25))
d?: number
>d : Symbol(Foo.d, Decl(deleteExpressionMustBeOptional_exactOptionalPropertyTypes.ts, 3, 20))
e: number | undefined | null
>e : Symbol(Foo.e, Decl(deleteExpressionMustBeOptional_exactOptionalPropertyTypes.ts, 4, 14))
f?: number | undefined | null
>f : Symbol(Foo.f, Decl(deleteExpressionMustBeOptional_exactOptionalPropertyTypes.ts, 5, 32))
g: unknown
>g : Symbol(Foo.g, Decl(deleteExpressionMustBeOptional_exactOptionalPropertyTypes.ts, 6, 33))
h: any
>h : Symbol(Foo.h, Decl(deleteExpressionMustBeOptional_exactOptionalPropertyTypes.ts, 7, 14))
i: never
>i : Symbol(Foo.i, Decl(deleteExpressionMustBeOptional_exactOptionalPropertyTypes.ts, 8, 10))
}
interface AA {
>AA : Symbol(AA, Decl(deleteExpressionMustBeOptional_exactOptionalPropertyTypes.ts, 10, 1))
[s: string]: number
>s : Symbol(s, Decl(deleteExpressionMustBeOptional_exactOptionalPropertyTypes.ts, 13, 5))
}
type BB = {
>BB : Symbol(BB, Decl(deleteExpressionMustBeOptional_exactOptionalPropertyTypes.ts, 14, 1))
[P in keyof any]: number
>P : Symbol(P, Decl(deleteExpressionMustBeOptional_exactOptionalPropertyTypes.ts, 17, 5))
}
declare const f: Foo
>f : Symbol(f, Decl(deleteExpressionMustBeOptional_exactOptionalPropertyTypes.ts, 20, 13))
>Foo : Symbol(Foo, Decl(deleteExpressionMustBeOptional_exactOptionalPropertyTypes.ts, 0, 0))
declare const a: AA
>a : Symbol(a, Decl(deleteExpressionMustBeOptional_exactOptionalPropertyTypes.ts, 21, 13))
>AA : Symbol(AA, Decl(deleteExpressionMustBeOptional_exactOptionalPropertyTypes.ts, 10, 1))
declare const b: BB
>b : Symbol(b, Decl(deleteExpressionMustBeOptional_exactOptionalPropertyTypes.ts, 22, 13))
>BB : Symbol(BB, Decl(deleteExpressionMustBeOptional_exactOptionalPropertyTypes.ts, 14, 1))
delete f.a
>f.a : Symbol(Foo.a, Decl(deleteExpressionMustBeOptional_exactOptionalPropertyTypes.ts, 0, 15))
>f : Symbol(f, Decl(deleteExpressionMustBeOptional_exactOptionalPropertyTypes.ts, 20, 13))
>a : Symbol(Foo.a, Decl(deleteExpressionMustBeOptional_exactOptionalPropertyTypes.ts, 0, 15))
delete f.b
>f.b : Symbol(Foo.b, Decl(deleteExpressionMustBeOptional_exactOptionalPropertyTypes.ts, 1, 13))
>f : Symbol(f, Decl(deleteExpressionMustBeOptional_exactOptionalPropertyTypes.ts, 20, 13))
>b : Symbol(Foo.b, Decl(deleteExpressionMustBeOptional_exactOptionalPropertyTypes.ts, 1, 13))
delete f.c
>f.c : Symbol(Foo.c, Decl(deleteExpressionMustBeOptional_exactOptionalPropertyTypes.ts, 2, 25))
>f : Symbol(f, Decl(deleteExpressionMustBeOptional_exactOptionalPropertyTypes.ts, 20, 13))
>c : Symbol(Foo.c, Decl(deleteExpressionMustBeOptional_exactOptionalPropertyTypes.ts, 2, 25))
delete f.d
>f.d : Symbol(Foo.d, Decl(deleteExpressionMustBeOptional_exactOptionalPropertyTypes.ts, 3, 20))
>f : Symbol(f, Decl(deleteExpressionMustBeOptional_exactOptionalPropertyTypes.ts, 20, 13))
>d : Symbol(Foo.d, Decl(deleteExpressionMustBeOptional_exactOptionalPropertyTypes.ts, 3, 20))
delete f.e
>f.e : Symbol(Foo.e, Decl(deleteExpressionMustBeOptional_exactOptionalPropertyTypes.ts, 4, 14))
>f : Symbol(f, Decl(deleteExpressionMustBeOptional_exactOptionalPropertyTypes.ts, 20, 13))
>e : Symbol(Foo.e, Decl(deleteExpressionMustBeOptional_exactOptionalPropertyTypes.ts, 4, 14))
delete f.f
>f.f : Symbol(Foo.f, Decl(deleteExpressionMustBeOptional_exactOptionalPropertyTypes.ts, 5, 32))
>f : Symbol(f, Decl(deleteExpressionMustBeOptional_exactOptionalPropertyTypes.ts, 20, 13))
>f : Symbol(Foo.f, Decl(deleteExpressionMustBeOptional_exactOptionalPropertyTypes.ts, 5, 32))
delete f.g
>f.g : Symbol(Foo.g, Decl(deleteExpressionMustBeOptional_exactOptionalPropertyTypes.ts, 6, 33))
>f : Symbol(f, Decl(deleteExpressionMustBeOptional_exactOptionalPropertyTypes.ts, 20, 13))
>g : Symbol(Foo.g, Decl(deleteExpressionMustBeOptional_exactOptionalPropertyTypes.ts, 6, 33))
delete f.h
>f.h : Symbol(Foo.h, Decl(deleteExpressionMustBeOptional_exactOptionalPropertyTypes.ts, 7, 14))
>f : Symbol(f, Decl(deleteExpressionMustBeOptional_exactOptionalPropertyTypes.ts, 20, 13))
>h : Symbol(Foo.h, Decl(deleteExpressionMustBeOptional_exactOptionalPropertyTypes.ts, 7, 14))
delete f.i
>f.i : Symbol(Foo.i, Decl(deleteExpressionMustBeOptional_exactOptionalPropertyTypes.ts, 8, 10))
>f : Symbol(f, Decl(deleteExpressionMustBeOptional_exactOptionalPropertyTypes.ts, 20, 13))
>i : Symbol(Foo.i, Decl(deleteExpressionMustBeOptional_exactOptionalPropertyTypes.ts, 8, 10))
delete f.j
>f : Symbol(f, Decl(deleteExpressionMustBeOptional_exactOptionalPropertyTypes.ts, 20, 13))
delete a.a
>a : Symbol(a, Decl(deleteExpressionMustBeOptional_exactOptionalPropertyTypes.ts, 21, 13))
delete a.b
>a : Symbol(a, Decl(deleteExpressionMustBeOptional_exactOptionalPropertyTypes.ts, 21, 13))
delete b.a
>b : Symbol(b, Decl(deleteExpressionMustBeOptional_exactOptionalPropertyTypes.ts, 22, 13))
delete b.b
>b : Symbol(b, Decl(deleteExpressionMustBeOptional_exactOptionalPropertyTypes.ts, 22, 13))

View file

@ -0,0 +1,137 @@
=== tests/cases/compiler/deleteExpressionMustBeOptional_exactOptionalPropertyTypes.ts ===
interface Foo {
a: number
>a : number
b: number | undefined
>b : number | undefined
c: number | null
>c : number | null
>null : null
d?: number
>d : number | undefined
e: number | undefined | null
>e : number | null | undefined
>null : null
f?: number | undefined | null
>f : number | null | undefined
>null : null
g: unknown
>g : unknown
h: any
>h : any
i: never
>i : never
}
interface AA {
[s: string]: number
>s : string
}
type BB = {
>BB : BB
[P in keyof any]: number
}
declare const f: Foo
>f : Foo
declare const a: AA
>a : AA
declare const b: BB
>b : BB
delete f.a
>delete f.a : boolean
>f.a : number
>f : Foo
>a : number
delete f.b
>delete f.b : boolean
>f.b : number | undefined
>f : Foo
>b : number | undefined
delete f.c
>delete f.c : boolean
>f.c : number | null
>f : Foo
>c : number | null
delete f.d
>delete f.d : boolean
>f.d : number | undefined
>f : Foo
>d : number | undefined
delete f.e
>delete f.e : boolean
>f.e : number | null | undefined
>f : Foo
>e : number | null | undefined
delete f.f
>delete f.f : boolean
>f.f : number | null | undefined
>f : Foo
>f : number | null | undefined
delete f.g
>delete f.g : boolean
>f.g : unknown
>f : Foo
>g : unknown
delete f.h
>delete f.h : boolean
>f.h : any
>f : Foo
>h : any
delete f.i
>delete f.i : boolean
>f.i : never
>f : Foo
>i : never
delete f.j
>delete f.j : boolean
>f.j : any
>f : Foo
>j : any
delete a.a
>delete a.a : boolean
>a.a : number
>a : AA
>a : number
delete a.b
>delete a.b : boolean
>a.b : number
>a : AA
>b : number
delete b.a
>delete b.a : boolean
>b.a : number
>b : BB
>a : number
delete b.b
>delete b.b : boolean
>b.b : number
>b : BB
>b : number

View file

@ -1,42 +1,42 @@
// @strict: true, false
interface Foo {
a: number
b: number | undefined
c: number | null
d?: number
e: number | undefined | null
f?: number | undefined | null
g: unknown
h: any
i: never
}
interface AA {
[s: string]: number
}
type BB = {
[P in keyof any]: number
}
declare const f: Foo
declare const a: AA
declare const b: BB
delete f.a
delete f.b
delete f.c
delete f.d
delete f.e
delete f.f
delete f.g
delete f.h
delete f.i
delete f.j
delete a.a
delete a.b
delete b.a
delete b.b
// @strict: true, false
interface Foo {
a: number
b: number | undefined
c: number | null
d?: number
e: number | undefined | null
f?: number | undefined | null
g: unknown
h: any
i: never
}
interface AA {
[s: string]: number
}
type BB = {
[P in keyof any]: number
}
declare const f: Foo
declare const a: AA
declare const b: BB
delete f.a
delete f.b
delete f.c
delete f.d
delete f.e
delete f.f
delete f.g
delete f.h
delete f.i
delete f.j
delete a.a
delete a.b
delete b.a
delete b.b

View file

@ -0,0 +1,43 @@
// @strictNullChecks: true
// @exactOptionalPropertyTypes: true, false
interface Foo {
a: number
b: number | undefined
c: number | null
d?: number
e: number | undefined | null
f?: number | undefined | null
g: unknown
h: any
i: never
}
interface AA {
[s: string]: number
}
type BB = {
[P in keyof any]: number
}
declare const f: Foo
declare const a: AA
declare const b: BB
delete f.a
delete f.b
delete f.c
delete f.d
delete f.e
delete f.f
delete f.g
delete f.h
delete f.i
delete f.j
delete a.a
delete a.b
delete b.a
delete b.b