From e01ced050c36477768f3ccd7de5932d91ec9b182 Mon Sep 17 00:00:00 2001 From: Tobeyyy Date: Fri, 20 Jan 2023 01:59:07 +0100 Subject: [PATCH] fix type checking of variables named "exports" (#52209) --- src/compiler/checker.ts | 2 +- .../reference/typeCheckExportsVariable.errors.txt | 8 ++++++++ tests/baselines/reference/typeCheckExportsVariable.js | 7 +++++++ .../baselines/reference/typeCheckExportsVariable.symbols | 7 +++++++ tests/baselines/reference/typeCheckExportsVariable.types | 9 +++++++++ tests/cases/compiler/typeCheckExportsVariable.ts | 3 +++ 6 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 tests/baselines/reference/typeCheckExportsVariable.errors.txt create mode 100644 tests/baselines/reference/typeCheckExportsVariable.js create mode 100644 tests/baselines/reference/typeCheckExportsVariable.symbols create mode 100644 tests/baselines/reference/typeCheckExportsVariable.types create mode 100644 tests/cases/compiler/typeCheckExportsVariable.ts diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index d9df6a14dc0..e6ea8924e85 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -36500,7 +36500,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { if (checkReferenceExpression(left, Diagnostics.The_left_hand_side_of_an_assignment_expression_must_be_a_variable_or_a_property_access, Diagnostics.The_left_hand_side_of_an_assignment_expression_may_not_be_an_optional_property_access) - && (!isIdentifier(left) || unescapeLeadingUnderscores(left.escapedText) !== "exports")) { + ) { let headMessage: DiagnosticMessage | undefined; if (exactOptionalPropertyTypes && isPropertyAccessExpression(left) && maybeTypeOfKind(valueType, TypeFlags.Undefined)) { diff --git a/tests/baselines/reference/typeCheckExportsVariable.errors.txt b/tests/baselines/reference/typeCheckExportsVariable.errors.txt new file mode 100644 index 00000000000..9f0f04cf365 --- /dev/null +++ b/tests/baselines/reference/typeCheckExportsVariable.errors.txt @@ -0,0 +1,8 @@ +tests/cases/compiler/typeCheckExportsVariable.ts(2,1): error TS2322: Type 'string' is not assignable to type 'number'. + + +==== tests/cases/compiler/typeCheckExportsVariable.ts (1 errors) ==== + let exports: number; + exports = ''; + ~~~~~~~ +!!! error TS2322: Type 'string' is not assignable to type 'number'. \ No newline at end of file diff --git a/tests/baselines/reference/typeCheckExportsVariable.js b/tests/baselines/reference/typeCheckExportsVariable.js new file mode 100644 index 00000000000..616b0ff65e4 --- /dev/null +++ b/tests/baselines/reference/typeCheckExportsVariable.js @@ -0,0 +1,7 @@ +//// [typeCheckExportsVariable.ts] +let exports: number; +exports = ''; + +//// [typeCheckExportsVariable.js] +var exports; +exports = ''; diff --git a/tests/baselines/reference/typeCheckExportsVariable.symbols b/tests/baselines/reference/typeCheckExportsVariable.symbols new file mode 100644 index 00000000000..d7f4b0b8cbd --- /dev/null +++ b/tests/baselines/reference/typeCheckExportsVariable.symbols @@ -0,0 +1,7 @@ +=== tests/cases/compiler/typeCheckExportsVariable.ts === +let exports: number; +>exports : Symbol(exports, Decl(typeCheckExportsVariable.ts, 0, 3)) + +exports = ''; +>exports : Symbol(exports, Decl(typeCheckExportsVariable.ts, 0, 3)) + diff --git a/tests/baselines/reference/typeCheckExportsVariable.types b/tests/baselines/reference/typeCheckExportsVariable.types new file mode 100644 index 00000000000..61cedca43c4 --- /dev/null +++ b/tests/baselines/reference/typeCheckExportsVariable.types @@ -0,0 +1,9 @@ +=== tests/cases/compiler/typeCheckExportsVariable.ts === +let exports: number; +>exports : number + +exports = ''; +>exports = '' : "" +>exports : number +>'' : "" + diff --git a/tests/cases/compiler/typeCheckExportsVariable.ts b/tests/cases/compiler/typeCheckExportsVariable.ts new file mode 100644 index 00000000000..f3b4df3ee3b --- /dev/null +++ b/tests/cases/compiler/typeCheckExportsVariable.ts @@ -0,0 +1,3 @@ + +let exports: number; +exports = ''; \ No newline at end of file