From ef79b42b57bdd2ef4924331f701d5376f79405e8 Mon Sep 17 00:00:00 2001 From: Jake Bailey <5341706+jakebailey@users.noreply.github.com> Date: Tue, 21 Feb 2023 18:05:02 -0800 Subject: [PATCH] Don't emit binding pattern pattern / optional parameter error when an initializer is present (#52880) --- src/compiler/checker.ts | 2 +- .../reference/optionalBindingParameters4.symbols | 12 ++++++++++++ .../reference/optionalBindingParameters4.types | 13 +++++++++++++ .../es6/destructuring/optionalBindingParameters4.ts | 11 +++++++++++ 4 files changed, 37 insertions(+), 1 deletion(-) create mode 100644 tests/baselines/reference/optionalBindingParameters4.symbols create mode 100644 tests/baselines/reference/optionalBindingParameters4.types create mode 100644 tests/cases/conformance/es6/destructuring/optionalBindingParameters4.ts diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 06632f9394f..c0b9802d402 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -37648,7 +37648,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { error(node.name, Diagnostics.constructor_cannot_be_used_as_a_parameter_property_name); } } - if ((node.questionToken || isJSDocOptionalParameter(node)) && isBindingPattern(node.name) && (func as FunctionLikeDeclaration).body) { + if (!node.initializer && isOptionalDeclaration(node) && isBindingPattern(node.name) && (func as FunctionLikeDeclaration).body) { error(node, Diagnostics.A_binding_pattern_parameter_cannot_be_optional_in_an_implementation_signature); } if (node.name && isIdentifier(node.name) && (node.name.escapedText === "this" || node.name.escapedText === "new")) { diff --git a/tests/baselines/reference/optionalBindingParameters4.symbols b/tests/baselines/reference/optionalBindingParameters4.symbols new file mode 100644 index 00000000000..4ff4cd66c76 --- /dev/null +++ b/tests/baselines/reference/optionalBindingParameters4.symbols @@ -0,0 +1,12 @@ +=== /a.js === +/** +* @param {{ cause?: string }} [options] +*/ +function foo({ cause } = {}) { +>foo : Symbol(foo, Decl(a.js, 0, 0)) +>cause : Symbol(cause, Decl(a.js, 3, 14)) + + return cause; +>cause : Symbol(cause, Decl(a.js, 3, 14)) +} + diff --git a/tests/baselines/reference/optionalBindingParameters4.types b/tests/baselines/reference/optionalBindingParameters4.types new file mode 100644 index 00000000000..ddc4c1e8a72 --- /dev/null +++ b/tests/baselines/reference/optionalBindingParameters4.types @@ -0,0 +1,13 @@ +=== /a.js === +/** +* @param {{ cause?: string }} [options] +*/ +function foo({ cause } = {}) { +>foo : ({ cause }?: { cause?: string;}) => string +>cause : string +>{} : {} + + return cause; +>cause : string +} + diff --git a/tests/cases/conformance/es6/destructuring/optionalBindingParameters4.ts b/tests/cases/conformance/es6/destructuring/optionalBindingParameters4.ts new file mode 100644 index 00000000000..40a468ad287 --- /dev/null +++ b/tests/cases/conformance/es6/destructuring/optionalBindingParameters4.ts @@ -0,0 +1,11 @@ +// @checkJs: true +// @allowJs: true +// @noEmit: true +// @filename: /a.js + +/** +* @param {{ cause?: string }} [options] +*/ +function foo({ cause } = {}) { + return cause; +}