From 7d365a35a2435c5bae1b6dfba020cdb31a9ac5f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Burzy=C5=84ski?= Date: Thu, 3 Oct 2024 14:40:33 +0200 Subject: [PATCH 1/2] Avoid confusing TS9025 error in `isolatedDeclarations` --- src/compiler/checker.ts | 5 +- ...olatedDeclarationsAddUndefined2.errors.txt | 43 ++++++++++ .../isolatedDeclarationsAddUndefined2.js | 84 +++++++++++++++++++ .../isolatedDeclarationsAddUndefined2.symbols | 47 +++++++++++ .../isolatedDeclarationsAddUndefined2.types | 53 ++++++++++++ .../isolatedDeclarationsAddUndefined2.ts | 25 ++++++ 6 files changed, 256 insertions(+), 1 deletion(-) create mode 100644 tests/baselines/reference/isolatedDeclarationsAddUndefined2.errors.txt create mode 100644 tests/baselines/reference/isolatedDeclarationsAddUndefined2.js create mode 100644 tests/baselines/reference/isolatedDeclarationsAddUndefined2.symbols create mode 100644 tests/baselines/reference/isolatedDeclarationsAddUndefined2.types create mode 100644 tests/cases/compiler/isolatedDeclarationsAddUndefined2.ts diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 88448475aaa67..4e0ded3a8ec8d 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -50035,7 +50035,10 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { const typeNode = getNonlocalEffectiveTypeAnnotationNode(parameter); if (!typeNode) return false; const type = getTypeFromTypeNode(typeNode); - return containsUndefinedType(type); + // allow error type here to avoid confusing errors that the annotation has to contain undefined when it does in cases like this: + // + // export function fn(x?: Unresolved | undefined): void {} + return isErrorType(type) || containsUndefinedType(type); } function requiresAddingImplicitUndefined(parameter: ParameterDeclaration | JSDocParameterTag, enclosingDeclaration: Node | undefined) { diff --git a/tests/baselines/reference/isolatedDeclarationsAddUndefined2.errors.txt b/tests/baselines/reference/isolatedDeclarationsAddUndefined2.errors.txt new file mode 100644 index 0000000000000..790fd313ad2f8 --- /dev/null +++ b/tests/baselines/reference/isolatedDeclarationsAddUndefined2.errors.txt @@ -0,0 +1,43 @@ +isolatedDeclarationsAddUndefined2.ts(4,29): error TS2314: Generic type 'Array' requires 1 type argument(s). +isolatedDeclarationsAddUndefined2.ts(8,29): error TS2314: Generic type 'Array' requires 1 type argument(s). +isolatedDeclarationsAddUndefined2.ts(12,28): error TS2314: Generic type 'Array' requires 1 type argument(s). +isolatedDeclarationsAddUndefined2.ts(16,28): error TS2314: Generic type 'Array' requires 1 type argument(s). +isolatedDeclarationsAddUndefined2.ts(19,27): error TS2314: Generic type 'Array' requires 1 type argument(s). +isolatedDeclarationsAddUndefined2.ts(21,27): error TS2304: Cannot find name 'Unresolved'. + + +==== isolatedDeclarationsAddUndefined2.ts (6 errors) ==== + // https://github.com/microsoft/TypeScript/issues/60123 + + export class Bar { + constructor(private x?: Array | undefined) {} + ~~~~~ +!!! error TS2314: Generic type 'Array' requires 1 type argument(s). + } + + export class Bar2 { + constructor(private x?: Array) {} + ~~~~~ +!!! error TS2314: Generic type 'Array' requires 1 type argument(s). + } + + export class Bar3 { + constructor(private x: Array | undefined) {} + ~~~~~ +!!! error TS2314: Generic type 'Array' requires 1 type argument(s). + } + + export class Bar4 { + constructor(private x: Array) {} + ~~~~~ +!!! error TS2314: Generic type 'Array' requires 1 type argument(s). + } + + export function test1(x?: Array | undefined): void {} + ~~~~~ +!!! error TS2314: Generic type 'Array' requires 1 type argument(s). + + export function test2(x?: Unresolved | undefined): void {} + ~~~~~~~~~~ +!!! error TS2304: Cannot find name 'Unresolved'. + \ No newline at end of file diff --git a/tests/baselines/reference/isolatedDeclarationsAddUndefined2.js b/tests/baselines/reference/isolatedDeclarationsAddUndefined2.js new file mode 100644 index 0000000000000..f6dee132eefe8 --- /dev/null +++ b/tests/baselines/reference/isolatedDeclarationsAddUndefined2.js @@ -0,0 +1,84 @@ +//// [tests/cases/compiler/isolatedDeclarationsAddUndefined2.ts] //// + +//// [isolatedDeclarationsAddUndefined2.ts] +// https://github.com/microsoft/TypeScript/issues/60123 + +export class Bar { + constructor(private x?: Array | undefined) {} +} + +export class Bar2 { + constructor(private x?: Array) {} +} + +export class Bar3 { + constructor(private x: Array | undefined) {} +} + +export class Bar4 { + constructor(private x: Array) {} +} + +export function test1(x?: Array | undefined): void {} + +export function test2(x?: Unresolved | undefined): void {} + + +//// [isolatedDeclarationsAddUndefined2.js] +"use strict"; +// https://github.com/microsoft/TypeScript/issues/60123 +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Bar4 = exports.Bar3 = exports.Bar2 = exports.Bar = void 0; +exports.test1 = test1; +exports.test2 = test2; +var Bar = /** @class */ (function () { + function Bar(x) { + this.x = x; + } + return Bar; +}()); +exports.Bar = Bar; +var Bar2 = /** @class */ (function () { + function Bar2(x) { + this.x = x; + } + return Bar2; +}()); +exports.Bar2 = Bar2; +var Bar3 = /** @class */ (function () { + function Bar3(x) { + this.x = x; + } + return Bar3; +}()); +exports.Bar3 = Bar3; +var Bar4 = /** @class */ (function () { + function Bar4(x) { + this.x = x; + } + return Bar4; +}()); +exports.Bar4 = Bar4; +function test1(x) { } +function test2(x) { } + + +//// [isolatedDeclarationsAddUndefined2.d.ts] +export declare class Bar { + private x?; + constructor(x?: Array | undefined); +} +export declare class Bar2 { + private x?; + constructor(x?: Array); +} +export declare class Bar3 { + private x; + constructor(x: Array | undefined); +} +export declare class Bar4 { + private x; + constructor(x: Array); +} +export declare function test1(x?: Array | undefined): void; +export declare function test2(x?: Unresolved | undefined): void; diff --git a/tests/baselines/reference/isolatedDeclarationsAddUndefined2.symbols b/tests/baselines/reference/isolatedDeclarationsAddUndefined2.symbols new file mode 100644 index 0000000000000..d5e1cf8643874 --- /dev/null +++ b/tests/baselines/reference/isolatedDeclarationsAddUndefined2.symbols @@ -0,0 +1,47 @@ +//// [tests/cases/compiler/isolatedDeclarationsAddUndefined2.ts] //// + +=== isolatedDeclarationsAddUndefined2.ts === +// https://github.com/microsoft/TypeScript/issues/60123 + +export class Bar { +>Bar : Symbol(Bar, Decl(isolatedDeclarationsAddUndefined2.ts, 0, 0)) + + constructor(private x?: Array | undefined) {} +>x : Symbol(Bar.x, Decl(isolatedDeclarationsAddUndefined2.ts, 3, 16)) +>Array : Symbol(Array, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --)) +} + +export class Bar2 { +>Bar2 : Symbol(Bar2, Decl(isolatedDeclarationsAddUndefined2.ts, 4, 1)) + + constructor(private x?: Array) {} +>x : Symbol(Bar2.x, Decl(isolatedDeclarationsAddUndefined2.ts, 7, 16)) +>Array : Symbol(Array, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --)) +} + +export class Bar3 { +>Bar3 : Symbol(Bar3, Decl(isolatedDeclarationsAddUndefined2.ts, 8, 1)) + + constructor(private x: Array | undefined) {} +>x : Symbol(Bar3.x, Decl(isolatedDeclarationsAddUndefined2.ts, 11, 16)) +>Array : Symbol(Array, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --)) +} + +export class Bar4 { +>Bar4 : Symbol(Bar4, Decl(isolatedDeclarationsAddUndefined2.ts, 12, 1)) + + constructor(private x: Array) {} +>x : Symbol(Bar4.x, Decl(isolatedDeclarationsAddUndefined2.ts, 15, 16)) +>Array : Symbol(Array, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --)) +} + +export function test1(x?: Array | undefined): void {} +>test1 : Symbol(test1, Decl(isolatedDeclarationsAddUndefined2.ts, 16, 1)) +>x : Symbol(x, Decl(isolatedDeclarationsAddUndefined2.ts, 18, 22)) +>Array : Symbol(Array, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --)) + +export function test2(x?: Unresolved | undefined): void {} +>test2 : Symbol(test2, Decl(isolatedDeclarationsAddUndefined2.ts, 18, 53)) +>x : Symbol(x, Decl(isolatedDeclarationsAddUndefined2.ts, 20, 22)) +>Unresolved : Symbol(Unresolved) + diff --git a/tests/baselines/reference/isolatedDeclarationsAddUndefined2.types b/tests/baselines/reference/isolatedDeclarationsAddUndefined2.types new file mode 100644 index 0000000000000..415b2a8056355 --- /dev/null +++ b/tests/baselines/reference/isolatedDeclarationsAddUndefined2.types @@ -0,0 +1,53 @@ +//// [tests/cases/compiler/isolatedDeclarationsAddUndefined2.ts] //// + +=== isolatedDeclarationsAddUndefined2.ts === +// https://github.com/microsoft/TypeScript/issues/60123 + +export class Bar { +>Bar : Bar +> : ^^^ + + constructor(private x?: Array | undefined) {} +>x : any +> : ^^^ +} + +export class Bar2 { +>Bar2 : Bar2 +> : ^^^^ + + constructor(private x?: Array) {} +>x : any +> : ^^^ +} + +export class Bar3 { +>Bar3 : Bar3 +> : ^^^^ + + constructor(private x: Array | undefined) {} +>x : any +> : ^^^ +} + +export class Bar4 { +>Bar4 : Bar4 +> : ^^^^ + + constructor(private x: Array) {} +>x : any +> : ^^^ +} + +export function test1(x?: Array | undefined): void {} +>test1 : (x?: Array | undefined) => void +> : ^ ^^^ ^^^^^ +>x : any +> : ^^^ + +export function test2(x?: Unresolved | undefined): void {} +>test2 : (x?: Unresolved | undefined) => void +> : ^ ^^^ ^^^^^ +>x : any +> : ^^^ + diff --git a/tests/cases/compiler/isolatedDeclarationsAddUndefined2.ts b/tests/cases/compiler/isolatedDeclarationsAddUndefined2.ts new file mode 100644 index 0000000000000..e49bc4a68ffe2 --- /dev/null +++ b/tests/cases/compiler/isolatedDeclarationsAddUndefined2.ts @@ -0,0 +1,25 @@ +// @isolatedDeclarations: true +// @declaration: true +// @strict: true + +// https://github.com/microsoft/TypeScript/issues/60123 + +export class Bar { + constructor(private x?: Array | undefined) {} +} + +export class Bar2 { + constructor(private x?: Array) {} +} + +export class Bar3 { + constructor(private x: Array | undefined) {} +} + +export class Bar4 { + constructor(private x: Array) {} +} + +export function test1(x?: Array | undefined): void {} + +export function test2(x?: Unresolved | undefined): void {} From 1936459e8b54af53febd0f199ff8e7333ff9f907 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Burzy=C5=84ski?= Date: Sat, 12 Oct 2024 00:12:06 +0200 Subject: [PATCH 2/2] add an extra test case --- .../reference/isolatedDeclarationsAddUndefined2.errors.txt | 7 ++++++- .../reference/isolatedDeclarationsAddUndefined2.js | 5 +++++ .../reference/isolatedDeclarationsAddUndefined2.symbols | 5 +++++ .../reference/isolatedDeclarationsAddUndefined2.types | 6 ++++++ tests/cases/compiler/isolatedDeclarationsAddUndefined2.ts | 2 ++ 5 files changed, 24 insertions(+), 1 deletion(-) diff --git a/tests/baselines/reference/isolatedDeclarationsAddUndefined2.errors.txt b/tests/baselines/reference/isolatedDeclarationsAddUndefined2.errors.txt index 790fd313ad2f8..638ebb2a8865c 100644 --- a/tests/baselines/reference/isolatedDeclarationsAddUndefined2.errors.txt +++ b/tests/baselines/reference/isolatedDeclarationsAddUndefined2.errors.txt @@ -4,9 +4,10 @@ isolatedDeclarationsAddUndefined2.ts(12,28): error TS2314: Generic type 'Array' requires 1 type argument(s). isolatedDeclarationsAddUndefined2.ts(19,27): error TS2314: Generic type 'Array' requires 1 type argument(s). isolatedDeclarationsAddUndefined2.ts(21,27): error TS2304: Cannot find name 'Unresolved'. +isolatedDeclarationsAddUndefined2.ts(23,27): error TS2304: Cannot find name 'Unresolved'. -==== isolatedDeclarationsAddUndefined2.ts (6 errors) ==== +==== isolatedDeclarationsAddUndefined2.ts (7 errors) ==== // https://github.com/microsoft/TypeScript/issues/60123 export class Bar { @@ -40,4 +41,8 @@ isolatedDeclarationsAddUndefined2.ts(21,27): error TS2304: Cannot find name 'Unr export function test2(x?: Unresolved | undefined): void {} ~~~~~~~~~~ !!! error TS2304: Cannot find name 'Unresolved'. + + export function test3(x?: Unresolved): void {} + ~~~~~~~~~~ +!!! error TS2304: Cannot find name 'Unresolved'. \ No newline at end of file diff --git a/tests/baselines/reference/isolatedDeclarationsAddUndefined2.js b/tests/baselines/reference/isolatedDeclarationsAddUndefined2.js index f6dee132eefe8..e3f3f7ef3dbcd 100644 --- a/tests/baselines/reference/isolatedDeclarationsAddUndefined2.js +++ b/tests/baselines/reference/isolatedDeclarationsAddUndefined2.js @@ -22,6 +22,8 @@ export class Bar4 { export function test1(x?: Array | undefined): void {} export function test2(x?: Unresolved | undefined): void {} + +export function test3(x?: Unresolved): void {} //// [isolatedDeclarationsAddUndefined2.js] @@ -31,6 +33,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); exports.Bar4 = exports.Bar3 = exports.Bar2 = exports.Bar = void 0; exports.test1 = test1; exports.test2 = test2; +exports.test3 = test3; var Bar = /** @class */ (function () { function Bar(x) { this.x = x; @@ -61,6 +64,7 @@ var Bar4 = /** @class */ (function () { exports.Bar4 = Bar4; function test1(x) { } function test2(x) { } +function test3(x) { } //// [isolatedDeclarationsAddUndefined2.d.ts] @@ -82,3 +86,4 @@ export declare class Bar4 { } export declare function test1(x?: Array | undefined): void; export declare function test2(x?: Unresolved | undefined): void; +export declare function test3(x?: Unresolved): void; diff --git a/tests/baselines/reference/isolatedDeclarationsAddUndefined2.symbols b/tests/baselines/reference/isolatedDeclarationsAddUndefined2.symbols index d5e1cf8643874..9778b309c7495 100644 --- a/tests/baselines/reference/isolatedDeclarationsAddUndefined2.symbols +++ b/tests/baselines/reference/isolatedDeclarationsAddUndefined2.symbols @@ -45,3 +45,8 @@ export function test2(x?: Unresolved | undefined): void {} >x : Symbol(x, Decl(isolatedDeclarationsAddUndefined2.ts, 20, 22)) >Unresolved : Symbol(Unresolved) +export function test3(x?: Unresolved): void {} +>test3 : Symbol(test3, Decl(isolatedDeclarationsAddUndefined2.ts, 20, 58)) +>x : Symbol(x, Decl(isolatedDeclarationsAddUndefined2.ts, 22, 22)) +>Unresolved : Symbol(Unresolved) + diff --git a/tests/baselines/reference/isolatedDeclarationsAddUndefined2.types b/tests/baselines/reference/isolatedDeclarationsAddUndefined2.types index 415b2a8056355..3c5dc94add3b2 100644 --- a/tests/baselines/reference/isolatedDeclarationsAddUndefined2.types +++ b/tests/baselines/reference/isolatedDeclarationsAddUndefined2.types @@ -51,3 +51,9 @@ export function test2(x?: Unresolved | undefined): void {} >x : any > : ^^^ +export function test3(x?: Unresolved): void {} +>test3 : (x?: any) => void +> : ^ ^^^^^^^^^^^ +>x : any +> : ^^^ + diff --git a/tests/cases/compiler/isolatedDeclarationsAddUndefined2.ts b/tests/cases/compiler/isolatedDeclarationsAddUndefined2.ts index e49bc4a68ffe2..ef28b2c542e25 100644 --- a/tests/cases/compiler/isolatedDeclarationsAddUndefined2.ts +++ b/tests/cases/compiler/isolatedDeclarationsAddUndefined2.ts @@ -23,3 +23,5 @@ export class Bar4 { export function test1(x?: Array | undefined): void {} export function test2(x?: Unresolved | undefined): void {} + +export function test3(x?: Unresolved): void {}