diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index ff8f8ce454795..1d4ccdfc64839 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -31276,8 +31276,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); } } diff --git a/src/testRunner/compilerRunner.ts b/src/testRunner/compilerRunner.ts index 298c84ec8c777..0a899cd8e8e2e 100644 --- a/src/testRunner/compilerRunner.ts +++ b/src/testRunner/compilerRunner.ts @@ -136,6 +136,7 @@ namespace Harness { "skipDefaultLibCheck", "preserveConstEnums", "skipLibCheck", + "exactOptionalPropertyTypes" ]; private fileName: string; private justName: string; diff --git a/tests/baselines/reference/deleteExpressionMustBeOptional(strict=false).errors.txt b/tests/baselines/reference/deleteExpressionMustBeOptional(strict=false).errors.txt index 8a876cb63502f..2ffd2ef4338e9 100644 --- a/tests/baselines/reference/deleteExpressionMustBeOptional(strict=false).errors.txt +++ b/tests/baselines/reference/deleteExpressionMustBeOptional(strict=false).errors.txt @@ -43,4 +43,5 @@ tests/cases/compiler/deleteExpressionMustBeOptional.ts(34,10): error TS2339: Pro delete a.b delete b.a - delete b.b \ No newline at end of file + delete b.b + \ No newline at end of file diff --git a/tests/baselines/reference/deleteExpressionMustBeOptional(strict=false).js b/tests/baselines/reference/deleteExpressionMustBeOptional(strict=false).js index 268c76175bff1..228fd713d10f0 100644 --- a/tests/baselines/reference/deleteExpressionMustBeOptional(strict=false).js +++ b/tests/baselines/reference/deleteExpressionMustBeOptional(strict=false).js @@ -38,7 +38,8 @@ delete a.a delete a.b delete b.a -delete b.b +delete b.b + //// [deleteExpressionMustBeOptional.js] delete f.a; diff --git a/tests/baselines/reference/deleteExpressionMustBeOptional(strict=true).errors.txt b/tests/baselines/reference/deleteExpressionMustBeOptional(strict=true).errors.txt index b1cabc960096f..2a493910005dd 100644 --- a/tests/baselines/reference/deleteExpressionMustBeOptional(strict=true).errors.txt +++ b/tests/baselines/reference/deleteExpressionMustBeOptional(strict=true).errors.txt @@ -49,4 +49,5 @@ tests/cases/compiler/deleteExpressionMustBeOptional.ts(34,10): error TS2339: Pro delete a.b delete b.a - delete b.b \ No newline at end of file + delete b.b + \ No newline at end of file diff --git a/tests/baselines/reference/deleteExpressionMustBeOptional(strict=true).js b/tests/baselines/reference/deleteExpressionMustBeOptional(strict=true).js index ca81456b4f43b..5cf8d6da563dd 100644 --- a/tests/baselines/reference/deleteExpressionMustBeOptional(strict=true).js +++ b/tests/baselines/reference/deleteExpressionMustBeOptional(strict=true).js @@ -38,7 +38,8 @@ delete a.a delete a.b delete b.a -delete b.b +delete b.b + //// [deleteExpressionMustBeOptional.js] "use strict"; diff --git a/tests/baselines/reference/deleteExpressionMustBeOptional_exactOptionalPropertyTypes(exactoptionalpropertytypes=false).errors.txt b/tests/baselines/reference/deleteExpressionMustBeOptional_exactOptionalPropertyTypes(exactoptionalpropertytypes=false).errors.txt new file mode 100644 index 0000000000000..7953479e4908b --- /dev/null +++ b/tests/baselines/reference/deleteExpressionMustBeOptional_exactOptionalPropertyTypes(exactoptionalpropertytypes=false).errors.txt @@ -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 + \ No newline at end of file diff --git a/tests/baselines/reference/deleteExpressionMustBeOptional_exactOptionalPropertyTypes(exactoptionalpropertytypes=false).js b/tests/baselines/reference/deleteExpressionMustBeOptional_exactOptionalPropertyTypes(exactoptionalpropertytypes=false).js new file mode 100644 index 0000000000000..2a4b0326cb85f --- /dev/null +++ b/tests/baselines/reference/deleteExpressionMustBeOptional_exactOptionalPropertyTypes(exactoptionalpropertytypes=false).js @@ -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; diff --git a/tests/baselines/reference/deleteExpressionMustBeOptional_exactOptionalPropertyTypes(exactoptionalpropertytypes=false).symbols b/tests/baselines/reference/deleteExpressionMustBeOptional_exactOptionalPropertyTypes(exactoptionalpropertytypes=false).symbols new file mode 100644 index 0000000000000..f03e4c4ba6236 --- /dev/null +++ b/tests/baselines/reference/deleteExpressionMustBeOptional_exactOptionalPropertyTypes(exactoptionalpropertytypes=false).symbols @@ -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)) + diff --git a/tests/baselines/reference/deleteExpressionMustBeOptional_exactOptionalPropertyTypes(exactoptionalpropertytypes=false).types b/tests/baselines/reference/deleteExpressionMustBeOptional_exactOptionalPropertyTypes(exactoptionalpropertytypes=false).types new file mode 100644 index 0000000000000..13436510af0d5 --- /dev/null +++ b/tests/baselines/reference/deleteExpressionMustBeOptional_exactOptionalPropertyTypes(exactoptionalpropertytypes=false).types @@ -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 + diff --git a/tests/baselines/reference/deleteExpressionMustBeOptional_exactOptionalPropertyTypes(exactoptionalpropertytypes=true).errors.txt b/tests/baselines/reference/deleteExpressionMustBeOptional_exactOptionalPropertyTypes(exactoptionalpropertytypes=true).errors.txt new file mode 100644 index 0000000000000..300d23703556e --- /dev/null +++ b/tests/baselines/reference/deleteExpressionMustBeOptional_exactOptionalPropertyTypes(exactoptionalpropertytypes=true).errors.txt @@ -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 + \ No newline at end of file diff --git a/tests/baselines/reference/deleteExpressionMustBeOptional_exactOptionalPropertyTypes(exactoptionalpropertytypes=true).js b/tests/baselines/reference/deleteExpressionMustBeOptional_exactOptionalPropertyTypes(exactoptionalpropertytypes=true).js new file mode 100644 index 0000000000000..2a4b0326cb85f --- /dev/null +++ b/tests/baselines/reference/deleteExpressionMustBeOptional_exactOptionalPropertyTypes(exactoptionalpropertytypes=true).js @@ -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; diff --git a/tests/baselines/reference/deleteExpressionMustBeOptional_exactOptionalPropertyTypes(exactoptionalpropertytypes=true).symbols b/tests/baselines/reference/deleteExpressionMustBeOptional_exactOptionalPropertyTypes(exactoptionalpropertytypes=true).symbols new file mode 100644 index 0000000000000..f03e4c4ba6236 --- /dev/null +++ b/tests/baselines/reference/deleteExpressionMustBeOptional_exactOptionalPropertyTypes(exactoptionalpropertytypes=true).symbols @@ -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)) + diff --git a/tests/baselines/reference/deleteExpressionMustBeOptional_exactOptionalPropertyTypes(exactoptionalpropertytypes=true).types b/tests/baselines/reference/deleteExpressionMustBeOptional_exactOptionalPropertyTypes(exactoptionalpropertytypes=true).types new file mode 100644 index 0000000000000..13436510af0d5 --- /dev/null +++ b/tests/baselines/reference/deleteExpressionMustBeOptional_exactOptionalPropertyTypes(exactoptionalpropertytypes=true).types @@ -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 + diff --git a/tests/cases/compiler/deleteExpressionMustBeOptional.ts b/tests/cases/compiler/deleteExpressionMustBeOptional.ts index 9f84d9ea2f1e5..98cdcabf80717 100644 --- a/tests/cases/compiler/deleteExpressionMustBeOptional.ts +++ b/tests/cases/compiler/deleteExpressionMustBeOptional.ts @@ -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 \ No newline at end of file +// @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 diff --git a/tests/cases/compiler/deleteExpressionMustBeOptional_exactOptionalPropertyTypes.ts b/tests/cases/compiler/deleteExpressionMustBeOptional_exactOptionalPropertyTypes.ts new file mode 100644 index 0000000000000..03865521a13fd --- /dev/null +++ b/tests/cases/compiler/deleteExpressionMustBeOptional_exactOptionalPropertyTypes.ts @@ -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