From e3d6189e3ab054a11ae5be246d9dcc1cf245fd3b Mon Sep 17 00:00:00 2001 From: Daniel Rosenwasser Date: Thu, 1 Jul 2021 15:19:11 -0700 Subject: [PATCH] Correctly check for 'delete' on optional properties in 'exactOptionalPropertyTypes'. (#44854) * Check for optionality in 'delete'. * Accepted baselines. --- src/compiler/checker.ts | 8 ++++---- ...pertyTypes(exactoptionalpropertytypes=true).errors.txt | 8 +------- 2 files changed, 5 insertions(+), 11 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index f0f817facfc..761ca7a95ec 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -31402,16 +31402,16 @@ namespace ts { if (isReadonlySymbol(symbol)) { error(expr, Diagnostics.The_operand_of_a_delete_operator_cannot_be_a_read_only_property); } - - checkDeleteExpressionMustBeOptional(expr, getTypeOfSymbol(symbol)); + checkDeleteExpressionMustBeOptional(expr, symbol); } return booleanType; } - function checkDeleteExpressionMustBeOptional(expr: AccessExpression, type: Type) { + function checkDeleteExpressionMustBeOptional(expr: AccessExpression, symbol: Symbol) { + const type = getTypeOfSymbol(symbol); if (strictNullChecks && !(type.flags & (TypeFlags.AnyOrUnknown | TypeFlags.Never)) && - !(exactOptionalPropertyTypes ? 0 : getFalsyFlags(type) & TypeFlags.Undefined)) { + !(exactOptionalPropertyTypes ? hasQuestionToken(symbol.valueDeclaration!) : getFalsyFlags(type) & TypeFlags.Undefined)) { error(expr, Diagnostics.The_operand_of_a_delete_operator_must_be_optional); } } diff --git a/tests/baselines/reference/deleteExpressionMustBeOptional_exactOptionalPropertyTypes(exactoptionalpropertytypes=true).errors.txt b/tests/baselines/reference/deleteExpressionMustBeOptional_exactOptionalPropertyTypes(exactoptionalpropertytypes=true).errors.txt index 300d2370355..03d5b58f2e7 100644 --- a/tests/baselines/reference/deleteExpressionMustBeOptional_exactOptionalPropertyTypes(exactoptionalpropertytypes=true).errors.txt +++ b/tests/baselines/reference/deleteExpressionMustBeOptional_exactOptionalPropertyTypes(exactoptionalpropertytypes=true).errors.txt @@ -1,13 +1,11 @@ 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) ==== +==== tests/cases/compiler/deleteExpressionMustBeOptional_exactOptionalPropertyTypes.ts (5 errors) ==== interface Foo { a: number b: number | undefined @@ -42,14 +40,10 @@ tests/cases/compiler/deleteExpressionMustBeOptional_exactOptionalPropertyTypes.t ~~~ !!! 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