diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 4fcb0d15a5f06..1506c4809ef33 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -30413,9 +30413,15 @@ namespace ts { const parameterRange = hasRestParameter ? min : min < max ? min + "-" + max : min; - const error = hasRestParameter ? Diagnostics.Expected_at_least_0_arguments_but_got_1 - : parameterRange === 1 && args.length === 0 && isPromiseResolveArityError(node) ? Diagnostics.Expected_0_arguments_but_got_1_Did_you_forget_to_include_void_in_your_type_argument_to_Promise - : Diagnostics.Expected_0_arguments_but_got_1; + const isVoidPromiseError = !hasRestParameter && parameterRange === 1 && args.length === 0 && isPromiseResolveArityError(node); + if (isVoidPromiseError && isInJSFile(node)) { + return getDiagnosticForCallNode(node, Diagnostics.Expected_1_argument_but_got_0_new_Promise_needs_a_JSDoc_hint_to_produce_a_resolve_that_can_be_called_without_arguments); + } + const error = hasRestParameter + ? Diagnostics.Expected_at_least_0_arguments_but_got_1 + : isVoidPromiseError + ? Diagnostics.Expected_0_arguments_but_got_1_Did_you_forget_to_include_void_in_your_type_argument_to_Promise + : Diagnostics.Expected_0_arguments_but_got_1; if (min < args.length && args.length < max) { // between min and max, but with no matching overload return getDiagnosticForCallNode(node, Diagnostics.No_overload_expects_0_arguments_but_overloads_do_exist_that_expect_either_1_or_2_arguments, args.length, maxBelow, minAbove); diff --git a/src/compiler/diagnosticMessages.json b/src/compiler/diagnosticMessages.json index e8a765e514cb5..44fed63932db9 100644 --- a/src/compiler/diagnosticMessages.json +++ b/src/compiler/diagnosticMessages.json @@ -3369,6 +3369,10 @@ "category": "Error", "code": 2809 }, + "Expected 1 argument, but got 0. 'new Promise()' needs a JSDoc hint to produce a 'resolve' that can be called without arguments.": { + "category": "Error", + "code": 2810 + }, "Initializer for property '{0}'": { "category": "Error", "code": 2811 diff --git a/src/services/codefixes/fixAddVoidToPromise.ts b/src/services/codefixes/fixAddVoidToPromise.ts index 5e6add96dac81..b088f69594a3b 100644 --- a/src/services/codefixes/fixAddVoidToPromise.ts +++ b/src/services/codefixes/fixAddVoidToPromise.ts @@ -3,6 +3,7 @@ namespace ts.codefix { const fixName = "addVoidToPromise"; const fixId = "addVoidToPromise"; const errorCodes = [ + Diagnostics.Expected_1_argument_but_got_0_new_Promise_needs_a_JSDoc_hint_to_produce_a_resolve_that_can_be_called_without_arguments.code, Diagnostics.Expected_0_arguments_but_got_1_Did_you_forget_to_include_void_in_your_type_argument_to_Promise.code ]; registerCodeFix({ diff --git a/tests/cases/fourslash/codeFixAddVoidToPromiseJS.1.ts b/tests/cases/fourslash/codeFixAddVoidToPromiseJS.1.ts index 417506a510c17..42b4e07f4a612 100644 --- a/tests/cases/fourslash/codeFixAddVoidToPromiseJS.1.ts +++ b/tests/cases/fourslash/codeFixAddVoidToPromiseJS.1.ts @@ -9,7 +9,7 @@ ////const p1 = new Promise(resolve => resolve()); verify.codeFix({ - errorCode: 2794, + errorCode: 2810, description: "Add 'void' to Promise resolved without a value", index: 2, newFileContent: `const p1 = /** @type {Promise} */(new Promise(resolve => resolve()));` diff --git a/tests/cases/fourslash/codeFixAddVoidToPromiseJS.2.ts b/tests/cases/fourslash/codeFixAddVoidToPromiseJS.2.ts index f3bdbb635fece..d6d8a6ed9c3c6 100644 --- a/tests/cases/fourslash/codeFixAddVoidToPromiseJS.2.ts +++ b/tests/cases/fourslash/codeFixAddVoidToPromiseJS.2.ts @@ -9,7 +9,7 @@ ////const p2 = /** @type {Promise} */(new Promise(resolve => resolve())); verify.codeFix({ - errorCode: 2794, + errorCode: 2810, description: "Add 'void' to Promise resolved without a value", index: 2, newFileContent: `const p2 = /** @type {Promise} */(new Promise(resolve => resolve()));` diff --git a/tests/cases/fourslash/codeFixAddVoidToPromiseJS.3.ts b/tests/cases/fourslash/codeFixAddVoidToPromiseJS.3.ts index 92adfb610db48..59aa8f45e9b95 100644 --- a/tests/cases/fourslash/codeFixAddVoidToPromiseJS.3.ts +++ b/tests/cases/fourslash/codeFixAddVoidToPromiseJS.3.ts @@ -9,7 +9,7 @@ ////const p3 = /** @type {Promise} */(new Promise(resolve => resolve())); verify.codeFix({ - errorCode: 2794, + errorCode: 2810, description: "Add 'void' to Promise resolved without a value", index: 2, newFileContent: `const p3 = /** @type {Promise} */(new Promise(resolve => resolve()));` diff --git a/tests/cases/fourslash/codeFixAddVoidToPromiseJS.4.ts b/tests/cases/fourslash/codeFixAddVoidToPromiseJS.4.ts index 171e1135d1aec..7985d9febc885 100644 --- a/tests/cases/fourslash/codeFixAddVoidToPromiseJS.4.ts +++ b/tests/cases/fourslash/codeFixAddVoidToPromiseJS.4.ts @@ -9,7 +9,7 @@ ////const p4 = /** @type {Promise<{ x: number } & { y: string }>} */(new Promise(resolve => resolve())); verify.codeFix({ - errorCode: 2794, + errorCode: 2810, description: "Add 'void' to Promise resolved without a value", index: 2, newFileContent: `const p4 = /** @type {Promise<({ x: number } & { y: string }) | void>} */(new Promise(resolve => resolve()));`