From 718120d949ff58dcfc43955d214b33f1a042d4ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Burzy=C5=84ski?= Date: Mon, 21 Aug 2023 10:53:54 +0200 Subject: [PATCH] Do not widen literal types when emitting declarations --- src/compiler/checker.ts | 2 +- .../reference/ambientConstLiterals.js | 4 ++-- .../declarationEmitBindingPatterns2.js | 16 ++++++++++++++ .../declarationEmitBindingPatterns2.symbols | 17 +++++++++++++++ .../declarationEmitBindingPatterns2.types | 21 +++++++++++++++++++ .../reference/strictFunctionTypes1.js | 2 +- .../stringLiteralTypesOverloads02.js | 8 +++---- .../declarationEmitBindingPatterns2.ts | 11 ++++++++++ 8 files changed, 73 insertions(+), 8 deletions(-) create mode 100644 tests/baselines/reference/declarationEmitBindingPatterns2.js create mode 100644 tests/baselines/reference/declarationEmitBindingPatterns2.symbols create mode 100644 tests/baselines/reference/declarationEmitBindingPatterns2.types create mode 100644 tests/cases/compiler/declarationEmitBindingPatterns2.ts diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 9c6b8237a7f74..d7f385aef3512 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -47230,7 +47230,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { // Get type of the symbol if this is the valid symbol otherwise get type at location const symbol = getSymbolOfDeclaration(declaration); let type = symbol && !(symbol.flags & (SymbolFlags.TypeLiteral | SymbolFlags.Signature)) - ? getWidenedLiteralType(getTypeOfSymbol(symbol)) + ? getTypeOfSymbol(symbol) : errorType; if ( type.flags & TypeFlags.UniqueESSymbol && diff --git a/tests/baselines/reference/ambientConstLiterals.js b/tests/baselines/reference/ambientConstLiterals.js index 8b35d43487203..230df0414e773 100644 --- a/tests/baselines/reference/ambientConstLiterals.js +++ b/tests/baselines/reference/ambientConstLiterals.js @@ -74,5 +74,5 @@ declare const c9: { declare const c10: number[]; declare const c11: string; declare const c12: number; -declare const c13: string; -declare const c14: number; +declare const c13: "abc" | "def"; +declare const c14: 123 | 456; diff --git a/tests/baselines/reference/declarationEmitBindingPatterns2.js b/tests/baselines/reference/declarationEmitBindingPatterns2.js new file mode 100644 index 0000000000000..87c63c2058761 --- /dev/null +++ b/tests/baselines/reference/declarationEmitBindingPatterns2.js @@ -0,0 +1,16 @@ +//// [tests/cases/compiler/declarationEmitBindingPatterns2.ts] //// + +//// [declarationEmitBindingPatterns2.ts] +// https://github.com/microsoft/TypeScript/issues/55439 + +function foo(): { y: 1 } { + return { y: 1 }; +} + +export const { y = 0 } = foo(); + + + + +//// [declarationEmitBindingPatterns2.d.ts] +export declare const y: 1 | 0; diff --git a/tests/baselines/reference/declarationEmitBindingPatterns2.symbols b/tests/baselines/reference/declarationEmitBindingPatterns2.symbols new file mode 100644 index 0000000000000..9e99418b67801 --- /dev/null +++ b/tests/baselines/reference/declarationEmitBindingPatterns2.symbols @@ -0,0 +1,17 @@ +//// [tests/cases/compiler/declarationEmitBindingPatterns2.ts] //// + +=== declarationEmitBindingPatterns2.ts === +// https://github.com/microsoft/TypeScript/issues/55439 + +function foo(): { y: 1 } { +>foo : Symbol(foo, Decl(declarationEmitBindingPatterns2.ts, 0, 0)) +>y : Symbol(y, Decl(declarationEmitBindingPatterns2.ts, 2, 17)) + + return { y: 1 }; +>y : Symbol(y, Decl(declarationEmitBindingPatterns2.ts, 3, 10)) +} + +export const { y = 0 } = foo(); +>y : Symbol(y, Decl(declarationEmitBindingPatterns2.ts, 6, 14)) +>foo : Symbol(foo, Decl(declarationEmitBindingPatterns2.ts, 0, 0)) + diff --git a/tests/baselines/reference/declarationEmitBindingPatterns2.types b/tests/baselines/reference/declarationEmitBindingPatterns2.types new file mode 100644 index 0000000000000..eee9449b1054f --- /dev/null +++ b/tests/baselines/reference/declarationEmitBindingPatterns2.types @@ -0,0 +1,21 @@ +//// [tests/cases/compiler/declarationEmitBindingPatterns2.ts] //// + +=== declarationEmitBindingPatterns2.ts === +// https://github.com/microsoft/TypeScript/issues/55439 + +function foo(): { y: 1 } { +>foo : () => { y: 1;} +>y : 1 + + return { y: 1 }; +>{ y: 1 } : { y: 1; } +>y : 1 +>1 : 1 +} + +export const { y = 0 } = foo(); +>y : 1 | 0 +>0 : 0 +>foo() : { y: 1; } +>foo : () => { y: 1; } + diff --git a/tests/baselines/reference/strictFunctionTypes1.js b/tests/baselines/reference/strictFunctionTypes1.js index 25769522a4898..a32f4bdacf139 100644 --- a/tests/baselines/reference/strictFunctionTypes1.js +++ b/tests/baselines/reference/strictFunctionTypes1.js @@ -82,7 +82,7 @@ declare function fs(x: string): void; declare function fx(f: (x: "def") => void): void; declare const x1: (x: string) => void; declare const x2 = "abc"; -declare const x3: string; +declare const x3: "def" | "abc"; declare const x4: Func; declare const never: never; declare const x10: string; diff --git a/tests/baselines/reference/stringLiteralTypesOverloads02.js b/tests/baselines/reference/stringLiteralTypesOverloads02.js index cf6e285b9049b..216a42aec80e2 100644 --- a/tests/baselines/reference/stringLiteralTypesOverloads02.js +++ b/tests/baselines/reference/stringLiteralTypesOverloads02.js @@ -104,9 +104,9 @@ declare namespace Consts1 { declare const string = "string"; declare const number = "number"; declare const boolean = "boolean"; -declare const stringOrNumber: string; -declare const stringOrBoolean: string; -declare const booleanOrNumber: string; -declare const stringOrBooleanOrNumber: string; +declare const stringOrNumber: "string" | "number"; +declare const stringOrBoolean: "string" | "boolean"; +declare const booleanOrNumber: "number" | "boolean"; +declare const stringOrBooleanOrNumber: "string" | "number" | "boolean"; declare namespace Consts2 { } diff --git a/tests/cases/compiler/declarationEmitBindingPatterns2.ts b/tests/cases/compiler/declarationEmitBindingPatterns2.ts new file mode 100644 index 0000000000000..fbb3e5c3f9b07 --- /dev/null +++ b/tests/cases/compiler/declarationEmitBindingPatterns2.ts @@ -0,0 +1,11 @@ +// @strict: true +// @declaration: true +// @emitDeclarationOnly: true + +// https://github.com/microsoft/TypeScript/issues/55439 + +function foo(): { y: 1 } { + return { y: 1 }; +} + +export const { y = 0 } = foo();