Organize test files and add spec description in the comment

This commit is contained in:
Yui T
2015-04-16 10:21:49 -07:00
parent b29077a19b
commit 2499b3ebd5
28 changed files with 1171 additions and 1020 deletions
@@ -1,6 +1,5 @@
// <auto-generated />
/// <reference path="types.ts" />
/* @internal */
module ts {
export var Diagnostics = {
Unterminated_string_literal: { code: 1002, category: DiagnosticCategory.Error, key: "Unterminated string literal." },
@@ -1,37 +0,0 @@
tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration.ts(17,1): error TS2346: Supplied parameters do not match any signature of call target.
tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration.ts(18,4): error TS2345: Argument of type '{}' is not assignable to parameter of type '{ z: number; }'.
Property 'z' is missing in type '{}'.
tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration.ts(19,14): error TS2300: Duplicate identifier 'z'.
tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration.ts(19,18): error TS2300: Duplicate identifier 'z'.
==== tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration.ts (4 errors) ====
enum Foo { a }
function a({x, a}: { x: number, a: number }) { }
function a1({z: {x, y: {j}}}) { }
function a2({z: {x, y: {j}}} = { z: { x: "hi", y: { j: 1 } } }) { }
function a3({z} = {z:10}) { }
function a4({z=10}) { }
function a6({b}: { b: number|string|boolean } = { b: "hello" }) { }
a2();
a2({ z: { x: "hello" , y: { j: Foo.a } }});
a3();
a3({ z: Foo.a });
a4({});
a6({ b: 10 });
a6({ b: true });
// error
a4();
~~~~
!!! error TS2346: Supplied parameters do not match any signature of call target.
a3({});
~~
!!! error TS2345: Argument of type '{}' is not assignable to parameter of type '{ z: number; }'.
!!! error TS2345: Property 'z' is missing in type '{}'.
function a5([z], z: number) { }
~
!!! error TS2300: Duplicate identifier 'z'.
~
!!! error TS2300: Duplicate identifier 'z'.
@@ -1,58 +0,0 @@
//// [destructuringParameterDeclaration.ts]
enum Foo { a }
function a({x, a}: { x: number, a: number }) { }
function a1({z: {x, y: {j}}}) { }
function a2({z: {x, y: {j}}} = { z: { x: "hi", y: { j: 1 } } }) { }
function a3({z} = {z:10}) { }
function a4({z=10}) { }
function a6({b}: { b: number|string|boolean } = { b: "hello" }) { }
a2();
a2({ z: { x: "hello" , y: { j: Foo.a } }});
a3();
a3({ z: Foo.a });
a4({});
a6({ b: 10 });
a6({ b: true });
// error
a4();
a3({});
function a5([z], z: number) { }
//// [destructuringParameterDeclaration.js]
var Foo;
(function (Foo) {
Foo[Foo["a"] = 0] = "a";
})(Foo || (Foo = {}));
function a(_a) {
var x = _a.x, a = _a.a;
}
function a1(_a) {
var _b = _a.z, x = _b.x, j = _b.y.j;
}
function a2(_a) {
var _b = (_a === void 0 ? { z: { x: "hi", y: { j: 1 } } } : _a).z, x = _b.x, j = _b.y.j;
}
function a3(_a) {
var z = (_a === void 0 ? { z: 10 } : _a).z;
}
function a4(_a) {
var _b = _a.z, z = _b === void 0 ? 10 : _b;
}
function a6(_a) {
var b = (_a === void 0 ? { b: "hello" } : _a).b;
}
a2();
a2({ z: { x: "hello", y: { j: Foo.a } } });
a3();
a3({ z: Foo.a });
a4({});
a6({ b: 10 });
a6({ b: true });
// error
a4();
a3({});
function a5(_a, z) {
var z = _a[0];
}
@@ -1,48 +1,233 @@
tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration1.ts(5,16): error TS1048: A rest parameter cannot have an initializer.
tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration1.ts(11,13): error TS2370: A rest parameter must be of an array type.
tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration1.ts(12,18): error TS1047: A rest parameter cannot be optional.
tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration1.ts(13,17): error TS1048: A rest parameter cannot have an initializer.
tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration1.ts(16,19): error TS2345: Argument of type 'boolean' is not assignable to parameter of type 'string | number'.
Type 'boolean' is not assignable to type 'number'.
tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration1.ts(21,4): error TS2345: Argument of type 'string | boolean' is not assignable to parameter of type 'string | number'.
Type 'boolean' is not assignable to type 'string | number'.
tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration1.ts(7,10): error TS2393: Duplicate function implementation.
tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration1.ts(10,10): error TS2393: Duplicate function implementation.
tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration1.ts(14,4): error TS2345: Argument of type '(string | number | string[][])[]' is not assignable to parameter of type '{ x: number; a: number; }'.
Property 'x' is missing in type '(string | number | string[][])[]'.
tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration1.ts(14,29): error TS1005: ',' expected.
tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration1.ts(15,4): error TS2345: Argument of type '(string | number | string[][])[]' is not assignable to parameter of type '{ x: number; a: number; }'.
tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration1.ts(28,8): error TS2371: A parameter initializer is only allowed in a function or constructor implementation.
tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration1.ts(28,16): error TS2371: A parameter initializer is only allowed in a function or constructor implementation.
tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration1.ts(35,14): error TS2345: Argument of type '{ x: string; y: boolean; }' is not assignable to parameter of type '{ x: number; y: any; }'.
Types of property 'x' are incompatible.
Type 'string' is not assignable to type 'number'.
tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration1.ts(44,14): error TS2300: Duplicate identifier 'z'.
tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration1.ts(44,18): error TS2300: Duplicate identifier 'z'.
tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration1.ts(50,4): error TS2345: Argument of type '{ z: number; }' is not assignable to parameter of type '{ z: { x: any; y: { j: any; }; }; }'.
Types of property 'z' are incompatible.
Type 'number' is not assignable to type '{ x: any; y: { j: any; }; }'.
tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration1.ts(52,4): error TS2345: Argument of type '{}' is not assignable to parameter of type '{ z: number; }'.
Property 'z' is missing in type '{}'.
tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration1.ts(53,4): error TS2345: Argument of type '{ z: boolean; }' is not assignable to parameter of type '{ z: number; }'.
Types of property 'z' are incompatible.
Type 'boolean' is not assignable to type 'number'.
tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration1.ts(59,4): error TS2345: Argument of type '{ z: boolean; }' is not assignable to parameter of type '{ z?: number; }'.
Types of property 'z' are incompatible.
Type 'boolean' is not assignable to type 'number'.
tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration1.ts(62,4): error TS2345: Argument of type '{ b: boolean; }' is not assignable to parameter of type '{ b: string | number; }'.
Types of property 'b' are incompatible.
Type 'boolean' is not assignable to type 'string | number'.
Type 'boolean' is not assignable to type 'number'.
tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration1.ts(66,4): error TS2345: Argument of type '[number, number, boolean, boolean]' is not assignable to parameter of type '[any, any, [[any]]]'.
Types of property '2' are incompatible.
Type 'boolean' is not assignable to type '[[any]]'.
Property '0' is missing in type 'Boolean'.
tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration1.ts(68,4): error TS2345: Argument of type '[number, number, [[string]]]' is not assignable to parameter of type '[any, any, [[number]]]'.
Types of property '2' are incompatible.
Type '[[string]]' is not assignable to type '[[number]]'.
Types of property '0' are incompatible.
Type '[string]' is not assignable to type '[number]'.
Types of property '0' are incompatible.
Type 'string' is not assignable to type 'number'.
tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration1.ts(73,10): error TS2393: Duplicate function implementation.
tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration1.ts(74,10): error TS2393: Duplicate function implementation.
tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration1.ts(75,13): error TS2463: A binding pattern parameter cannot be optional in an implementation signature.
tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration1.ts(76,13): error TS2463: A binding pattern parameter cannot be optional in an implementation signature.
tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration1.ts(97,7): error TS2420: Class 'C4' incorrectly implements interface 'F2'.
Types of property 'd4' are incompatible.
Type '({x, y, c}: { x: any; y: any; c: any; }) => void' is not assignable to type '({x, y, z}?: { x: any; y: any; z: any; }) => any'.
Types of parameters '__0' and '__0' are incompatible.
Type '{ x: any; y: any; c: any; }' is not assignable to type '{ x: any; y: any; z: any; }'.
Property 'z' is missing in type '{ x: any; y: any; c: any; }'.
tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration1.ts(98,8): error TS2463: A binding pattern parameter cannot be optional in an implementation signature.
==== tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration1.ts (6 errors) ====
type arrayString = Array<String>
type someArray = Array<String> | number[];
type stringOrNumArray = Array<String|Number>;
==== tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration1.ts (23 errors) ====
// A parameter declaration may specify either an identifier or a binding pattern.
// The identifiers specified in parameter declarations and binding patterns
// in a parameter list must be unique within that parameter list.
function a3(...x = [1,2,3]) { }
~
!!! error TS1048: A rest parameter cannot have an initializer.
function a4(...x: (number|string)[]) { }
function a5(...a) { }
function a6(...a: Array<String>) { }
function a7(...a: arrayString) { }
function a8(...a: stringOrNumArray) { }
function a9(...a: someArray) { }
~~~~~~~~~~~~~~~
!!! error TS2370: A rest parameter must be of an array type.
function a10(...b?) { }
// If the declaration includes a type annotation, the parameter is of that type
function a0(x: number, y: string, z: boolean) { }
function a1([a, b, [[c]]]: [number, number, string[][]]) { }
~~
!!! error TS2393: Duplicate function implementation.
function a2(o: { x: number, a: number }) { }
function a3({j, k, l: {m, n}, q: [a, b, c]}: { j: number, k: string, l: { m: boolean, n: number }, q: (number|string)[] }) { };
function a1({x, a}: { x: number, a: number }) { }
~~
!!! error TS2393: Duplicate function implementation.
a1([1, 2, [["world"]]]);
a1([1, 2, [["world"]], 3]);
a1([1, "string", [["world"]]); // Error
~~~~~~~~~~~~~~~~~~~~~~~~~
!!! error TS2345: Argument of type '(string | number | string[][])[]' is not assignable to parameter of type '{ x: number; a: number; }'.
!!! error TS2345: Property 'x' is missing in type '(string | number | string[][])[]'.
~
!!! error TS1005: ',' expected.
a1([1, 2, [["world"]], "string"]); // Error
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
!!! error TS2345: Argument of type '(string | number | string[][])[]' is not assignable to parameter of type '{ x: number; a: number; }'.
// If the declaration includes an initializer expression (which is permitted only
// when the parameter list occurs in conjunction with a function body),
// the parameter type is the widened form (section 3.11) of the type of the initializer expression.
function b1(z = 10, y = 60, u = () => true) { }
function b2(z = [undefined, null]) { };
function b3(z = null, o = { x: 0, y: undefined }) { }
function b4({z: {x, y: {j}}} = { z: { x: "hi", y: { j: 1 } } }) { }
interface F1 {
b5(z = 10, [[a, b], d, {u}] = [[1, 2], "string", { u: false }]); // Error, no function body
~~~~~~
!!! error TS2371: A parameter initializer is only allowed in a function or constructor implementation.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
!!! error TS2371: A parameter initializer is only allowed in a function or constructor implementation.
b6(z, y, [, a, b], {p, m: { q, r}});
}
b2([1, 2, 3]); // z is widen to the type any[]
b3("string", { x: 200, y: "string" });
b3("string", { x: 200, y: true });
b3("string", { x: "string", y: true }); // Error
~~~~~~~~~~~~~~~~~~~~~~~~
!!! error TS2345: Argument of type '{ x: string; y: boolean; }' is not assignable to parameter of type '{ x: number; y: any; }'.
!!! error TS2345: Types of property 'x' are incompatible.
!!! error TS2345: Type 'string' is not assignable to type 'number'.
// If the declaration specifies a binding pattern, the parameter type is the implied type of that binding pattern (section 5.1.3)
enum Foo { a }
function c0({z: {x, y: {j}}}) { }
function c1({z} = { z: 10 }) { }
function c2({z = 10}) { }
function c3({b}: { b: number|string} = { b: "hello" }) { }
function c4([z], z: number) { } // Duplicate identifier
~
!!! error TS2300: Duplicate identifier 'z'.
~
!!! error TS1047: A rest parameter cannot be optional.
function a11(...b = [1,2,3]) { }
~
!!! error TS1048: A rest parameter cannot have an initializer.
!!! error TS2300: Duplicate identifier 'z'.
function c5([a, b, [[c]]]) { }
function c6([a, b, [[c=1]]]) { }
c0({z : { x: 1, y: { j: "world" } }}); // Implied type is { z: {x: any, y: {j: any}} }
c0({z : { x: "string", y: { j: true } }}); // Implied type is { z: {x: any, y: {j: any}} }
c0({z : 1}); // Error, implied type is { z: {x: any, y: {j: any}} }
~~~~~~~
!!! error TS2345: Argument of type '{ z: number; }' is not assignable to parameter of type '{ z: { x: any; y: { j: any; }; }; }'.
!!! error TS2345: Types of property 'z' are incompatible.
!!! error TS2345: Type 'number' is not assignable to type '{ x: any; y: { j: any; }; }'.
a4(1, 2, "hello", true);
~~~~
!!! error TS2345: Argument of type 'boolean' is not assignable to parameter of type 'string | number'.
!!! error TS2345: Type 'boolean' is not assignable to type 'number'.
var array = [1, 2, 3];
var array2 = [true, false, "hello"];
a5([...array]);
a4(...array);
a4(...array2);
c1({}); // Error, implied type is {z:number}?
~~
!!! error TS2345: Argument of type '{}' is not assignable to parameter of type '{ z: number; }'.
!!! error TS2345: Property 'z' is missing in type '{}'.
c1({ z: true }); // Error, implied type is {z:number}?
~~~~~~~~~~~
!!! error TS2345: Argument of type '{ z: boolean; }' is not assignable to parameter of type '{ z: number; }'.
!!! error TS2345: Types of property 'z' are incompatible.
!!! error TS2345: Type 'boolean' is not assignable to type 'number'.
c1(); // Implied type is {z:number}?
c1({ z: 1 }) // Implied type is {z:number}?
c2({}); // Implied type is {z?: number}
c2({z:1}); // Implied type is {z?: number}
c2({z:false}); // Error, implied type is {z?: number}
~~~~~~~~~
!!! error TS2345: Argument of type 'string | boolean' is not assignable to parameter of type 'string | number'.
!!! error TS2345: Type 'boolean' is not assignable to type 'string | number'.
!!! error TS2345: Type 'boolean' is not assignable to type 'number'.
!!! error TS2345: Argument of type '{ z: boolean; }' is not assignable to parameter of type '{ z?: number; }'.
!!! error TS2345: Types of property 'z' are incompatible.
!!! error TS2345: Type 'boolean' is not assignable to type 'number'.
c3({ b: 1 }); // Implied type is { b: number|string }.
c3({ b: true }); // Error, implied type is { b: number|string }.
~~~~~~~~~~~
!!! error TS2345: Argument of type '{ b: boolean; }' is not assignable to parameter of type '{ b: string | number; }'.
!!! error TS2345: Types of property 'b' are incompatible.
!!! error TS2345: Type 'boolean' is not assignable to type 'string | number'.
!!! error TS2345: Type 'boolean' is not assignable to type 'number'.
c5([1, 2, [["string"]]]); // Implied type is is [any, any, [[any]]]
c5([1, 2, [["string"]], false, true]); // Implied type is is [any, any, [[any]]]
c5([1, 2, false, true]); // Error, implied type is [any, any, [[any]]]
~~~~~~~~~~~~~~~~~~~
!!! error TS2345: Argument of type '[number, number, boolean, boolean]' is not assignable to parameter of type '[any, any, [[any]]]'.
!!! error TS2345: Types of property '2' are incompatible.
!!! error TS2345: Type 'boolean' is not assignable to type '[[any]]'.
!!! error TS2345: Property '0' is missing in type 'Boolean'.
c6([1, 2, [["string"]]]); // Error, implied type is [any, any, [[number]]] // Use initializer
~~~~~~~~~~~~~~~~~~~~
!!! error TS2345: Argument of type '[number, number, [[string]]]' is not assignable to parameter of type '[any, any, [[number]]]'.
!!! error TS2345: Types of property '2' are incompatible.
!!! error TS2345: Type '[[string]]' is not assignable to type '[[number]]'.
!!! error TS2345: Types of property '0' are incompatible.
!!! error TS2345: Type '[string]' is not assignable to type '[number]'.
!!! error TS2345: Types of property '0' are incompatible.
!!! error TS2345: Type 'string' is not assignable to type 'number'.
// A parameter can be marked optional by following its name or binding pattern with a question mark (?)
// or by including an initializer.
function d0(x?) { }
~~
!!! error TS2393: Duplicate function implementation.
function d0(x = 10) { }
~~
!!! error TS2393: Duplicate function implementation.
function d1([a, b, c]?) { }
~~~~~~~~~~
!!! error TS2463: A binding pattern parameter cannot be optional in an implementation signature.
function d2({x, y, z}?) { }
~~~~~~~~~~
!!! error TS2463: A binding pattern parameter cannot be optional in an implementation signature.
interface F2 {
d3([a, b, c]?);
d4({x, y, z}?);
e0([a, b, c]);
}
class C2 implements F2 {
constructor() { }
d3() { }
d4() { }
e0([a, b, c]) { }
}
class C3 implements F2 {
d3([a, b, c]) { }
d4({x, y, z}) { }
e0([a, b, c]) { }
}
class C4 implements F2 {
~~
!!! error TS2420: Class 'C4' incorrectly implements interface 'F2'.
!!! error TS2420: Types of property 'd4' are incompatible.
!!! error TS2420: Type '({x, y, c}: { x: any; y: any; c: any; }) => void' is not assignable to type '({x, y, z}?: { x: any; y: any; z: any; }) => any'.
!!! error TS2420: Types of parameters '__0' and '__0' are incompatible.
!!! error TS2420: Type '{ x: any; y: any; c: any; }' is not assignable to type '{ x: any; y: any; z: any; }'.
!!! error TS2420: Property 'z' is missing in type '{ x: any; y: any; c: any; }'.
d3([a, b, c]?) { }
~~~~~~~~~~
!!! error TS2463: A binding pattern parameter cannot be optional in an implementation signature.
d4({x, y, c}) { }
e0([a, b, q]) { }
}
function d5({x, y} = { x: 1, y: 2 }) { }
d5(); // Parameter is optional as its declaration included an initializer
@@ -1,86 +1,249 @@
//// [destructuringParameterDeclaration1.ts]
type arrayString = Array<String>
type someArray = Array<String> | number[];
type stringOrNumArray = Array<String|Number>;
// A parameter declaration may specify either an identifier or a binding pattern.
// The identifiers specified in parameter declarations and binding patterns
// in a parameter list must be unique within that parameter list.
function a3(...x = [1,2,3]) { }
function a4(...x: (number|string)[]) { }
function a5(...a) { }
function a6(...a: Array<String>) { }
function a7(...a: arrayString) { }
function a8(...a: stringOrNumArray) { }
function a9(...a: someArray) { }
function a10(...b?) { }
function a11(...b = [1,2,3]) { }
// If the declaration includes a type annotation, the parameter is of that type
function a0(x: number, y: string, z: boolean) { }
function a1([a, b, [[c]]]: [number, number, string[][]]) { }
function a2(o: { x: number, a: number }) { }
function a3({j, k, l: {m, n}, q: [a, b, c]}: { j: number, k: string, l: { m: boolean, n: number }, q: (number|string)[] }) { };
function a1({x, a}: { x: number, a: number }) { }
a1([1, 2, [["world"]]]);
a1([1, 2, [["world"]], 3]);
a1([1, "string", [["world"]]); // Error
a1([1, 2, [["world"]], "string"]); // Error
a4(1, 2, "hello", true);
var array = [1, 2, 3];
var array2 = [true, false, "hello"];
a5([...array]);
a4(...array);
a4(...array2);
// If the declaration includes an initializer expression (which is permitted only
// when the parameter list occurs in conjunction with a function body),
// the parameter type is the widened form (section 3.11) of the type of the initializer expression.
function b1(z = 10, y = 60, u = () => true) { }
function b2(z = [undefined, null]) { };
function b3(z = null, o = { x: 0, y: undefined }) { }
function b4({z: {x, y: {j}}} = { z: { x: "hi", y: { j: 1 } } }) { }
interface F1 {
b5(z = 10, [[a, b], d, {u}] = [[1, 2], "string", { u: false }]); // Error, no function body
b6(z, y, [, a, b], {p, m: { q, r}});
}
b2([1, 2, 3]); // z is widen to the type any[]
b3("string", { x: 200, y: "string" });
b3("string", { x: 200, y: true });
b3("string", { x: "string", y: true }); // Error
// If the declaration specifies a binding pattern, the parameter type is the implied type of that binding pattern (section 5.1.3)
enum Foo { a }
function c0({z: {x, y: {j}}}) { }
function c1({z} = { z: 10 }) { }
function c2({z = 10}) { }
function c3({b}: { b: number|string} = { b: "hello" }) { }
function c4([z], z: number) { } // Duplicate identifier
function c5([a, b, [[c]]]) { }
function c6([a, b, [[c=1]]]) { }
c0({z : { x: 1, y: { j: "world" } }}); // Implied type is { z: {x: any, y: {j: any}} }
c0({z : { x: "string", y: { j: true } }}); // Implied type is { z: {x: any, y: {j: any}} }
c0({z : 1}); // Error, implied type is { z: {x: any, y: {j: any}} }
c1({}); // Error, implied type is {z:number}?
c1({ z: true }); // Error, implied type is {z:number}?
c1(); // Implied type is {z:number}?
c1({ z: 1 }) // Implied type is {z:number}?
c2({}); // Implied type is {z?: number}
c2({z:1}); // Implied type is {z?: number}
c2({z:false}); // Error, implied type is {z?: number}
c3({ b: 1 }); // Implied type is { b: number|string }.
c3({ b: true }); // Error, implied type is { b: number|string }.
c5([1, 2, [["string"]]]); // Implied type is is [any, any, [[any]]]
c5([1, 2, [["string"]], false, true]); // Implied type is is [any, any, [[any]]]
c5([1, 2, false, true]); // Error, implied type is [any, any, [[any]]]
c6([1, 2, [["string"]]]); // Error, implied type is [any, any, [[number]]] // Use initializer
// A parameter can be marked optional by following its name or binding pattern with a question mark (?)
// or by including an initializer.
function d0(x?) { }
function d0(x = 10) { }
function d1([a, b, c]?) { }
function d2({x, y, z}?) { }
interface F2 {
d3([a, b, c]?);
d4({x, y, z}?);
e0([a, b, c]);
}
class C2 implements F2 {
constructor() { }
d3() { }
d4() { }
e0([a, b, c]) { }
}
class C3 implements F2 {
d3([a, b, c]) { }
d4({x, y, z}) { }
e0([a, b, c]) { }
}
class C4 implements F2 {
d3([a, b, c]?) { }
d4({x, y, c}) { }
e0([a, b, q]) { }
}
function d5({x, y} = { x: 1, y: 2 }) { }
d5(); // Parameter is optional as its declaration included an initializer
//// [destructuringParameterDeclaration1.js]
function a3() {
if (x === void 0) { x = [1, 2, 3]; }
var x = [];
for (var _i = 0; _i < arguments.length; _i++) {
x[_i - 0] = arguments[_i];
}
// A parameter declaration may specify either an identifier or a binding pattern.
// The identifiers specified in parameter declarations and binding patterns
// in a parameter list must be unique within that parameter list.
// If the declaration includes a type annotation, the parameter is of that type
function a0(x, y, z) { }
function a1(_a) {
var a = _a[0], b = _a[1], c = _a[2][0][0];
}
function a4() {
var x = [];
for (var _i = 0; _i < arguments.length; _i++) {
x[_i - 0] = arguments[_i];
}
function a2(o) { }
function a3(_a) {
var j = _a.j, k = _a.k, _b = _a.l, m = _b.m, n = _b.n, _c = _a.q, a = _c[0], b = _c[1], c = _c[2];
}
function a5() {
var a = [];
for (var _i = 0; _i < arguments.length; _i++) {
a[_i - 0] = arguments[_i];
}
;
function a1(_a) {
var x = _a.x, a = _a.a;
}
function a6() {
var a = [];
for (var _i = 0; _i < arguments.length; _i++) {
a[_i - 0] = arguments[_i];
}
a1([1, 2, [["world"]]]);
a1([1, 2, [["world"]], 3]);
a1([1, "string", [["world"]]]); // Error
a1([1, 2, [["world"]], "string"]); // Error
// If the declaration includes an initializer expression (which is permitted only
// when the parameter list occurs in conjunction with a function body),
// the parameter type is the widened form (section 3.11) of the type of the initializer expression.
function b1(z, y, u) {
if (z === void 0) { z = 10; }
if (y === void 0) { y = 60; }
if (u === void 0) { u = function () { return true; }; }
}
function a7() {
var a = [];
for (var _i = 0; _i < arguments.length; _i++) {
a[_i - 0] = arguments[_i];
}
function b2(z) {
if (z === void 0) { z = [undefined, null]; }
}
function a8() {
var a = [];
for (var _i = 0; _i < arguments.length; _i++) {
a[_i - 0] = arguments[_i];
}
;
function b3(z, o) {
if (z === void 0) { z = null; }
if (o === void 0) { o = { x: 0, y: undefined }; }
}
function a9() {
var a = [];
for (var _i = 0; _i < arguments.length; _i++) {
a[_i - 0] = arguments[_i];
}
function b4(_a) {
var _b = (_a === void 0 ? { z: { x: "hi", y: { j: 1 } } } : _a).z, x = _b.x, j = _b.y.j;
}
function a10() {
var b = [];
for (var _i = 0; _i < arguments.length; _i++) {
b[_i - 0] = arguments[_i];
}
b2([1, 2, 3]); // z is widen to the type any[]
b3("string", { x: 200, y: "string" });
b3("string", { x: 200, y: true });
b3("string", { x: "string", y: true }); // Error
// If the declaration specifies a binding pattern, the parameter type is the implied type of that binding pattern (section 5.1.3)
var Foo;
(function (Foo) {
Foo[Foo["a"] = 0] = "a";
})(Foo || (Foo = {}));
function c0(_a) {
var _b = _a.z, x = _b.x, j = _b.y.j;
}
function a11() {
if (b === void 0) { b = [1, 2, 3]; }
var b = [];
for (var _i = 0; _i < arguments.length; _i++) {
b[_i - 0] = arguments[_i];
}
function c1(_a) {
var z = (_a === void 0 ? { z: 10 } : _a).z;
}
a4(1, 2, "hello", true);
var array = [1, 2, 3];
var array2 = [true, false, "hello"];
a5(array);
a4.apply(void 0, array);
a4.apply(void 0, array2);
function c2(_a) {
var _b = _a.z, z = _b === void 0 ? 10 : _b;
}
function c3(_a) {
var b = (_a === void 0 ? { b: "hello" } : _a).b;
}
function c4(_a, z) {
var z = _a[0];
} // Duplicate identifier
function c5(_a) {
var a = _a[0], b = _a[1], c = _a[2][0][0];
}
function c6(_a) {
var a = _a[0], b = _a[1], _b = _a[2][0][0], c = _b === void 0 ? 1 : _b;
}
c0({ z: { x: 1, y: { j: "world" } } }); // Implied type is { z: {x: any, y: {j: any}} }
c0({ z: { x: "string", y: { j: true } } }); // Implied type is { z: {x: any, y: {j: any}} }
c0({ z: 1 }); // Error, implied type is { z: {x: any, y: {j: any}} }
c1({}); // Error, implied type is {z:number}?
c1({ z: true }); // Error, implied type is {z:number}?
c1(); // Implied type is {z:number}?
c1({ z: 1 }); // Implied type is {z:number}?
c2({}); // Implied type is {z?: number}
c2({ z: 1 }); // Implied type is {z?: number}
c2({ z: false }); // Error, implied type is {z?: number}
c3({ b: 1 }); // Implied type is { b: number|string }.
c3({ b: true }); // Error, implied type is { b: number|string }.
c5([1, 2, [["string"]]]); // Implied type is is [any, any, [[any]]]
c5([1, 2, [["string"]], false, true]); // Implied type is is [any, any, [[any]]]
c5([1, 2, false, true]); // Error, implied type is [any, any, [[any]]]
c6([1, 2, [["string"]]]); // Error, implied type is [any, any, [[number]]] // Use initializer
// A parameter can be marked optional by following its name or binding pattern with a question mark (?)
// or by including an initializer.
function d0(x) { }
function d0(x) {
if (x === void 0) { x = 10; }
}
function d1(_a) {
var a = _a[0], b = _a[1], c = _a[2];
}
function d2(_a) {
var x = _a.x, y = _a.y, z = _a.z;
}
var C2 = (function () {
function C2() {
}
C2.prototype.d3 = function () { };
C2.prototype.d4 = function () { };
C2.prototype.e0 = function (_a) {
var a = _a[0], b = _a[1], c = _a[2];
};
return C2;
})();
var C3 = (function () {
function C3() {
}
C3.prototype.d3 = function (_a) {
var a = _a[0], b = _a[1], c = _a[2];
};
C3.prototype.d4 = function (_a) {
var x = _a.x, y = _a.y, z = _a.z;
};
C3.prototype.e0 = function (_a) {
var a = _a[0], b = _a[1], c = _a[2];
};
return C3;
})();
var C4 = (function () {
function C4() {
}
C4.prototype.d3 = function (_a) {
var a = _a[0], b = _a[1], c = _a[2];
};
C4.prototype.d4 = function (_a) {
var x = _a.x, y = _a.y, c = _a.c;
};
C4.prototype.e0 = function (_a) {
var a = _a[0], b = _a[1], q = _a[2];
};
return C4;
})();
function d5(_a) {
var _b = _a === void 0 ? { x: 1, y: 2 } : _a, x = _b.x, y = _b.y;
}
d5(); // Parameter is optional as its declaration included an initializer
@@ -1,48 +0,0 @@
tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration1ES6.ts(5,16): error TS1048: A rest parameter cannot have an initializer.
tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration1ES6.ts(11,13): error TS2370: A rest parameter must be of an array type.
tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration1ES6.ts(12,18): error TS1047: A rest parameter cannot be optional.
tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration1ES6.ts(13,17): error TS1048: A rest parameter cannot have an initializer.
tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration1ES6.ts(16,19): error TS2345: Argument of type 'boolean' is not assignable to parameter of type 'string | number'.
Type 'boolean' is not assignable to type 'number'.
tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration1ES6.ts(21,4): error TS2345: Argument of type 'string | boolean' is not assignable to parameter of type 'string | number'.
Type 'boolean' is not assignable to type 'string | number'.
Type 'boolean' is not assignable to type 'number'.
==== tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration1ES6.ts (6 errors) ====
type arrayString = Array<String>
type someArray = Array<String> | number[];
type stringOrNumArray = Array<String|Number>;
function a3(...x = [1,2,3]) { }
~
!!! error TS1048: A rest parameter cannot have an initializer.
function a4(...x: (number|string)[]) { }
function a5(...a) { }
function a6(...a: Array<String>) { }
function a7(...a: arrayString) { }
function a8(...a: stringOrNumArray) { }
function a9(...a: someArray) { }
~~~~~~~~~~~~~~~
!!! error TS2370: A rest parameter must be of an array type.
function a10(...b?) { }
~
!!! error TS1047: A rest parameter cannot be optional.
function a11(...b = [1,2,3]) { }
~
!!! error TS1048: A rest parameter cannot have an initializer.
a4(1, 2, "hello", true);
~~~~
!!! error TS2345: Argument of type 'boolean' is not assignable to parameter of type 'string | number'.
!!! error TS2345: Type 'boolean' is not assignable to type 'number'.
var array = [1, 2, 3];
var array2 = [true, false, "hello"];
a5([...array]);
a4(...array);
a4(...array2);
~~~~~~~~~
!!! error TS2345: Argument of type 'string | boolean' is not assignable to parameter of type 'string | number'.
!!! error TS2345: Type 'boolean' is not assignable to type 'string | number'.
!!! error TS2345: Type 'boolean' is not assignable to type 'number'.
@@ -1,39 +0,0 @@
//// [destructuringParameterDeclaration1ES6.ts]
type arrayString = Array<String>
type someArray = Array<String> | number[];
type stringOrNumArray = Array<String|Number>;
function a3(...x = [1,2,3]) { }
function a4(...x: (number|string)[]) { }
function a5(...a) { }
function a6(...a: Array<String>) { }
function a7(...a: arrayString) { }
function a8(...a: stringOrNumArray) { }
function a9(...a: someArray) { }
function a10(...b?) { }
function a11(...b = [1,2,3]) { }
a4(1, 2, "hello", true);
var array = [1, 2, 3];
var array2 = [true, false, "hello"];
a5([...array]);
a4(...array);
a4(...array2);
//// [destructuringParameterDeclaration1ES6.js]
function a3(...x = [1, 2, 3]) { }
function a4(...x) { }
function a5(...a) { }
function a6(...a) { }
function a7(...a) { }
function a8(...a) { }
function a9(...a) { }
function a10(...b) { }
function a11(...b = [1, 2, 3]) { }
a4(1, 2, "hello", true);
var array = [1, 2, 3];
var array2 = [true, false, "hello"];
a5([...array]);
a4(...array);
a4(...array2);
@@ -1,56 +1,117 @@
tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration2.ts(6,14): error TS1181: Array element destructuring pattern expected.
tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration2.ts(6,19): error TS1005: '(' expected.
tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration2.ts(6,21): error TS1109: Expression expected.
tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration2.ts(6,24): error TS1005: '(' expected.
tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration2.ts(6,26): error TS2304: Cannot find name 'public'.
tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration2.ts(6,32): error TS1005: ';' expected.
tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration2.ts(6,33): error TS1128: Declaration or statement expected.
tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration2.ts(7,16): error TS1003: Identifier expected.
tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration2.ts(7,21): error TS1005: '(' expected.
tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration2.ts(9,13): error TS2370: A rest parameter must be of an array type.
tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration2.ts(12,24): error TS1005: ',' expected.
tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration2.ts(11,13): error TS2370: A rest parameter must be of an array type.
tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration2.ts(17,13): error TS2370: A rest parameter must be of an array type.
tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration2.ts(25,19): error TS2345: Argument of type 'boolean' is not assignable to parameter of type 'string | number'.
Type 'boolean' is not assignable to type 'number'.
tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration2.ts(30,4): error TS2345: Argument of type 'string | boolean' is not assignable to parameter of type 'string | number'.
Type 'boolean' is not assignable to type 'string | number'.
Type 'boolean' is not assignable to type 'number'.
tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration2.ts(33,4): error TS2345: Argument of type '[number, number, string, boolean, boolean]' is not assignable to parameter of type '[any, any, [[any]]]'.
Types of property '2' are incompatible.
Type 'string' is not assignable to type '[[any]]'.
Property '0' is missing in type 'String'.
tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration2.ts(34,4): error TS2345: Argument of type '[number, number]' is not assignable to parameter of type '[any, any, [[any]]]'.
Property '2' is missing in type '[number, number]'.
tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration2.ts(41,5): error TS2345: Argument of type '(string | number)[]' is not assignable to parameter of type 'number[]'.
Type 'string | number' is not assignable to type 'number'.
Type 'string' is not assignable to type 'number'.
tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration2.ts(45,24): error TS1005: ',' expected.
tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration2.ts(50,1): error TS2453: The type argument for type parameter 'T' cannot be inferred from the usage. Consider specifying the type arguments explicitly.
Type argument candidate 'string' is not a valid type argument because it is not a supertype of candidate 'number'.
tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration2.ts(59,1): error TS2453: The type argument for type parameter 'T' cannot be inferred from the usage. Consider specifying the type arguments explicitly.
Type argument candidate 'number' is not a valid type argument because it is not a supertype of candidate 'string'.
==== tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration2.ts (11 errors) ====
"use strict"
function a({while}) { }
function a1({public}) { }
function a2({public: x}) { }
function a3({while: y}) { }
function a4([while, for, public]){ }
~~~~~
!!! error TS1181: Array element destructuring pattern expected.
~
!!! error TS1005: '(' expected.
~~~
!!! error TS1109: Expression expected.
~
!!! error TS1005: '(' expected.
~~~~~~
!!! error TS2304: Cannot find name 'public'.
~
!!! error TS1005: ';' expected.
~
!!! error TS1128: Declaration or statement expected.
function a5(...while) { }
~~~~~
!!! error TS1003: Identifier expected.
~
!!! error TS1005: '(' expected.
function a6(...public) { }
function a7(...a: string) { }
~~~~~~~~~~~~
==== tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration2.ts (10 errors) ====
// If the parameter is a rest parameter, the parameter type is any[]
// A type annotation for a rest parameter must denote an array type.
// RestParameter:
// ... Identifier TypeAnnotation(opt)
type arrayString = Array<String>
type someArray = Array<String> | number[];
type stringOrNumArray = Array<String|Number>;
function a0(...x: [number, number, string]) { } // Error, rest parameter must be array type
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
!!! error TS2370: A rest parameter must be of an array type.
function a1(...x: (number|string)[]) { }
function a2(...a) { }
function a3(...a: Array<String>) { }
function a4(...a: arrayString) { }
function a5(...a: stringOrNumArray) { }
function a6(...a: someArray) { } // Error, rest parameter must be array type
~~~~~~~~~~~~~~~
!!! error TS2370: A rest parameter must be of an array type.
function a7(...b?) { } // Error, can't be optional
function a8(...b = [1,2,3]) { } // Error, can't have initializer
function a9([a, b, [[c]]]) { }
function a10([a, b, [[c]], ...x]) { }
function a11([a, b, c, ...x]: number[]) { }
a1(1, 2, "hello", true); // Error, parameter type is (number|string)[]
~~~~
!!! error TS2345: Argument of type 'boolean' is not assignable to parameter of type 'string | number'.
!!! error TS2345: Type 'boolean' is not assignable to type 'number'.
var array = [1, 2, 3];
var array2 = [true, false, "hello"];
a2([...array]);
a1(...array);
a1(...array2); // Error parameter type is (number|string)[]
~~~~~~~~~
!!! error TS2345: Argument of type 'string | boolean' is not assignable to parameter of type 'string | number'.
!!! error TS2345: Type 'boolean' is not assignable to type 'string | number'.
!!! error TS2345: Type 'boolean' is not assignable to type 'number'.
a9([1, 2, [["string"]], false, true]); // Parameter type is [any, any, [[any]]]
a9([1, 2, "string", false, true]); // Error, parameter type is [any, any, [[any]]]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
!!! error TS2345: Argument of type '[number, number, string, boolean, boolean]' is not assignable to parameter of type '[any, any, [[any]]]'.
!!! error TS2345: Types of property '2' are incompatible.
!!! error TS2345: Type 'string' is not assignable to type '[[any]]'.
!!! error TS2345: Property '0' is missing in type 'String'.
a9([1, 2]); // Error, parameter type is [any, any, [[any]]]
~~~~~~
!!! error TS2345: Argument of type '[number, number]' is not assignable to parameter of type '[any, any, [[any]]]'.
!!! error TS2345: Property '2' is missing in type '[number, number]'.
a10([1, 2, [["string"]], false, true]); // Parameter type is any[]
a10([1, 2, 3, false, true]); // Parameter type is any[]
a10([1, 2]); // Parameter type is any[]
a11([1, 2]); // Parameter type is number[]
a11([1, 2, "string"]); // Error, parameter type is number[]
~~~~~~~~~~~~~~~~
!!! error TS2345: Argument of type '(string | number)[]' is not assignable to parameter of type 'number[]'.
!!! error TS2345: Type 'string | number' is not assignable to type 'number'.
!!! error TS2345: Type 'string' is not assignable to type 'number'.
class C {
constructor(public ...a) { }
constructor(public ...a) { } // Rest parameter can't have accessibilityModifier
~~~
!!! error TS1005: ',' expected.
}
// Rest parameter with generic
function foo<T>(...a: T[]) { }
foo("hello", 1, 2); // Error
~~~
!!! error TS2453: The type argument for type parameter 'T' cannot be inferred from the usage. Consider specifying the type arguments explicitly.
!!! error TS2453: Type argument candidate 'string' is not a valid type argument because it is not a supertype of candidate 'number'.
foo<number|string>("hello", 1, 2);
foo("hello", "world");
enum E { a, b }
const enum E1 { a, b }
function foo1<T extends Number>(...a: T[]) { }
foo1(1, 2, 3, E.a);
foo1(1, 2, 3, E1.a, E.b);
foo1(1, 2, "string", E1.a, E.b); // Error
~~~~
!!! error TS2453: The type argument for type parameter 'T' cannot be inferred from the usage. Consider specifying the type arguments explicitly.
!!! error TS2453: Type argument candidate 'number' is not a valid type argument because it is not a supertype of candidate 'string'.
a2({ public: 1 });
a3({ while: 1 });
a({ while: 1 });
@@ -1,65 +1,178 @@
//// [destructuringParameterDeclaration2.ts]
"use strict"
function a({while}) { }
function a1({public}) { }
function a2({public: x}) { }
function a3({while: y}) { }
function a4([while, for, public]){ }
function a5(...while) { }
function a6(...public) { }
function a7(...a: string) { }
// If the parameter is a rest parameter, the parameter type is any[]
// A type annotation for a rest parameter must denote an array type.
// RestParameter:
// ... Identifier TypeAnnotation(opt)
type arrayString = Array<String>
type someArray = Array<String> | number[];
type stringOrNumArray = Array<String|Number>;
function a0(...x: [number, number, string]) { } // Error, rest parameter must be array type
function a1(...x: (number|string)[]) { }
function a2(...a) { }
function a3(...a: Array<String>) { }
function a4(...a: arrayString) { }
function a5(...a: stringOrNumArray) { }
function a6(...a: someArray) { } // Error, rest parameter must be array type
function a7(...b?) { } // Error, can't be optional
function a8(...b = [1,2,3]) { } // Error, can't have initializer
function a9([a, b, [[c]]]) { }
function a10([a, b, [[c]], ...x]) { }
function a11([a, b, c, ...x]: number[]) { }
a1(1, 2, "hello", true); // Error, parameter type is (number|string)[]
var array = [1, 2, 3];
var array2 = [true, false, "hello"];
a2([...array]);
a1(...array);
a1(...array2); // Error parameter type is (number|string)[]
a9([1, 2, [["string"]], false, true]); // Parameter type is [any, any, [[any]]]
a9([1, 2, "string", false, true]); // Error, parameter type is [any, any, [[any]]]
a9([1, 2]); // Error, parameter type is [any, any, [[any]]]
a10([1, 2, [["string"]], false, true]); // Parameter type is any[]
a10([1, 2, 3, false, true]); // Parameter type is any[]
a10([1, 2]); // Parameter type is any[]
a11([1, 2]); // Parameter type is number[]
a11([1, 2, "string"]); // Error, parameter type is number[]
class C {
constructor(public ...a) { }
constructor(public ...a) { } // Rest parameter can't have accessibilityModifier
}
// Rest parameter with generic
function foo<T>(...a: T[]) { }
foo("hello", 1, 2); // Error
foo<number|string>("hello", 1, 2);
foo("hello", "world");
enum E { a, b }
const enum E1 { a, b }
function foo1<T extends Number>(...a: T[]) { }
foo1(1, 2, 3, E.a);
foo1(1, 2, 3, E1.a, E.b);
foo1(1, 2, "string", E1.a, E.b); // Error
a2({ public: 1 });
a3({ while: 1 });
a({ while: 1 });
//// [destructuringParameterDeclaration2.js]
"use strict";
function a(_a) {
var while = _a.while;
}
function a1(_a) {
var public = _a.public;
}
function a2(_a) {
var x = _a.public;
}
function a3(_a) {
var y = _a.while;
}
while (, )
for (, public; ; )
;
{ }
while () { }
function a6() {
var public = [];
// If the parameter is a rest parameter, the parameter type is any[]
// A type annotation for a rest parameter must denote an array type.
function a0() {
var x = [];
for (var _i = 0; _i < arguments.length; _i++) {
public[_i - 0] = arguments[_i];
x[_i - 0] = arguments[_i];
}
} // Error, rest parameter must be array type
function a1() {
var x = [];
for (var _i = 0; _i < arguments.length; _i++) {
x[_i - 0] = arguments[_i];
}
}
function a7() {
function a2() {
var a = [];
for (var _i = 0; _i < arguments.length; _i++) {
a[_i - 0] = arguments[_i];
}
}
function a3() {
var a = [];
for (var _i = 0; _i < arguments.length; _i++) {
a[_i - 0] = arguments[_i];
}
}
function a4() {
var a = [];
for (var _i = 0; _i < arguments.length; _i++) {
a[_i - 0] = arguments[_i];
}
}
function a5() {
var a = [];
for (var _i = 0; _i < arguments.length; _i++) {
a[_i - 0] = arguments[_i];
}
}
function a6() {
var a = [];
for (var _i = 0; _i < arguments.length; _i++) {
a[_i - 0] = arguments[_i];
}
} // Error, rest parameter must be array type
function a7() {
var b = [];
for (var _i = 0; _i < arguments.length; _i++) {
b[_i - 0] = arguments[_i];
}
} // Error, can't be optional
function a8() {
if (b === void 0) { b = [1, 2, 3]; }
var b = [];
for (var _i = 0; _i < arguments.length; _i++) {
b[_i - 0] = arguments[_i];
}
} // Error, can't have initializer
function a9(_a) {
var a = _a[0], b = _a[1], c = _a[2][0][0];
}
function a10(_a) {
var a = _a[0], b = _a[1], c = _a[2][0][0], x = _a.slice(3);
}
function a11(_a) {
var a = _a[0], b = _a[1], c = _a[2], x = _a.slice(3);
}
a1(1, 2, "hello", true); // Error, parameter type is (number|string)[]
var array = [1, 2, 3];
var array2 = [true, false, "hello"];
a2(array);
a1.apply(void 0, array);
a1.apply(void 0, array2); // Error parameter type is (number|string)[]
a9([1, 2, [["string"]], false, true]); // Parameter type is [any, any, [[any]]]
a9([1, 2, "string", false, true]); // Error, parameter type is [any, any, [[any]]]
a9([1, 2]); // Error, parameter type is [any, any, [[any]]]
a10([1, 2, [["string"]], false, true]); // Parameter type is any[]
a10([1, 2, 3, false, true]); // Parameter type is any[]
a10([1, 2]); // Parameter type is any[]
a11([1, 2]); // Parameter type is number[]
a11([1, 2, "string"]); // Error, parameter type is number[]
var C = (function () {
function C(public) {
var a = [];
for (var _i = 1; _i < arguments.length; _i++) {
a[_i - 1] = arguments[_i];
}
}
} // Rest parameter can't have accessibilityModifier
return C;
})();
a2({ public: 1 });
a3({ while: 1 });
a({ while: 1 });
// Rest parameter with generic
function foo() {
var a = [];
for (var _i = 0; _i < arguments.length; _i++) {
a[_i - 0] = arguments[_i];
}
}
foo("hello", 1, 2); // Error
foo("hello", 1, 2);
foo("hello", "world");
var E;
(function (E) {
E[E["a"] = 0] = "a";
E[E["b"] = 1] = "b";
})(E || (E = {}));
function foo1() {
var a = [];
for (var _i = 0; _i < arguments.length; _i++) {
a[_i - 0] = arguments[_i];
}
}
foo1(1, 2, 3, E.a);
foo1(1, 2, 3, 0 /* a */, E.b);
foo1(1, 2, "string", 0 /* a */, E.b); // Error
@@ -1,42 +0,0 @@
//// [destructuringParameterDeclaration2ES6.ts]
"use strict"
function a({while}) { }
function a1({public}) { }
function a2({public: x}) { }
function a3({while: y}) { }
function a4([while, for, public]){ }
function a5(...while) { }
function a6(...public) { }
function a7(...a: string) { }
class C {
constructor(public ...a) { }
}
a2({ public: 1 });
a3({ while: 1 });
a({ while: 1 });
//// [destructuringParameterDeclaration2ES6.js]
"use strict";
function a({ while }) { }
function a1({ public }) { }
function a2({ public: x }) { }
function a3({ while: y }) { }
while (, )
for (, public; ; )
;
{ }
while () { }
function a6(...public) { }
function a7(...a) { }
class C {
constructor(public, ...a) {
}
}
a2({ public: 1 });
a3({ while: 1 });
a({ while: 1 });
@@ -1,22 +1,24 @@
tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration2ES6.ts(6,14): error TS1181: Array element destructuring pattern expected.
tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration2ES6.ts(6,19): error TS1005: '(' expected.
tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration2ES6.ts(6,21): error TS1109: Expression expected.
tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration2ES6.ts(6,24): error TS1005: '(' expected.
tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration2ES6.ts(6,26): error TS2304: Cannot find name 'public'.
tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration2ES6.ts(6,32): error TS1005: ';' expected.
tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration2ES6.ts(6,33): error TS1128: Declaration or statement expected.
tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration2ES6.ts(7,16): error TS1003: Identifier expected.
tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration2ES6.ts(7,21): error TS1005: '(' expected.
tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration2ES6.ts(9,13): error TS2370: A rest parameter must be of an array type.
tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration2ES6.ts(12,24): error TS1005: ',' expected.
tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration3.ts(9,14): error TS1181: Array element destructuring pattern expected.
tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration3.ts(9,19): error TS1005: '(' expected.
tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration3.ts(9,21): error TS1109: Expression expected.
tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration3.ts(9,24): error TS1005: '(' expected.
tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration3.ts(9,26): error TS2304: Cannot find name 'public'.
tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration3.ts(9,32): error TS1005: ';' expected.
tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration3.ts(9,33): error TS1128: Declaration or statement expected.
tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration3.ts(10,16): error TS1003: Identifier expected.
tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration3.ts(10,21): error TS1005: '(' expected.
tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration3.ts(12,13): error TS2370: A rest parameter must be of an array type.
==== tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration2ES6.ts (11 errors) ====
==== tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration3.ts (10 errors) ====
// A parameter declaration may specify either an identifier or a binding pattern.
// Reserved words are not allowed to be used as an identifier in parameter declaration
"use strict"
// Error
function a({while}) { }
function a1({public}) { }
function a2({public: x}) { }
function a3({while: y}) { }
function a4([while, for, public]){ }
~~~~~
!!! error TS1181: Array element destructuring pattern expected.
@@ -41,16 +43,12 @@ tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration2ES6.
function a7(...a: string) { }
~~~~~~~~~~~~
!!! error TS2370: A rest parameter must be of an array type.
class C {
constructor(public ...a) { }
~~~
!!! error TS1005: ',' expected.
}
a2({ public: 1 });
a3({ while: 1 });
a({ while: 1 });
// No Error
function b1({public: x}) { }
function b2({while: y}) { }
b1({ public: 1 });
b2({ while: 1 });
@@ -1,51 +1,61 @@
//// [destructuringParameterDeclaration3.ts]
function a([x, [y, z], [[j]]]) {
return [x, y, z, j];
}
// A parameter declaration may specify either an identifier or a binding pattern.
function a1([...x]) {
return [x];
}
// Reserved words are not allowed to be used as an identifier in parameter declaration
"use strict"
function a2({public} = { "public": "1" }) {
return public;
}
// Error
function a({while}) { }
function a1({public}) { }
function a4([while, for, public]){ }
function a5(...while) { }
function a6(...public) { }
function a7(...a: string) { }
a({ while: 1 });
function a3({x: { y, z}, j: {k: {a}} }) {
return [y, z, a];
}
// No Error
function b1({public: x}) { }
function b2({while: y}) { }
b1({ public: 1 });
b2({ while: 1 });
function a4({x: { y, z}, j: {k: {a}} } = { x: { y: 1, z: 1 }, j: { k: { a: "hello" } } }): (number| string) [] {
return [y, z, a];
}
function a5({x: { y, z}, j: {k: {a}} }): (number| string) [] {
return [y, z, a];
}
//// [destructuringParameterDeclaration3.js]
// A parameter declaration may specify either an identifier or a binding pattern.
// Reserved words are not allowed to be used as an identifier in parameter declaration
"use strict";
// Error
function a(_a) {
var x = _a[0], _b = _a[1], y = _b[0], z = _b[1], j = _a[2][0][0];
return [x, y, z, j];
var while = _a.while;
}
function a1(_a) {
var x = _a.slice(0);
return [x];
var public = _a.public;
}
function a2(_a) {
var public = (_a === void 0 ? { "public": "1" } : _a).public;
return public;
while (, )
for (, public; ; )
;
{ }
while () { }
function a6() {
var public = [];
for (var _i = 0; _i < arguments.length; _i++) {
public[_i - 0] = arguments[_i];
}
}
function a3(_a) {
var _b = _a.x, y = _b.y, z = _b.z, a = _a.j.k.a;
return [y, z, a];
function a7() {
var a = [];
for (var _i = 0; _i < arguments.length; _i++) {
a[_i - 0] = arguments[_i];
}
}
function a4(_a) {
var _b = _a === void 0 ? { x: { y: 1, z: 1 }, j: { k: { a: "hello" } } } : _a, _c = _b.x, y = _c.y, z = _c.z, a = _b.j.k.a;
return [y, z, a];
a({ while: 1 });
// No Error
function b1(_a) {
var x = _a.public;
}
function a5(_a) {
var _b = _a.x, y = _b.y, z = _b.z, a = _a.j.k.a;
return [y, z, a];
function b2(_a) {
var y = _a.while;
}
b1({ public: 1 });
b2({ while: 1 });
@@ -1,92 +0,0 @@
=== tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration3.ts ===
function a([x, [y, z], [[j]]]) {
>a : ([x, [y, z], [[j]]]: [any, [any, any], [[any]]]) => any[]
>x : any
>y : any
>z : any
>j : any
return [x, y, z, j];
>[x, y, z, j] : any[]
>x : any
>y : any
>z : any
>j : any
}
function a1([...x]) {
>a1 : ([...x]: any[]) => any[][]
>x : any[]
return [x];
>[x] : any[][]
>x : any[]
}
function a2({public} = { "public": "1" }) {
>a2 : ({public}?: { "public": string; }) => string
>public : string
>{ "public": "1" } : { "public": string; }
return public;
>public : string
}
function a3({x: { y, z}, j: {k: {a}} }) {
>a3 : ({x: { y, z}, j: {k: {a}} }: { x: { y: any; z: any; }; j: { k: { a: any; }; }; }) => any[]
>x : unknown
>y : any
>z : any
>j : unknown
>k : unknown
>a : any
return [y, z, a];
>[y, z, a] : any[]
>y : any
>z : any
>a : any
}
function a4({x: { y, z}, j: {k: {a}} } = { x: { y: 1, z: 1 }, j: { k: { a: "hello" } } }): (number| string) [] {
>a4 : ({x: { y, z}, j: {k: {a}} }?: { x: { y: number; z: number; }; j: { k: { a: string; }; }; }) => (string | number)[]
>x : unknown
>y : number
>z : number
>j : unknown
>k : unknown
>a : string
>{ x: { y: 1, z: 1 }, j: { k: { a: "hello" } } } : { x: { y: number; z: number; }; j: { k: { a: string; }; }; }
>x : { y: number; z: number; }
>{ y: 1, z: 1 } : { y: number; z: number; }
>y : number
>z : number
>j : { k: { a: string; }; }
>{ k: { a: "hello" } } : { k: { a: string; }; }
>k : { a: string; }
>{ a: "hello" } : { a: string; }
>a : string
return [y, z, a];
>[y, z, a] : (string | number)[]
>y : number
>z : number
>a : string
}
function a5({x: { y, z}, j: {k: {a}} }): (number| string) [] {
>a5 : ({x: { y, z}, j: {k: {a}} }: { x: { y: any; z: any; }; j: { k: { a: any; }; }; }) => (string | number)[]
>x : unknown
>y : any
>z : any
>j : unknown
>k : unknown
>a : any
return [y, z, a];
>[y, z, a] : any[]
>y : any
>z : any
>a : any
}
@@ -1,45 +0,0 @@
//// [destructuringParameterDeclaration3ES6.ts]
function a([x, [y, z], [[j]]]) {
return [x, y, z, j];
}
function a1([...x]) {
return [x];
}
function a2({public} = { "public": "1" }) {
return public;
}
function a3({x: { y, z}, j: {k: {a}} }) {
return [y, z, a];
}
function a4({x: { y, z}, j: {k: {a}} } = { x: { y: 1, z: 1 }, j: { k: { a: "hello" } } }): (number| string) [] {
return [y, z, a];
}
function a5({x: { y, z}, j: {k: {a}} }): (number| string) [] {
return [y, z, a];
}
//// [destructuringParameterDeclaration3ES6.js]
function a([x, [y, z], [[j]]]) {
return [x, y, z, j];
}
function a1([...x]) {
return [x];
}
function a2({ public } = { "public": "1" }) {
return public;
}
function a3({ x: { y, z }, j: { k: { a } } }) {
return [y, z, a];
}
function a4({ x: { y, z }, j: { k: { a } } } = { x: { y: 1, z: 1 }, j: { k: { a: "hello" } } }) {
return [y, z, a];
}
function a5({ x: { y, z }, j: { k: { a } } }) {
return [y, z, a];
}
@@ -1,92 +0,0 @@
=== tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration3ES6.ts ===
function a([x, [y, z], [[j]]]) {
>a : ([x, [y, z], [[j]]]: [any, [any, any], [[any]]]) => any[]
>x : any
>y : any
>z : any
>j : any
return [x, y, z, j];
>[x, y, z, j] : any[]
>x : any
>y : any
>z : any
>j : any
}
function a1([...x]) {
>a1 : ([...x]: Iterable<any>) => any[][]
>x : any[]
return [x];
>[x] : any[][]
>x : any[]
}
function a2({public} = { "public": "1" }) {
>a2 : ({public}?: { "public": string; }) => string
>public : string
>{ "public": "1" } : { "public": string; }
return public;
>public : string
}
function a3({x: { y, z}, j: {k: {a}} }) {
>a3 : ({x: { y, z}, j: {k: {a}} }: { x: { y: any; z: any; }; j: { k: { a: any; }; }; }) => any[]
>x : unknown
>y : any
>z : any
>j : unknown
>k : unknown
>a : any
return [y, z, a];
>[y, z, a] : any[]
>y : any
>z : any
>a : any
}
function a4({x: { y, z}, j: {k: {a}} } = { x: { y: 1, z: 1 }, j: { k: { a: "hello" } } }): (number| string) [] {
>a4 : ({x: { y, z}, j: {k: {a}} }?: { x: { y: number; z: number; }; j: { k: { a: string; }; }; }) => (string | number)[]
>x : unknown
>y : number
>z : number
>j : unknown
>k : unknown
>a : string
>{ x: { y: 1, z: 1 }, j: { k: { a: "hello" } } } : { x: { y: number; z: number; }; j: { k: { a: string; }; }; }
>x : { y: number; z: number; }
>{ y: 1, z: 1 } : { y: number; z: number; }
>y : number
>z : number
>j : { k: { a: string; }; }
>{ k: { a: "hello" } } : { k: { a: string; }; }
>k : { a: string; }
>{ a: "hello" } : { a: string; }
>a : string
return [y, z, a];
>[y, z, a] : (string | number)[]
>y : number
>z : number
>a : string
}
function a5({x: { y, z}, j: {k: {a}} }): (number| string) [] {
>a5 : ({x: { y, z}, j: {k: {a}} }: { x: { y: any; z: any; }; j: { k: { a: any; }; }; }) => (string | number)[]
>x : unknown
>y : any
>z : any
>j : unknown
>k : unknown
>a : any
return [y, z, a];
>[y, z, a] : any[]
>y : any
>z : any
>a : any
}
@@ -1,27 +1,78 @@
tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration4.ts(15,1): error TS2453: The type argument for type parameter 'T' cannot be inferred from the usage. Consider specifying the type arguments explicitly.
Type argument candidate 'string' is not a valid type argument because it is not a supertype of candidate 'number'.
tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration4.ts(46,4): error TS2345: Argument of type '{ y: Class; }' is not assignable to parameter of type '{ y: D; }'.
Types of property 'y' are incompatible.
Type 'Class' is not assignable to type 'D'.
tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration4.ts(47,4): error TS2345: Argument of type '{}' is not assignable to parameter of type '{ y: D; }'.
Property 'y' is missing in type '{}'.
tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration4.ts(48,4): error TS2345: Argument of type '{ y: number; }' is not assignable to parameter of type '{ y: D; }'.
Types of property 'y' are incompatible.
Type 'number' is not assignable to type 'D'.
tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration4.ts(49,4): error TS2345: Argument of type '{ y: string; }' is not assignable to parameter of type '{ y: D; }'.
Types of property 'y' are incompatible.
Type 'string' is not assignable to type 'D'.
==== tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration4.ts (1 errors) ====
==== tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration4.ts (4 errors) ====
// Parameter with generic
interface F { }
class C implements F{
class Class implements F {
constructor() { }
}
function foo<T>(...a: T[]) { }
function foo1<T extends String>(...a: T[]) { }
function bar<T extends C>({x} = { x: new C() }) { }
function baz<T extends F>({x}: { x: F }) { }
function baz1<T extends C>({x}: { x: C }) { }
function baz2<T extends C>({x}: { x: C }) { }
var obj = new C();
baz1({ x: obj });
baz({ x: new C() });
baz({ x: {} });
foo("hello", 1, 2);
~~~
!!! error TS2453: The type argument for type parameter 'T' cannot be inferred from the usage. Consider specifying the type arguments explicitly.
!!! error TS2453: Type argument candidate 'string' is not a valid type argument because it is not a supertype of candidate 'number'.
foo<number|string>("hello", 1, 2);
foo("hello", "world");
class SubClass extends Class {
foo: boolean;
constructor() { super(); }
}
class D implements F {
foo: boolean
constructor() { }
}
class SubD extends D {
bar: number
constructor() {
super();
}
}
function d0<T extends Class>({x} = { x: new Class() }) { }
function d1<T extends F>({x}: { x: F }) { }
function d2<T extends Class>({x}: { x: Class }) { }
function d3<T extends D>({y}: { y: D }) { }
function d4<T extends D>({y} = { y: new D() }) { }
var obj = new Class();
d0({ x: 1 });
d0({ x: {} });
d0({ x: "string" });
d1({ x: new Class() });
d1({ x: {} });
d1({ x: "string" });
d2({ x: new SubClass() });
d2({ x: {} });
d3({ y: new SubD() });
d3({ y: new SubClass() });
// Error
d3({ y: new Class() });
~~~~~~~~~~~~~~~~~~
!!! error TS2345: Argument of type '{ y: Class; }' is not assignable to parameter of type '{ y: D; }'.
!!! error TS2345: Types of property 'y' are incompatible.
!!! error TS2345: Type 'Class' is not assignable to type 'D'.
d3({});
~~
!!! error TS2345: Argument of type '{}' is not assignable to parameter of type '{ y: D; }'.
!!! error TS2345: Property 'y' is missing in type '{}'.
d3({ y: 1 });
~~~~~~~~
!!! error TS2345: Argument of type '{ y: number; }' is not assignable to parameter of type '{ y: D; }'.
!!! error TS2345: Types of property 'y' are incompatible.
!!! error TS2345: Type 'number' is not assignable to type 'D'.
d3({ y: "world" });
~~~~~~~~~~~~~~
!!! error TS2345: Argument of type '{ y: string; }' is not assignable to parameter of type '{ y: D; }'.
!!! error TS2345: Types of property 'y' are incompatible.
!!! error TS2345: Type 'string' is not assignable to type 'D'.
@@ -1,58 +1,113 @@
//// [destructuringParameterDeclaration4.ts]
// Parameter with generic
interface F { }
class C implements F{
class Class implements F {
constructor() { }
}
function foo<T>(...a: T[]) { }
function foo1<T extends String>(...a: T[]) { }
function bar<T extends C>({x} = { x: new C() }) { }
function baz<T extends F>({x}: { x: F }) { }
function baz1<T extends C>({x}: { x: C }) { }
function baz2<T extends C>({x}: { x: C }) { }
var obj = new C();
baz1({ x: obj });
baz({ x: new C() });
baz({ x: {} });
foo("hello", 1, 2);
foo<number|string>("hello", 1, 2);
foo("hello", "world");
class SubClass extends Class {
foo: boolean;
constructor() { super(); }
}
class D implements F {
foo: boolean
constructor() { }
}
class SubD extends D {
bar: number
constructor() {
super();
}
}
function d0<T extends Class>({x} = { x: new Class() }) { }
function d1<T extends F>({x}: { x: F }) { }
function d2<T extends Class>({x}: { x: Class }) { }
function d3<T extends D>({y}: { y: D }) { }
function d4<T extends D>({y} = { y: new D() }) { }
var obj = new Class();
d0({ x: 1 });
d0({ x: {} });
d0({ x: "string" });
d1({ x: new Class() });
d1({ x: {} });
d1({ x: "string" });
d2({ x: new SubClass() });
d2({ x: {} });
d3({ y: new SubD() });
d3({ y: new SubClass() });
// Error
d3({ y: new Class() });
d3({});
d3({ y: 1 });
d3({ y: "world" });
//// [destructuringParameterDeclaration4.js]
var C = (function () {
function C() {
var __extends = this.__extends || function (d, b) {
for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
function __() { this.constructor = d; }
__.prototype = b.prototype;
d.prototype = new __();
};
var Class = (function () {
function Class() {
}
return C;
return Class;
})();
function foo() {
var a = [];
for (var _i = 0; _i < arguments.length; _i++) {
a[_i - 0] = arguments[_i];
var SubClass = (function (_super) {
__extends(SubClass, _super);
function SubClass() {
_super.call(this);
}
}
function foo1() {
var a = [];
for (var _i = 0; _i < arguments.length; _i++) {
a[_i - 0] = arguments[_i];
return SubClass;
})(Class);
var D = (function () {
function D() {
}
return D;
})();
var SubD = (function (_super) {
__extends(SubD, _super);
function SubD() {
_super.call(this);
}
return SubD;
})(D);
function d0(_a) {
var x = (_a === void 0 ? { x: new Class() } : _a).x;
}
function bar(_a) {
var x = (_a === void 0 ? { x: new C() } : _a).x;
}
function baz(_a) {
function d1(_a) {
var x = _a.x;
}
function baz1(_a) {
function d2(_a) {
var x = _a.x;
}
function baz2(_a) {
var x = _a.x;
function d3(_a) {
var y = _a.y;
}
var obj = new C();
baz1({ x: obj });
baz({ x: new C() });
baz({ x: {} });
foo("hello", 1, 2);
foo("hello", 1, 2);
foo("hello", "world");
function d4(_a) {
var y = (_a === void 0 ? { y: new D() } : _a).y;
}
var obj = new Class();
d0({ x: 1 });
d0({ x: {} });
d0({ x: "string" });
d1({ x: new Class() });
d1({ x: {} });
d1({ x: "string" });
d2({ x: new SubClass() });
d2({ x: {} });
d3({ y: new SubD() });
d3({ y: new SubClass() });
// Error
d3({ y: new Class() });
d3({});
d3({ y: 1 });
d3({ y: "world" });
@@ -1,37 +0,0 @@
tests/cases/conformance/es6/destructuring/destructuringParameterDeclarationES6.ts(17,1): error TS2346: Supplied parameters do not match any signature of call target.
tests/cases/conformance/es6/destructuring/destructuringParameterDeclarationES6.ts(18,4): error TS2345: Argument of type '{}' is not assignable to parameter of type '{ z: number; }'.
Property 'z' is missing in type '{}'.
tests/cases/conformance/es6/destructuring/destructuringParameterDeclarationES6.ts(19,14): error TS2300: Duplicate identifier 'z'.
tests/cases/conformance/es6/destructuring/destructuringParameterDeclarationES6.ts(19,18): error TS2300: Duplicate identifier 'z'.
==== tests/cases/conformance/es6/destructuring/destructuringParameterDeclarationES6.ts (4 errors) ====
enum Foo { a }
function a({x, a}: { x: number, a: number }) { }
function a1({z: {x, y: {j}}}) { }
function a2({z: {x, y: {j}}} = { z: { x: "hi", y: { j: 1 } } }) { }
function a3({z} = {z:10}) { }
function a4({z=10}) { }
function a6({b}: { b: number|string|boolean } = { b: "hello" }) { }
a2();
a2({ z: { x: "hello" , y: { j: Foo.a } }});
a3();
a3({ z: Foo.a });
a4({});
a6({ b: 10 });
a6({ b: true });
// error
a4();
~~~~
!!! error TS2346: Supplied parameters do not match any signature of call target.
a3({});
~~
!!! error TS2345: Argument of type '{}' is not assignable to parameter of type '{ z: number; }'.
!!! error TS2345: Property 'z' is missing in type '{}'.
function a5([z], z: number) { }
~
!!! error TS2300: Duplicate identifier 'z'.
~
!!! error TS2300: Duplicate identifier 'z'.
@@ -1,44 +0,0 @@
//// [destructuringParameterDeclarationES6.ts]
enum Foo { a }
function a({x, a}: { x: number, a: number }) { }
function a1({z: {x, y: {j}}}) { }
function a2({z: {x, y: {j}}} = { z: { x: "hi", y: { j: 1 } } }) { }
function a3({z} = {z:10}) { }
function a4({z=10}) { }
function a6({b}: { b: number|string|boolean } = { b: "hello" }) { }
a2();
a2({ z: { x: "hello" , y: { j: Foo.a } }});
a3();
a3({ z: Foo.a });
a4({});
a6({ b: 10 });
a6({ b: true });
// error
a4();
a3({});
function a5([z], z: number) { }
//// [destructuringParameterDeclarationES6.js]
var Foo;
(function (Foo) {
Foo[Foo["a"] = 0] = "a";
})(Foo || (Foo = {}));
function a({ x, a }) { }
function a1({ z: { x, y: { j } } }) { }
function a2({ z: { x, y: { j } } } = { z: { x: "hi", y: { j: 1 } } }) { }
function a3({ z } = { z: 10 }) { }
function a4({ z = 10 }) { }
function a6({ b } = { b: "hello" }) { }
a2();
a2({ z: { x: "hello", y: { j: Foo.a } } });
a3();
a3({ z: Foo.a });
a4({});
a6({ b: 10 });
a6({ b: true });
// error
a4();
a3({});
function a5([z], z) { }
@@ -1,19 +0,0 @@
enum Foo { a }
function a({x, a}: { x: number, a: number }) { }
function a1({z: {x, y: {j}}}) { }
function a2({z: {x, y: {j}}} = { z: { x: "hi", y: { j: 1 } } }) { }
function a3({z} = {z:10}) { }
function a4({z=10}) { }
function a6({b}: { b: number|string|boolean } = { b: "hello" }) { }
a2();
a2({ z: { x: "hello" , y: { j: Foo.a } }});
a3();
a3({ z: Foo.a });
a4({});
a6({ b: 10 });
a6({ b: true });
// error
a4();
a3({});
function a5([z], z: number) { }
@@ -1,21 +1,106 @@
type arrayString = Array<String>
type someArray = Array<String> | number[];
type stringOrNumArray = Array<String|Number>;
// A parameter declaration may specify either an identifier or a binding pattern.
// The identifiers specified in parameter declarations and binding patterns
// in a parameter list must be unique within that parameter list.
function a3(...x = [1,2,3]) { }
function a4(...x: (number|string)[]) { }
function a5(...a) { }
function a6(...a: Array<String>) { }
function a7(...a: arrayString) { }
function a8(...a: stringOrNumArray) { }
function a9(...a: someArray) { }
function a10(...b?) { }
function a11(...b = [1,2,3]) { }
// If the declaration includes a type annotation, the parameter is of that type
function a0(x: number, y: string, z: boolean) { }
function a1([a, b, [[c]]]: [number, number, string[][]]) { }
function a2(o: { x: number, a: number }) { }
function a3({j, k, l: {m, n}, q: [a, b, c]}: { j: number, k: string, l: { m: boolean, n: number }, q: (number|string)[] }) { };
function a1({x, a}: { x: number, a: number }) { }
a1([1, 2, [["world"]]]);
a1([1, 2, [["world"]], 3]);
a1([1, "string", [["world"]]); // Error
a1([1, 2, [["world"]], "string"]); // Error
// If the declaration includes an initializer expression (which is permitted only
// when the parameter list occurs in conjunction with a function body),
// the parameter type is the widened form (section 3.11) of the type of the initializer expression.
function b1(z = 10, y = 60, u = () => true) { }
function b2(z = [undefined, null]) { };
function b3(z = null, o = { x: 0, y: undefined }) { }
function b4({z: {x, y: {j}}} = { z: { x: "hi", y: { j: 1 } } }) { }
interface F1 {
b5(z = 10, [[a, b], d, {u}] = [[1, 2], "string", { u: false }]); // Error, no function body
b6(z, y, [, a, b], {p, m: { q, r}});
}
b2([1, 2, 3]); // z is widen to the type any[]
b3("string", { x: 200, y: "string" });
b3("string", { x: 200, y: true });
b3("string", { x: "string", y: true }); // Error
// If the declaration specifies a binding pattern, the parameter type is the implied type of that binding pattern (section 5.1.3)
enum Foo { a }
function c0({z: {x, y: {j}}}) { }
function c1({z} = { z: 10 }) { }
function c2({z = 10}) { }
function c3({b}: { b: number|string} = { b: "hello" }) { }
function c4([z], z: number) { } // Duplicate identifier
function c5([a, b, [[c]]]) { }
function c6([a, b, [[c=1]]]) { }
c0({z : { x: 1, y: { j: "world" } }}); // Implied type is { z: {x: any, y: {j: any}} }
c0({z : { x: "string", y: { j: true } }}); // Implied type is { z: {x: any, y: {j: any}} }
c0({z : 1}); // Error, implied type is { z: {x: any, y: {j: any}} }
c1({}); // Error, implied type is {z:number}?
c1({ z: true }); // Error, implied type is {z:number}?
c1(); // Implied type is {z:number}?
c1({ z: 1 }) // Implied type is {z:number}?
c2({}); // Implied type is {z?: number}
c2({z:1}); // Implied type is {z?: number}
c2({z:false}); // Error, implied type is {z?: number}
c3({ b: 1 }); // Implied type is { b: number|string }.
c3({ b: true }); // Error, implied type is { b: number|string }.
c5([1, 2, [["string"]]]); // Implied type is is [any, any, [[any]]]
c5([1, 2, [["string"]], false, true]); // Implied type is is [any, any, [[any]]]
c5([1, 2, false, true]); // Error, implied type is [any, any, [[any]]]
c6([1, 2, [["string"]]]); // Error, implied type is [any, any, [[number]]] // Use initializer
// A parameter can be marked optional by following its name or binding pattern with a question mark (?)
// or by including an initializer.
function d0(x?) { }
function d0(x = 10) { }
function d1([a, b, c]?) { }
function d2({x, y, z}?) { }
interface F2 {
d3([a, b, c]?);
d4({x, y, z}?);
e0([a, b, c]);
}
class C2 implements F2 {
constructor() { }
d3() { }
d4() { }
e0([a, b, c]) { }
}
class C3 implements F2 {
d3([a, b, c]) { }
d4({x, y, z}) { }
e0([a, b, c]) { }
}
class C4 implements F2 {
d3([a, b, c]?) { }
d4({x, y, c}) { }
e0([a, b, q]) { }
}
function d5({x, y} = { x: 1, y: 2 }) { }
d5(); // Parameter is optional as its declaration included an initializer
a4(1, 2, "hello", true);
var array = [1, 2, 3];
var array2 = [true, false, "hello"];
a5([...array]);
a4(...array);
a4(...array2);
@@ -1,22 +0,0 @@
// @target: es6
type arrayString = Array<String>
type someArray = Array<String> | number[];
type stringOrNumArray = Array<String|Number>;
function a3(...x = [1,2,3]) { }
function a4(...x: (number|string)[]) { }
function a5(...a) { }
function a6(...a: Array<String>) { }
function a7(...a: arrayString) { }
function a8(...a: stringOrNumArray) { }
function a9(...a: someArray) { }
function a10(...b?) { }
function a11(...b = [1,2,3]) { }
a4(1, 2, "hello", true);
var array = [1, 2, 3];
var array2 = [true, false, "hello"];
a5([...array]);
a4(...array);
a4(...array2);
@@ -1,19 +1,61 @@
"use strict"
function a({while}) { }
function a1({public}) { }
function a2({public: x}) { }
function a3({while: y}) { }
function a4([while, for, public]){ }
function a5(...while) { }
function a6(...public) { }
function a7(...a: string) { }
// If the parameter is a rest parameter, the parameter type is any[]
// A type annotation for a rest parameter must denote an array type.
// RestParameter:
// ... Identifier TypeAnnotation(opt)
type arrayString = Array<String>
type someArray = Array<String> | number[];
type stringOrNumArray = Array<String|Number>;
function a0(...x: [number, number, string]) { } // Error, rest parameter must be array type
function a1(...x: (number|string)[]) { }
function a2(...a) { }
function a3(...a: Array<String>) { }
function a4(...a: arrayString) { }
function a5(...a: stringOrNumArray) { }
function a6(...a: someArray) { } // Error, rest parameter must be array type
function a7(...b?) { } // Error, can't be optional
function a8(...b = [1,2,3]) { } // Error, can't have initializer
function a9([a, b, [[c]]]) { }
function a10([a, b, [[c]], ...x]) { }
function a11([a, b, c, ...x]: number[]) { }
a1(1, 2, "hello", true); // Error, parameter type is (number|string)[]
var array = [1, 2, 3];
var array2 = [true, false, "hello"];
a2([...array]);
a1(...array);
a1(...array2); // Error parameter type is (number|string)[]
a9([1, 2, [["string"]], false, true]); // Parameter type is [any, any, [[any]]]
a9([1, 2, "string", false, true]); // Error, parameter type is [any, any, [[any]]]
a9([1, 2]); // Error, parameter type is [any, any, [[any]]]
a10([1, 2, [["string"]], false, true]); // Parameter type is any[]
a10([1, 2, 3, false, true]); // Parameter type is any[]
a10([1, 2]); // Parameter type is any[]
a11([1, 2]); // Parameter type is number[]
a11([1, 2, "string"]); // Error, parameter type is number[]
class C {
constructor(public ...a) { }
constructor(public ...a) { } // Rest parameter can't have accessibilityModifier
}
// Rest parameter with generic
function foo<T>(...a: T[]) { }
foo("hello", 1, 2); // Error
foo<number|string>("hello", 1, 2);
foo("hello", "world");
enum E { a, b }
const enum E1 { a, b }
function foo1<T extends Number>(...a: T[]) { }
foo1(1, 2, 3, E.a);
foo1(1, 2, 3, E1.a, E.b);
foo1(1, 2, "string", E1.a, E.b); // Error
a2({ public: 1 });
a3({ while: 1 });
a({ while: 1 });
@@ -1,20 +0,0 @@
//@target: es6
"use strict"
function a({while}) { }
function a1({public}) { }
function a2({public: x}) { }
function a3({while: y}) { }
function a4([while, for, public]){ }
function a5(...while) { }
function a6(...public) { }
function a7(...a: string) { }
class C {
constructor(public ...a) { }
}
a2({ public: 1 });
a3({ while: 1 });
a({ while: 1 });
@@ -1,23 +1,20 @@
function a([x, [y, z], [[j]]]) {
return [x, y, z, j];
}
// A parameter declaration may specify either an identifier or a binding pattern.
function a1([...x]) {
return [x];
}
// Reserved words are not allowed to be used as an identifier in parameter declaration
"use strict"
function a2({public} = { "public": "1" }) {
return public;
}
// Error
function a({while}) { }
function a1({public}) { }
function a4([while, for, public]){ }
function a5(...while) { }
function a6(...public) { }
function a7(...a: string) { }
a({ while: 1 });
function a3({x: { y, z}, j: {k: {a}} }) {
return [y, z, a];
}
// No Error
function b1({public: x}) { }
function b2({while: y}) { }
b1({ public: 1 });
b2({ while: 1 });
function a4({x: { y, z}, j: {k: {a}} } = { x: { y: 1, z: 1 }, j: { k: { a: "hello" } } }): (number| string) [] {
return [y, z, a];
}
function a5({x: { y, z}, j: {k: {a}} }): (number| string) [] {
return [y, z, a];
}
@@ -1,24 +0,0 @@
// @target: es6
function a([x, [y, z], [[j]]]) {
return [x, y, z, j];
}
function a1([...x]) {
return [x];
}
function a2({public} = { "public": "1" }) {
return public;
}
function a3({x: { y, z}, j: {k: {a}} }) {
return [y, z, a];
}
function a4({x: { y, z}, j: {k: {a}} } = { x: { y: 1, z: 1 }, j: { k: { a: "hello" } } }): (number| string) [] {
return [y, z, a];
}
function a5({x: { y, z}, j: {k: {a}} }): (number| string) [] {
return [y, z, a];
}
@@ -1,18 +1,49 @@
interface F { }
class C implements F{
// Parameter with generic
interface F { }
class Class implements F {
constructor() { }
}
function foo<T>(...a: T[]) { }
function foo1<T extends String>(...a: T[]) { }
function bar<T extends C>({x} = { x: new C() }) { }
function baz<T extends F>({x}: { x: F }) { }
function baz1<T extends C>({x}: { x: C }) { }
function baz2<T extends C>({x}: { x: C }) { }
var obj = new C();
baz1({ x: obj });
baz({ x: new C() });
baz({ x: {} });
foo("hello", 1, 2);
foo<number|string>("hello", 1, 2);
foo("hello", "world");
class SubClass extends Class {
foo: boolean;
constructor() { super(); }
}
class D implements F {
foo: boolean
constructor() { }
}
class SubD extends D {
bar: number
constructor() {
super();
}
}
function d0<T extends Class>({x} = { x: new Class() }) { }
function d1<T extends F>({x}: { x: F }) { }
function d2<T extends Class>({x}: { x: Class }) { }
function d3<T extends D>({y}: { y: D }) { }
function d4<T extends D>({y} = { y: new D() }) { }
var obj = new Class();
d0({ x: 1 });
d0({ x: {} });
d0({ x: "string" });
d1({ x: new Class() });
d1({ x: {} });
d1({ x: "string" });
d2({ x: new SubClass() });
d2({ x: {} });
d3({ y: new SubD() });
d3({ y: new SubClass() });
// Error
d3({ y: new Class() });
d3({});
d3({ y: 1 });
d3({ y: "world" });
@@ -1,20 +0,0 @@
//@target: es6
enum Foo { a }
function a({x, a}: { x: number, a: number }) { }
function a1({z: {x, y: {j}}}) { }
function a2({z: {x, y: {j}}} = { z: { x: "hi", y: { j: 1 } } }) { }
function a3({z} = {z:10}) { }
function a4({z=10}) { }
function a6({b}: { b: number|string|boolean } = { b: "hello" }) { }
a2();
a2({ z: { x: "hello" , y: { j: Foo.a } }});
a3();
a3({ z: Foo.a });
a4({});
a6({ b: 10 });
a6({ b: true });
// error
a4();
a3({});
function a5([z], z: number) { }