From 2c825fce0e797443fe9e5591d4aa0843c45959a8 Mon Sep 17 00:00:00 2001 From: Oleksandr T Date: Fri, 29 Jul 2022 17:50:18 +0300 Subject: [PATCH] fix(49869): throw an error on optional binding pattern parameter in JavaScript --- src/compiler/checker.ts | 2 +- .../optionalBindingParameters3.errors.txt | 16 ++++++++++++++++ .../reference/optionalBindingParameters3.symbols | 13 +++++++++++++ .../reference/optionalBindingParameters3.types | 14 ++++++++++++++ .../destructuring/optionalBindingParameters3.ts | 14 ++++++++++++++ 5 files changed, 58 insertions(+), 1 deletion(-) create mode 100644 tests/baselines/reference/optionalBindingParameters3.errors.txt create mode 100644 tests/baselines/reference/optionalBindingParameters3.symbols create mode 100644 tests/baselines/reference/optionalBindingParameters3.types create mode 100644 tests/cases/conformance/es6/destructuring/optionalBindingParameters3.ts diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 8556832569b76..a6f21c13f8251 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -35230,7 +35230,7 @@ namespace ts { error(node.name, Diagnostics.constructor_cannot_be_used_as_a_parameter_property_name); } } - if (node.questionToken && isBindingPattern(node.name) && (func as FunctionLikeDeclaration).body) { + if ((node.questionToken || isJSDocOptionalParameter(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/optionalBindingParameters3.errors.txt b/tests/baselines/reference/optionalBindingParameters3.errors.txt new file mode 100644 index 0000000000000..3e8e002141797 --- /dev/null +++ b/tests/baselines/reference/optionalBindingParameters3.errors.txt @@ -0,0 +1,16 @@ +/a.js(9,12): error TS2463: A binding pattern parameter cannot be optional in an implementation signature. + + +==== /a.js (1 errors) ==== + /** + * @typedef Foo + * @property {string} a + */ + + /** + * @param {Foo} [options] + */ + function f({ a = "a" }) {} + ~~~~~~~~~~~ +!!! error TS2463: A binding pattern parameter cannot be optional in an implementation signature. + \ No newline at end of file diff --git a/tests/baselines/reference/optionalBindingParameters3.symbols b/tests/baselines/reference/optionalBindingParameters3.symbols new file mode 100644 index 0000000000000..f8def8131fdaa --- /dev/null +++ b/tests/baselines/reference/optionalBindingParameters3.symbols @@ -0,0 +1,13 @@ +=== /a.js === +/** + * @typedef Foo + * @property {string} a + */ + +/** + * @param {Foo} [options] + */ +function f({ a = "a" }) {} +>f : Symbol(f, Decl(a.js, 0, 0)) +>a : Symbol(a, Decl(a.js, 8, 12)) + diff --git a/tests/baselines/reference/optionalBindingParameters3.types b/tests/baselines/reference/optionalBindingParameters3.types new file mode 100644 index 0000000000000..a67a838072694 --- /dev/null +++ b/tests/baselines/reference/optionalBindingParameters3.types @@ -0,0 +1,14 @@ +=== /a.js === +/** + * @typedef Foo + * @property {string} a + */ + +/** + * @param {Foo} [options] + */ +function f({ a = "a" }) {} +>f : ({ a }?: Foo) => void +>a : string +>"a" : "a" + diff --git a/tests/cases/conformance/es6/destructuring/optionalBindingParameters3.ts b/tests/cases/conformance/es6/destructuring/optionalBindingParameters3.ts new file mode 100644 index 0000000000000..0a8e5cf584e39 --- /dev/null +++ b/tests/cases/conformance/es6/destructuring/optionalBindingParameters3.ts @@ -0,0 +1,14 @@ +// @checkJs: true +// @allowJs: true +// @noEmit: true +// @filename: /a.js + +/** + * @typedef Foo + * @property {string} a + */ + +/** + * @param {Foo} [options] + */ +function f({ a = "a" }) {}