mirror of
https://github.com/microsoft/TypeScript.git
synced 2026-02-05 16:38:05 -06:00
Merge pull request #1676 from Microsoft/disallowOptionalBindingParameters
Disallow optional destructured parameters in implementation signatures.
This commit is contained in:
commit
5bcb52f9b0
@ -7212,6 +7212,9 @@ module ts {
|
||||
error(node, Diagnostics.A_parameter_property_is_only_allowed_in_a_constructor_implementation);
|
||||
}
|
||||
}
|
||||
if (node.questionToken && isBindingPattern(node.name) && func.body) {
|
||||
error(node, Diagnostics.A_binding_pattern_parameter_cannot_be_optional_in_an_implementation_signature);
|
||||
}
|
||||
if (node.dotDotDotToken) {
|
||||
if (!isArrayType(getTypeOfSymbol(node.symbol))) {
|
||||
error(node, Diagnostics.A_rest_parameter_must_be_of_an_array_type);
|
||||
|
||||
@ -298,6 +298,7 @@ module ts {
|
||||
Type_0_has_no_property_1: { code: 2460, category: DiagnosticCategory.Error, key: "Type '{0}' has no property '{1}'." },
|
||||
Type_0_is_not_an_array_type: { code: 2461, category: DiagnosticCategory.Error, key: "Type '{0}' is not an array type." },
|
||||
A_rest_element_must_be_last_in_an_array_destructuring_pattern: { code: 2462, category: DiagnosticCategory.Error, key: "A rest element must be last in an array destructuring pattern" },
|
||||
A_binding_pattern_parameter_cannot_be_optional_in_an_implementation_signature: { code: 2463, category: DiagnosticCategory.Error, key: "A binding pattern parameter cannot be optional in an implementation signature." },
|
||||
Import_declaration_0_is_using_private_name_1: { code: 4000, category: DiagnosticCategory.Error, key: "Import declaration '{0}' is using private name '{1}'." },
|
||||
Type_parameter_0_of_exported_class_has_or_is_using_private_name_1: { code: 4002, category: DiagnosticCategory.Error, key: "Type parameter '{0}' of exported class has or is using private name '{1}'." },
|
||||
Type_parameter_0_of_exported_interface_has_or_is_using_private_name_1: { code: 4004, category: DiagnosticCategory.Error, key: "Type parameter '{0}' of exported interface has or is using private name '{1}'." },
|
||||
|
||||
@ -1286,6 +1286,10 @@
|
||||
"category": "Error",
|
||||
"code": 2462
|
||||
},
|
||||
"A binding pattern parameter cannot be optional in an implementation signature.": {
|
||||
"category": "Error",
|
||||
"code": 2463
|
||||
},
|
||||
|
||||
"Import declaration '{0}' is using private name '{1}'.": {
|
||||
"category": "Error",
|
||||
|
||||
@ -0,0 +1,17 @@
|
||||
tests/cases/conformance/es6/destructuring/optionalBindingParameters1.ts(2,14): error TS2463: A binding pattern parameter cannot be optional in an implementation signature.
|
||||
tests/cases/conformance/es6/destructuring/optionalBindingParameters1.ts(8,5): error TS2345: Argument of type '[boolean, number, string]' is not assignable to parameter of type '[string, number, boolean]'.
|
||||
|
||||
|
||||
==== tests/cases/conformance/es6/destructuring/optionalBindingParameters1.ts (2 errors) ====
|
||||
|
||||
function foo([x,y,z]?: [string, number, boolean]) {
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
!!! error TS2463: A binding pattern parameter cannot be optional in an implementation signature.
|
||||
|
||||
}
|
||||
|
||||
foo(["", 0, false]);
|
||||
|
||||
foo([false, 0, ""]);
|
||||
~~~~~~~~~~~~~~
|
||||
!!! error TS2345: Argument of type '[boolean, number, string]' is not assignable to parameter of type '[string, number, boolean]'.
|
||||
16
tests/baselines/reference/optionalBindingParameters1.js
Normal file
16
tests/baselines/reference/optionalBindingParameters1.js
Normal file
@ -0,0 +1,16 @@
|
||||
//// [optionalBindingParameters1.ts]
|
||||
|
||||
function foo([x,y,z]?: [string, number, boolean]) {
|
||||
|
||||
}
|
||||
|
||||
foo(["", 0, false]);
|
||||
|
||||
foo([false, 0, ""]);
|
||||
|
||||
//// [optionalBindingParameters1.js]
|
||||
function foo(_a) {
|
||||
var x = _a[0], y = _a[1], z = _a[2];
|
||||
}
|
||||
foo(["", 0, false]);
|
||||
foo([false, 0, ""]);
|
||||
@ -0,0 +1,21 @@
|
||||
tests/cases/conformance/es6/destructuring/optionalBindingParameters2.ts(2,14): error TS2463: A binding pattern parameter cannot be optional in an implementation signature.
|
||||
tests/cases/conformance/es6/destructuring/optionalBindingParameters2.ts(8,5): error TS2345: Argument of type '{ x: boolean; y: number; z: string; }' is not assignable to parameter of type '{ x: string; y: number; z: boolean; }'.
|
||||
Types of property 'x' are incompatible.
|
||||
Type 'boolean' is not assignable to type 'string'.
|
||||
|
||||
|
||||
==== tests/cases/conformance/es6/destructuring/optionalBindingParameters2.ts (2 errors) ====
|
||||
|
||||
function foo({ x, y, z }?: { x: string; y: number; z: boolean }) {
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
!!! error TS2463: A binding pattern parameter cannot be optional in an implementation signature.
|
||||
|
||||
}
|
||||
|
||||
foo({ x: "", y: 0, z: false });
|
||||
|
||||
foo({ x: false, y: 0, z: "" });
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
!!! error TS2345: Argument of type '{ x: boolean; y: number; z: string; }' is not assignable to parameter of type '{ x: string; y: number; z: boolean; }'.
|
||||
!!! error TS2345: Types of property 'x' are incompatible.
|
||||
!!! error TS2345: Type 'boolean' is not assignable to type 'string'.
|
||||
16
tests/baselines/reference/optionalBindingParameters2.js
Normal file
16
tests/baselines/reference/optionalBindingParameters2.js
Normal file
@ -0,0 +1,16 @@
|
||||
//// [optionalBindingParameters2.ts]
|
||||
|
||||
function foo({ x, y, z }?: { x: string; y: number; z: boolean }) {
|
||||
|
||||
}
|
||||
|
||||
foo({ x: "", y: 0, z: false });
|
||||
|
||||
foo({ x: false, y: 0, z: "" });
|
||||
|
||||
//// [optionalBindingParameters2.js]
|
||||
function foo(_a) {
|
||||
var x = _a.x, y = _a.y, z = _a.z;
|
||||
}
|
||||
foo({ x: "", y: 0, z: false });
|
||||
foo({ x: false, y: 0, z: "" });
|
||||
@ -0,0 +1,15 @@
|
||||
tests/cases/conformance/es6/destructuring/optionalBindingParametersInOverloads1.ts(9,5): error TS2345: Argument of type '[boolean, number, string]' is not assignable to parameter of type '[string, number, boolean]'.
|
||||
|
||||
|
||||
==== tests/cases/conformance/es6/destructuring/optionalBindingParametersInOverloads1.ts (1 errors) ====
|
||||
|
||||
function foo([x, y, z] ?: [string, number, boolean]);
|
||||
function foo(...rest: any[]) {
|
||||
|
||||
}
|
||||
|
||||
foo(["", 0, false]);
|
||||
|
||||
foo([false, 0, ""]);
|
||||
~~~~~~~~~~~~~~
|
||||
!!! error TS2345: Argument of type '[boolean, number, string]' is not assignable to parameter of type '[string, number, boolean]'.
|
||||
@ -0,0 +1,20 @@
|
||||
//// [optionalBindingParametersInOverloads1.ts]
|
||||
|
||||
function foo([x, y, z] ?: [string, number, boolean]);
|
||||
function foo(...rest: any[]) {
|
||||
|
||||
}
|
||||
|
||||
foo(["", 0, false]);
|
||||
|
||||
foo([false, 0, ""]);
|
||||
|
||||
//// [optionalBindingParametersInOverloads1.js]
|
||||
function foo() {
|
||||
var rest = [];
|
||||
for (var _i = 0; _i < arguments.length; _i++) {
|
||||
rest[_i - 0] = arguments[_i];
|
||||
}
|
||||
}
|
||||
foo(["", 0, false]);
|
||||
foo([false, 0, ""]);
|
||||
@ -0,0 +1,19 @@
|
||||
tests/cases/conformance/es6/destructuring/optionalBindingParametersInOverloads2.ts(9,5): error TS2345: Argument of type '{ x: boolean; y: number; z: string; }' is not assignable to parameter of type '{ x: string; y: number; z: boolean; }'.
|
||||
Types of property 'x' are incompatible.
|
||||
Type 'boolean' is not assignable to type 'string'.
|
||||
|
||||
|
||||
==== tests/cases/conformance/es6/destructuring/optionalBindingParametersInOverloads2.ts (1 errors) ====
|
||||
|
||||
function foo({ x, y, z }?: { x: string; y: number; z: boolean });
|
||||
function foo(...rest: any[]) {
|
||||
|
||||
}
|
||||
|
||||
foo({ x: "", y: 0, z: false });
|
||||
|
||||
foo({ x: false, y: 0, z: "" });
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
!!! error TS2345: Argument of type '{ x: boolean; y: number; z: string; }' is not assignable to parameter of type '{ x: string; y: number; z: boolean; }'.
|
||||
!!! error TS2345: Types of property 'x' are incompatible.
|
||||
!!! error TS2345: Type 'boolean' is not assignable to type 'string'.
|
||||
@ -0,0 +1,20 @@
|
||||
//// [optionalBindingParametersInOverloads2.ts]
|
||||
|
||||
function foo({ x, y, z }?: { x: string; y: number; z: boolean });
|
||||
function foo(...rest: any[]) {
|
||||
|
||||
}
|
||||
|
||||
foo({ x: "", y: 0, z: false });
|
||||
|
||||
foo({ x: false, y: 0, z: "" });
|
||||
|
||||
//// [optionalBindingParametersInOverloads2.js]
|
||||
function foo() {
|
||||
var rest = [];
|
||||
for (var _i = 0; _i < arguments.length; _i++) {
|
||||
rest[_i - 0] = arguments[_i];
|
||||
}
|
||||
}
|
||||
foo({ x: "", y: 0, z: false });
|
||||
foo({ x: false, y: 0, z: "" });
|
||||
@ -0,0 +1,8 @@
|
||||
|
||||
function foo([x,y,z]?: [string, number, boolean]) {
|
||||
|
||||
}
|
||||
|
||||
foo(["", 0, false]);
|
||||
|
||||
foo([false, 0, ""]);
|
||||
@ -0,0 +1,8 @@
|
||||
|
||||
function foo({ x, y, z }?: { x: string; y: number; z: boolean }) {
|
||||
|
||||
}
|
||||
|
||||
foo({ x: "", y: 0, z: false });
|
||||
|
||||
foo({ x: false, y: 0, z: "" });
|
||||
@ -0,0 +1,9 @@
|
||||
|
||||
function foo([x, y, z] ?: [string, number, boolean]);
|
||||
function foo(...rest: any[]) {
|
||||
|
||||
}
|
||||
|
||||
foo(["", 0, false]);
|
||||
|
||||
foo([false, 0, ""]);
|
||||
@ -0,0 +1,9 @@
|
||||
|
||||
function foo({ x, y, z }?: { x: string; y: number; z: boolean });
|
||||
function foo(...rest: any[]) {
|
||||
|
||||
}
|
||||
|
||||
foo({ x: "", y: 0, z: false });
|
||||
|
||||
foo({ x: false, y: 0, z: "" });
|
||||
Loading…
x
Reference in New Issue
Block a user