Merge pull request #24897 from Microsoft/restTuples

Tuples in rest parameters and spread expressions
This commit is contained in:
Anders Hejlsberg
2018-06-25 19:26:35 -07:00
committed by GitHub
124 changed files with 6268 additions and 1121 deletions
+2
View File
@@ -3606,6 +3606,8 @@ namespace ts {
case SyntaxKind.TypeLiteral:
case SyntaxKind.ArrayType:
case SyntaxKind.TupleType:
case SyntaxKind.OptionalType:
case SyntaxKind.RestType:
case SyntaxKind.UnionType:
case SyntaxKind.IntersectionType:
case SyntaxKind.ConditionalType:
+566 -250
View File
File diff suppressed because it is too large Load Diff
+20 -4
View File
@@ -367,10 +367,6 @@
"category": "Error",
"code": 1121
},
"A tuple type element list cannot be empty.": {
"category": "Error",
"code": 1122
},
"Variable declaration list cannot be empty.": {
"category": "Error",
"code": 1123
@@ -847,6 +843,14 @@
"category": "Error",
"code": 1255
},
"A rest element must be last in a tuple type.": {
"category": "Error",
"code": 1256
},
"A required element cannot follow an optional element.": {
"category": "Error",
"code": 1257
},
"'with' statements are not allowed in an async function block.": {
"category": "Error",
"code": 1300
@@ -2032,6 +2036,18 @@
"category": "Error",
"code": 2571
},
"Rest signatures are incompatible.": {
"category": "Error",
"code": 2572
},
"Property '{0}' is incompatible with rest element type.": {
"category": "Error",
"code": 2573
},
"A rest element type must be an array type.": {
"category": "Error",
"code": 2574
},
"JSX element attributes type '{0}' may not be a union type.": {
"category": "Error",
"code": 2600
+10 -2
View File
@@ -659,6 +659,8 @@ namespace ts {
return emitArrayType(<ArrayTypeNode>node);
case SyntaxKind.TupleType:
return emitTupleType(<TupleTypeNode>node);
case SyntaxKind.OptionalType:
return emitOptionalType(<OptionalTypeNode>node);
case SyntaxKind.UnionType:
return emitUnionType(<UnionTypeNode>node);
case SyntaxKind.IntersectionType:
@@ -695,8 +697,9 @@ namespace ts {
return emitJSDocNonNullableType(node as JSDocNonNullableType);
case SyntaxKind.JSDocOptionalType:
return emitJSDocOptionalType(node as JSDocOptionalType);
case SyntaxKind.RestType:
case SyntaxKind.JSDocVariadicType:
return emitJSDocVariadicType(node as JSDocVariadicType);
return emitRestOrJSDocVariadicType(node as RestTypeNode | JSDocVariadicType);
// Binding patterns
case SyntaxKind.ObjectBindingPattern:
@@ -1304,7 +1307,7 @@ namespace ts {
writePunctuation("]");
}
function emitJSDocVariadicType(node: JSDocVariadicType) {
function emitRestOrJSDocVariadicType(node: RestTypeNode | JSDocVariadicType) {
write("...");
emit(node.type);
}
@@ -1315,6 +1318,11 @@ namespace ts {
writePunctuation("]");
}
function emitOptionalType(node: OptionalTypeNode) {
emit(node.type);
write("?");
}
function emitUnionType(node: UnionTypeNode) {
emitList(node, node.types, ListFormat.UnionTypeConstituents);
}
+25 -1
View File
@@ -745,12 +745,36 @@ namespace ts {
return node;
}
export function updateTypleTypeNode(node: TupleTypeNode, elementTypes: ReadonlyArray<TypeNode>) {
export function updateTupleTypeNode(node: TupleTypeNode, elementTypes: ReadonlyArray<TypeNode>) {
return node.elementTypes !== elementTypes
? updateNode(createTupleTypeNode(elementTypes), node)
: node;
}
export function createOptionalTypeNode(type: TypeNode) {
const node = createSynthesizedNode(SyntaxKind.OptionalType) as OptionalTypeNode;
node.type = parenthesizeArrayTypeMember(type);
return node;
}
export function updateOptionalTypeNode(node: OptionalTypeNode, type: TypeNode): OptionalTypeNode {
return node.type !== type
? updateNode(createOptionalTypeNode(type), node)
: node;
}
export function createRestTypeNode(type: TypeNode) {
const node = createSynthesizedNode(SyntaxKind.RestType) as RestTypeNode;
node.type = type;
return node;
}
export function updateRestTypeNode(node: RestTypeNode, type: TypeNode): RestTypeNode {
return node.type !== type
? updateNode(createRestTypeNode(type), node)
: node;
}
export function createUnionTypeNode(types: ReadonlyArray<TypeNode>): UnionTypeNode {
return <UnionTypeNode>createUnionOrIntersectionTypeNode(SyntaxKind.UnionType, types);
}
+25 -13
View File
@@ -445,19 +445,17 @@ namespace ts {
case SyntaxKind.JsxClosingElement:
return visitNode(cbNode, (<JsxClosingElement>node).tagName);
case SyntaxKind.OptionalType:
case SyntaxKind.RestType:
case SyntaxKind.JSDocTypeExpression:
return visitNode(cbNode, (<JSDocTypeExpression>node).type);
case SyntaxKind.JSDocNonNullableType:
return visitNode(cbNode, (<JSDocNonNullableType>node).type);
case SyntaxKind.JSDocNullableType:
return visitNode(cbNode, (<JSDocNullableType>node).type);
case SyntaxKind.JSDocOptionalType:
return visitNode(cbNode, (<JSDocOptionalType>node).type);
case SyntaxKind.JSDocVariadicType:
return visitNode(cbNode, (<OptionalTypeNode | RestTypeNode | JSDocTypeExpression | JSDocTypeReferencingNode>node).type);
case SyntaxKind.JSDocFunctionType:
return visitNodes(cbNode, cbNodes, (<JSDocFunctionType>node).parameters) ||
visitNode(cbNode, (<JSDocFunctionType>node).type);
case SyntaxKind.JSDocVariadicType:
return visitNode(cbNode, (<JSDocVariadicType>node).type);
case SyntaxKind.JSDocComment:
return visitNodes(cbNode, cbNodes, (<JSDoc>node).tags);
case SyntaxKind.JSDocParameterTag:
@@ -2289,7 +2287,7 @@ namespace ts {
function parseJSDocAllType(postFixEquals: boolean): JSDocAllType | JSDocOptionalType {
const result = createNode(SyntaxKind.JSDocAllType) as JSDocAllType;
if (postFixEquals) {
return createJSDocPostfixType(SyntaxKind.JSDocOptionalType, result) as JSDocOptionalType;
return createPostfixType(SyntaxKind.JSDocOptionalType, result) as JSDocOptionalType;
}
else {
nextToken();
@@ -2367,7 +2365,7 @@ namespace ts {
type = finishNode(variadic);
}
if (token() === SyntaxKind.EqualsToken) {
return createJSDocPostfixType(SyntaxKind.JSDocOptionalType, type);
return createPostfixType(SyntaxKind.JSDocOptionalType, type);
}
return type;
}
@@ -2775,9 +2773,23 @@ namespace ts {
return finishNode(node);
}
function parseTupleElementType() {
const pos = getNodePos();
if (parseOptional(SyntaxKind.DotDotDotToken)) {
const node = <RestTypeNode>createNode(SyntaxKind.RestType, pos);
node.type = parseType();
return finishNode(node);
}
const type = parseType();
if (!(contextFlags & NodeFlags.JSDoc) && type.kind === SyntaxKind.JSDocNullableType && type.pos === (<JSDocNullableType>type).type.pos) {
type.kind = SyntaxKind.OptionalType;
}
return type;
}
function parseTupleType(): TupleTypeNode {
const node = <TupleTypeNode>createNode(SyntaxKind.TupleType);
node.elementTypes = parseBracketedList(ParsingContext.TupleElementTypes, parseType, SyntaxKind.OpenBracketToken, SyntaxKind.CloseBracketToken);
node.elementTypes = parseBracketedList(ParsingContext.TupleElementTypes, parseTupleElementType, SyntaxKind.OpenBracketToken, SyntaxKind.CloseBracketToken);
return finishNode(node);
}
@@ -2960,14 +2972,14 @@ namespace ts {
while (!scanner.hasPrecedingLineBreak()) {
switch (token()) {
case SyntaxKind.ExclamationToken:
type = createJSDocPostfixType(SyntaxKind.JSDocNonNullableType, type);
type = createPostfixType(SyntaxKind.JSDocNonNullableType, type);
break;
case SyntaxKind.QuestionToken:
// If not in JSDoc and next token is start of a type we have a conditional type
if (!(contextFlags & NodeFlags.JSDoc) && lookAhead(nextTokenIsStartOfType)) {
return type;
}
type = createJSDocPostfixType(SyntaxKind.JSDocNullableType, type);
type = createPostfixType(SyntaxKind.JSDocNullableType, type);
break;
case SyntaxKind.OpenBracketToken:
parseExpected(SyntaxKind.OpenBracketToken);
@@ -2992,9 +3004,9 @@ namespace ts {
return type;
}
function createJSDocPostfixType(kind: SyntaxKind, type: TypeNode) {
function createPostfixType(kind: SyntaxKind, type: TypeNode) {
nextToken();
const postfix = createNode(kind, type.pos) as JSDocOptionalType | JSDocNonNullableType | JSDocNullableType;
const postfix = createNode(kind, type.pos) as OptionalTypeNode | JSDocOptionalType | JSDocNonNullableType | JSDocNullableType;
postfix.type = type;
return finishNode(postfix);
}
+2
View File
@@ -380,6 +380,8 @@ namespace ts {
case SyntaxKind.ArrayType:
case SyntaxKind.TupleType:
case SyntaxKind.OptionalType:
case SyntaxKind.RestType:
case SyntaxKind.TypeLiteral:
case SyntaxKind.TypePredicate:
case SyntaxKind.TypeParameter:
+32 -2
View File
@@ -225,6 +225,8 @@ namespace ts {
TypeLiteral,
ArrayType,
TupleType,
OptionalType,
RestType,
UnionType,
IntersectionType,
ConditionalType,
@@ -269,6 +271,7 @@ namespace ts {
AsExpression,
NonNullExpression,
MetaProperty,
SyntheticExpression,
// Misc
TemplateSpan,
@@ -1101,6 +1104,16 @@ namespace ts {
elementTypes: NodeArray<TypeNode>;
}
export interface OptionalTypeNode extends TypeNode {
kind: SyntaxKind.OptionalType;
type: TypeNode;
}
export interface RestTypeNode extends TypeNode {
kind: SyntaxKind.RestType;
type: TypeNode;
}
export type UnionOrIntersectionTypeNode = UnionTypeNode | IntersectionTypeNode;
export interface UnionTypeNode extends TypeNode {
@@ -1288,6 +1301,12 @@ namespace ts {
expression?: Expression;
}
export interface SyntheticExpression extends Expression {
kind: SyntaxKind.SyntheticExpression;
isSpread: boolean;
type: Type;
}
// see: https://tc39.github.io/ecma262/#prod-ExponentiationExpression
export type ExponentiationOperator
= SyntaxKind.AsteriskAsteriskToken
@@ -3521,14 +3540,15 @@ namespace ts {
ContainsPrivate = 1 << 8, // Synthetic property with private constituent(s)
ContainsStatic = 1 << 9, // Synthetic property with static constituent(s)
Late = 1 << 10, // Late-bound symbol for a computed property with a dynamic name
ReverseMapped = 1 << 11, // property of reverse-inferred homomorphic mapped type.
ReverseMapped = 1 << 11, // Property of reverse-inferred homomorphic mapped type
OptionalParameter = 1 << 12, // Optional parameter
RestParameter = 1 << 13, // Rest parameter
Synthetic = SyntheticProperty | SyntheticMethod
}
/* @internal */
export interface TransientSymbol extends Symbol, SymbolLinks {
checkFlags: CheckFlags;
isRestParameter?: boolean;
}
/* @internal */
@@ -3857,6 +3877,16 @@ namespace ts {
variances?: Variance[]; // Variance of each type parameter
}
export interface TupleType extends GenericType {
minLength: number;
hasRestElement: boolean;
associatedNames?: __String[];
}
export interface TupleTypeReference extends TypeReference {
target: TupleType;
}
export interface UnionOrIntersectionType extends Type {
types: Type[]; // Constituent types
/* @internal */
+9 -1
View File
@@ -372,9 +372,17 @@ namespace ts {
visitNode((<ArrayTypeNode>node).elementType, visitor, isTypeNode));
case SyntaxKind.TupleType:
return updateTypleTypeNode((<TupleTypeNode>node),
return updateTupleTypeNode((<TupleTypeNode>node),
nodesVisitor((<TupleTypeNode>node).elementTypes, visitor, isTypeNode));
case SyntaxKind.OptionalType:
return updateOptionalTypeNode((<OptionalTypeNode>node),
visitNode((<OptionalTypeNode>node).type, visitor, isTypeNode));
case SyntaxKind.RestType:
return updateRestTypeNode((<RestTypeNode>node),
visitNode((<RestTypeNode>node).type, visitor, isTypeNode));
case SyntaxKind.UnionType:
return updateUnionTypeNode(<UnionTypeNode>node,
nodesVisitor((<UnionTypeNode>node).types, visitor, isTypeNode));
@@ -1,7 +0,0 @@
tests/cases/conformance/parser/ecmascript5/TupleTypes/TupleType3.ts(1,8): error TS1122: A tuple type element list cannot be empty.
==== tests/cases/conformance/parser/ecmascript5/TupleTypes/TupleType3.ts (1 errors) ====
var v: []
~~
!!! error TS1122: A tuple type element list cannot be empty.
@@ -1,11 +1,8 @@
tests/cases/compiler/anyIndexedAccessArrayNoException.ts(1,12): error TS1122: A tuple type element list cannot be empty.
tests/cases/compiler/anyIndexedAccessArrayNoException.ts(1,12): error TS2538: Type '[]' cannot be used as an index type.
==== tests/cases/compiler/anyIndexedAccessArrayNoException.ts (2 errors) ====
==== tests/cases/compiler/anyIndexedAccessArrayNoException.ts (1 errors) ====
var x: any[[]];
~~
!!! error TS1122: A tuple type element list cannot be empty.
~~
!!! error TS2538: Type '[]' cannot be used as an index type.
+179 -146
View File
@@ -746,144 +746,147 @@ declare namespace ts {
TypeLiteral = 166,
ArrayType = 167,
TupleType = 168,
UnionType = 169,
IntersectionType = 170,
ConditionalType = 171,
InferType = 172,
ParenthesizedType = 173,
ThisType = 174,
TypeOperator = 175,
IndexedAccessType = 176,
MappedType = 177,
LiteralType = 178,
ImportType = 179,
ObjectBindingPattern = 180,
ArrayBindingPattern = 181,
BindingElement = 182,
ArrayLiteralExpression = 183,
ObjectLiteralExpression = 184,
PropertyAccessExpression = 185,
ElementAccessExpression = 186,
CallExpression = 187,
NewExpression = 188,
TaggedTemplateExpression = 189,
TypeAssertionExpression = 190,
ParenthesizedExpression = 191,
FunctionExpression = 192,
ArrowFunction = 193,
DeleteExpression = 194,
TypeOfExpression = 195,
VoidExpression = 196,
AwaitExpression = 197,
PrefixUnaryExpression = 198,
PostfixUnaryExpression = 199,
BinaryExpression = 200,
ConditionalExpression = 201,
TemplateExpression = 202,
YieldExpression = 203,
SpreadElement = 204,
ClassExpression = 205,
OmittedExpression = 206,
ExpressionWithTypeArguments = 207,
AsExpression = 208,
NonNullExpression = 209,
MetaProperty = 210,
TemplateSpan = 211,
SemicolonClassElement = 212,
Block = 213,
VariableStatement = 214,
EmptyStatement = 215,
ExpressionStatement = 216,
IfStatement = 217,
DoStatement = 218,
WhileStatement = 219,
ForStatement = 220,
ForInStatement = 221,
ForOfStatement = 222,
ContinueStatement = 223,
BreakStatement = 224,
ReturnStatement = 225,
WithStatement = 226,
SwitchStatement = 227,
LabeledStatement = 228,
ThrowStatement = 229,
TryStatement = 230,
DebuggerStatement = 231,
VariableDeclaration = 232,
VariableDeclarationList = 233,
FunctionDeclaration = 234,
ClassDeclaration = 235,
InterfaceDeclaration = 236,
TypeAliasDeclaration = 237,
EnumDeclaration = 238,
ModuleDeclaration = 239,
ModuleBlock = 240,
CaseBlock = 241,
NamespaceExportDeclaration = 242,
ImportEqualsDeclaration = 243,
ImportDeclaration = 244,
ImportClause = 245,
NamespaceImport = 246,
NamedImports = 247,
ImportSpecifier = 248,
ExportAssignment = 249,
ExportDeclaration = 250,
NamedExports = 251,
ExportSpecifier = 252,
MissingDeclaration = 253,
ExternalModuleReference = 254,
JsxElement = 255,
JsxSelfClosingElement = 256,
JsxOpeningElement = 257,
JsxClosingElement = 258,
JsxFragment = 259,
JsxOpeningFragment = 260,
JsxClosingFragment = 261,
JsxAttribute = 262,
JsxAttributes = 263,
JsxSpreadAttribute = 264,
JsxExpression = 265,
CaseClause = 266,
DefaultClause = 267,
HeritageClause = 268,
CatchClause = 269,
PropertyAssignment = 270,
ShorthandPropertyAssignment = 271,
SpreadAssignment = 272,
EnumMember = 273,
SourceFile = 274,
Bundle = 275,
UnparsedSource = 276,
InputFiles = 277,
JSDocTypeExpression = 278,
JSDocAllType = 279,
JSDocUnknownType = 280,
JSDocNullableType = 281,
JSDocNonNullableType = 282,
JSDocOptionalType = 283,
JSDocFunctionType = 284,
JSDocVariadicType = 285,
JSDocComment = 286,
JSDocTypeLiteral = 287,
JSDocSignature = 288,
JSDocTag = 289,
JSDocAugmentsTag = 290,
JSDocClassTag = 291,
JSDocCallbackTag = 292,
JSDocParameterTag = 293,
JSDocReturnTag = 294,
JSDocThisTag = 295,
JSDocTypeTag = 296,
JSDocTemplateTag = 297,
JSDocTypedefTag = 298,
JSDocPropertyTag = 299,
SyntaxList = 300,
NotEmittedStatement = 301,
PartiallyEmittedExpression = 302,
CommaListExpression = 303,
MergeDeclarationMarker = 304,
EndOfDeclarationMarker = 305,
Count = 306,
OptionalType = 169,
RestType = 170,
UnionType = 171,
IntersectionType = 172,
ConditionalType = 173,
InferType = 174,
ParenthesizedType = 175,
ThisType = 176,
TypeOperator = 177,
IndexedAccessType = 178,
MappedType = 179,
LiteralType = 180,
ImportType = 181,
ObjectBindingPattern = 182,
ArrayBindingPattern = 183,
BindingElement = 184,
ArrayLiteralExpression = 185,
ObjectLiteralExpression = 186,
PropertyAccessExpression = 187,
ElementAccessExpression = 188,
CallExpression = 189,
NewExpression = 190,
TaggedTemplateExpression = 191,
TypeAssertionExpression = 192,
ParenthesizedExpression = 193,
FunctionExpression = 194,
ArrowFunction = 195,
DeleteExpression = 196,
TypeOfExpression = 197,
VoidExpression = 198,
AwaitExpression = 199,
PrefixUnaryExpression = 200,
PostfixUnaryExpression = 201,
BinaryExpression = 202,
ConditionalExpression = 203,
TemplateExpression = 204,
YieldExpression = 205,
SpreadElement = 206,
ClassExpression = 207,
OmittedExpression = 208,
ExpressionWithTypeArguments = 209,
AsExpression = 210,
NonNullExpression = 211,
MetaProperty = 212,
SyntheticExpression = 213,
TemplateSpan = 214,
SemicolonClassElement = 215,
Block = 216,
VariableStatement = 217,
EmptyStatement = 218,
ExpressionStatement = 219,
IfStatement = 220,
DoStatement = 221,
WhileStatement = 222,
ForStatement = 223,
ForInStatement = 224,
ForOfStatement = 225,
ContinueStatement = 226,
BreakStatement = 227,
ReturnStatement = 228,
WithStatement = 229,
SwitchStatement = 230,
LabeledStatement = 231,
ThrowStatement = 232,
TryStatement = 233,
DebuggerStatement = 234,
VariableDeclaration = 235,
VariableDeclarationList = 236,
FunctionDeclaration = 237,
ClassDeclaration = 238,
InterfaceDeclaration = 239,
TypeAliasDeclaration = 240,
EnumDeclaration = 241,
ModuleDeclaration = 242,
ModuleBlock = 243,
CaseBlock = 244,
NamespaceExportDeclaration = 245,
ImportEqualsDeclaration = 246,
ImportDeclaration = 247,
ImportClause = 248,
NamespaceImport = 249,
NamedImports = 250,
ImportSpecifier = 251,
ExportAssignment = 252,
ExportDeclaration = 253,
NamedExports = 254,
ExportSpecifier = 255,
MissingDeclaration = 256,
ExternalModuleReference = 257,
JsxElement = 258,
JsxSelfClosingElement = 259,
JsxOpeningElement = 260,
JsxClosingElement = 261,
JsxFragment = 262,
JsxOpeningFragment = 263,
JsxClosingFragment = 264,
JsxAttribute = 265,
JsxAttributes = 266,
JsxSpreadAttribute = 267,
JsxExpression = 268,
CaseClause = 269,
DefaultClause = 270,
HeritageClause = 271,
CatchClause = 272,
PropertyAssignment = 273,
ShorthandPropertyAssignment = 274,
SpreadAssignment = 275,
EnumMember = 276,
SourceFile = 277,
Bundle = 278,
UnparsedSource = 279,
InputFiles = 280,
JSDocTypeExpression = 281,
JSDocAllType = 282,
JSDocUnknownType = 283,
JSDocNullableType = 284,
JSDocNonNullableType = 285,
JSDocOptionalType = 286,
JSDocFunctionType = 287,
JSDocVariadicType = 288,
JSDocComment = 289,
JSDocTypeLiteral = 290,
JSDocSignature = 291,
JSDocTag = 292,
JSDocAugmentsTag = 293,
JSDocClassTag = 294,
JSDocCallbackTag = 295,
JSDocParameterTag = 296,
JSDocReturnTag = 297,
JSDocThisTag = 298,
JSDocTypeTag = 299,
JSDocTemplateTag = 300,
JSDocTypedefTag = 301,
JSDocPropertyTag = 302,
SyntaxList = 303,
NotEmittedStatement = 304,
PartiallyEmittedExpression = 305,
CommaListExpression = 306,
MergeDeclarationMarker = 307,
EndOfDeclarationMarker = 308,
Count = 309,
FirstAssignment = 58,
LastAssignment = 70,
FirstCompoundAssignment = 59,
@@ -895,7 +898,7 @@ declare namespace ts {
FirstFutureReservedWord = 108,
LastFutureReservedWord = 116,
FirstTypeNode = 161,
LastTypeNode = 179,
LastTypeNode = 181,
FirstPunctuation = 17,
LastPunctuation = 70,
FirstToken = 0,
@@ -909,10 +912,10 @@ declare namespace ts {
FirstBinaryOperator = 27,
LastBinaryOperator = 70,
FirstNode = 146,
FirstJSDocNode = 278,
LastJSDocNode = 299,
FirstJSDocTagNode = 289,
LastJSDocTagNode = 299,
FirstJSDocNode = 281,
LastJSDocNode = 302,
FirstJSDocTagNode = 292,
LastJSDocTagNode = 302,
FirstContextualKeyword = 117,
LastContextualKeyword = 145
}
@@ -1335,6 +1338,14 @@ declare namespace ts {
kind: SyntaxKind.TupleType;
elementTypes: NodeArray<TypeNode>;
}
interface OptionalTypeNode extends TypeNode {
kind: SyntaxKind.OptionalType;
type: TypeNode;
}
interface RestTypeNode extends TypeNode {
kind: SyntaxKind.RestType;
type: TypeNode;
}
type UnionOrIntersectionTypeNode = UnionTypeNode | IntersectionTypeNode;
interface UnionTypeNode extends TypeNode {
kind: SyntaxKind.UnionType;
@@ -1465,6 +1476,11 @@ declare namespace ts {
asteriskToken?: AsteriskToken;
expression?: Expression;
}
interface SyntheticExpression extends Expression {
kind: SyntaxKind.SyntheticExpression;
isSpread: boolean;
type: Type;
}
type ExponentiationOperator = SyntaxKind.AsteriskAsteriskToken;
type MultiplicativeOperator = SyntaxKind.AsteriskToken | SyntaxKind.SlashToken | SyntaxKind.PercentToken;
type MultiplicativeOperatorOrHigher = ExponentiationOperator | MultiplicativeOperator;
@@ -3074,11 +3090,12 @@ declare namespace ts {
ContainsStatic = 512,
Late = 1024,
ReverseMapped = 2048,
OptionalParameter = 4096,
RestParameter = 8192,
Synthetic = 6
}
interface TransientSymbol extends Symbol, SymbolLinks {
checkFlags: CheckFlags;
isRestParameter?: boolean;
}
interface ReverseMappedSymbol extends TransientSymbol {
propertyType: Type;
@@ -3338,6 +3355,14 @@ declare namespace ts {
instantiations: Map<TypeReference>;
variances?: Variance[];
}
interface TupleType extends GenericType {
minLength: number;
hasRestElement: boolean;
associatedNames?: __String[];
}
interface TupleTypeReference extends TypeReference {
target: TupleType;
}
interface UnionOrIntersectionType extends Type {
types: Type[];
propertyCache: SymbolTable;
@@ -4905,7 +4930,6 @@ declare namespace ts {
An_object_literal_cannot_have_property_and_accessor_with_the_same_name: DiagnosticMessage;
An_export_assignment_cannot_have_modifiers: DiagnosticMessage;
Octal_literals_are_not_allowed_in_strict_mode: DiagnosticMessage;
A_tuple_type_element_list_cannot_be_empty: DiagnosticMessage;
Variable_declaration_list_cannot_be_empty: DiagnosticMessage;
Digit_expected: DiagnosticMessage;
Hexadecimal_digit_expected: DiagnosticMessage;
@@ -5025,6 +5049,8 @@ declare namespace ts {
_0_tag_cannot_be_used_independently_as_a_top_level_JSDoc_tag: DiagnosticMessage;
A_const_initializer_in_an_ambient_context_must_be_a_string_or_numeric_literal: DiagnosticMessage;
A_definite_assignment_assertion_is_not_permitted_in_this_context: DiagnosticMessage;
A_rest_element_must_be_last_in_a_tuple_type: DiagnosticMessage;
A_required_element_cannot_follow_an_optional_element: DiagnosticMessage;
with_statements_are_not_allowed_in_an_async_function_block: DiagnosticMessage;
await_expression_is_only_allowed_within_an_async_function: DiagnosticMessage;
can_only_be_used_in_an_object_literal_property_inside_a_destructuring_assignment: DiagnosticMessage;
@@ -5321,6 +5347,9 @@ declare namespace ts {
Type_0_is_not_an_array_type_or_a_string_type_Use_compiler_option_downlevelIteration_to_allow_iterating_of_iterators: DiagnosticMessage;
Property_0_does_not_exist_on_type_1_Did_you_forget_to_use_await: DiagnosticMessage;
Object_is_of_type_unknown: DiagnosticMessage;
Rest_signatures_are_incompatible: DiagnosticMessage;
Property_0_is_incompatible_with_rest_element_type: DiagnosticMessage;
A_rest_element_type_must_be_an_array_type: DiagnosticMessage;
JSX_element_attributes_type_0_may_not_be_a_union_type: DiagnosticMessage;
The_return_type_of_a_JSX_element_constructor_must_return_an_object_type: DiagnosticMessage;
JSX_element_implicitly_has_type_any_because_the_global_type_JSX_Element_does_not_exist: DiagnosticMessage;
@@ -7779,7 +7808,11 @@ declare namespace ts {
function createArrayTypeNode(elementType: TypeNode): ArrayTypeNode;
function updateArrayTypeNode(node: ArrayTypeNode, elementType: TypeNode): ArrayTypeNode;
function createTupleTypeNode(elementTypes: ReadonlyArray<TypeNode>): TupleTypeNode;
function updateTypleTypeNode(node: TupleTypeNode, elementTypes: ReadonlyArray<TypeNode>): TupleTypeNode;
function updateTupleTypeNode(node: TupleTypeNode, elementTypes: ReadonlyArray<TypeNode>): TupleTypeNode;
function createOptionalTypeNode(type: TypeNode): OptionalTypeNode;
function updateOptionalTypeNode(node: OptionalTypeNode, type: TypeNode): OptionalTypeNode;
function createRestTypeNode(type: TypeNode): RestTypeNode;
function updateRestTypeNode(node: RestTypeNode, type: TypeNode): RestTypeNode;
function createUnionTypeNode(types: ReadonlyArray<TypeNode>): UnionTypeNode;
function updateUnionTypeNode(node: UnionTypeNode, types: NodeArray<TypeNode>): UnionTypeNode;
function createIntersectionTypeNode(types: ReadonlyArray<TypeNode>): IntersectionTypeNode;
+172 -144
View File
@@ -226,144 +226,147 @@ declare namespace ts {
TypeLiteral = 166,
ArrayType = 167,
TupleType = 168,
UnionType = 169,
IntersectionType = 170,
ConditionalType = 171,
InferType = 172,
ParenthesizedType = 173,
ThisType = 174,
TypeOperator = 175,
IndexedAccessType = 176,
MappedType = 177,
LiteralType = 178,
ImportType = 179,
ObjectBindingPattern = 180,
ArrayBindingPattern = 181,
BindingElement = 182,
ArrayLiteralExpression = 183,
ObjectLiteralExpression = 184,
PropertyAccessExpression = 185,
ElementAccessExpression = 186,
CallExpression = 187,
NewExpression = 188,
TaggedTemplateExpression = 189,
TypeAssertionExpression = 190,
ParenthesizedExpression = 191,
FunctionExpression = 192,
ArrowFunction = 193,
DeleteExpression = 194,
TypeOfExpression = 195,
VoidExpression = 196,
AwaitExpression = 197,
PrefixUnaryExpression = 198,
PostfixUnaryExpression = 199,
BinaryExpression = 200,
ConditionalExpression = 201,
TemplateExpression = 202,
YieldExpression = 203,
SpreadElement = 204,
ClassExpression = 205,
OmittedExpression = 206,
ExpressionWithTypeArguments = 207,
AsExpression = 208,
NonNullExpression = 209,
MetaProperty = 210,
TemplateSpan = 211,
SemicolonClassElement = 212,
Block = 213,
VariableStatement = 214,
EmptyStatement = 215,
ExpressionStatement = 216,
IfStatement = 217,
DoStatement = 218,
WhileStatement = 219,
ForStatement = 220,
ForInStatement = 221,
ForOfStatement = 222,
ContinueStatement = 223,
BreakStatement = 224,
ReturnStatement = 225,
WithStatement = 226,
SwitchStatement = 227,
LabeledStatement = 228,
ThrowStatement = 229,
TryStatement = 230,
DebuggerStatement = 231,
VariableDeclaration = 232,
VariableDeclarationList = 233,
FunctionDeclaration = 234,
ClassDeclaration = 235,
InterfaceDeclaration = 236,
TypeAliasDeclaration = 237,
EnumDeclaration = 238,
ModuleDeclaration = 239,
ModuleBlock = 240,
CaseBlock = 241,
NamespaceExportDeclaration = 242,
ImportEqualsDeclaration = 243,
ImportDeclaration = 244,
ImportClause = 245,
NamespaceImport = 246,
NamedImports = 247,
ImportSpecifier = 248,
ExportAssignment = 249,
ExportDeclaration = 250,
NamedExports = 251,
ExportSpecifier = 252,
MissingDeclaration = 253,
ExternalModuleReference = 254,
JsxElement = 255,
JsxSelfClosingElement = 256,
JsxOpeningElement = 257,
JsxClosingElement = 258,
JsxFragment = 259,
JsxOpeningFragment = 260,
JsxClosingFragment = 261,
JsxAttribute = 262,
JsxAttributes = 263,
JsxSpreadAttribute = 264,
JsxExpression = 265,
CaseClause = 266,
DefaultClause = 267,
HeritageClause = 268,
CatchClause = 269,
PropertyAssignment = 270,
ShorthandPropertyAssignment = 271,
SpreadAssignment = 272,
EnumMember = 273,
SourceFile = 274,
Bundle = 275,
UnparsedSource = 276,
InputFiles = 277,
JSDocTypeExpression = 278,
JSDocAllType = 279,
JSDocUnknownType = 280,
JSDocNullableType = 281,
JSDocNonNullableType = 282,
JSDocOptionalType = 283,
JSDocFunctionType = 284,
JSDocVariadicType = 285,
JSDocComment = 286,
JSDocTypeLiteral = 287,
JSDocSignature = 288,
JSDocTag = 289,
JSDocAugmentsTag = 290,
JSDocClassTag = 291,
JSDocCallbackTag = 292,
JSDocParameterTag = 293,
JSDocReturnTag = 294,
JSDocThisTag = 295,
JSDocTypeTag = 296,
JSDocTemplateTag = 297,
JSDocTypedefTag = 298,
JSDocPropertyTag = 299,
SyntaxList = 300,
NotEmittedStatement = 301,
PartiallyEmittedExpression = 302,
CommaListExpression = 303,
MergeDeclarationMarker = 304,
EndOfDeclarationMarker = 305,
Count = 306,
OptionalType = 169,
RestType = 170,
UnionType = 171,
IntersectionType = 172,
ConditionalType = 173,
InferType = 174,
ParenthesizedType = 175,
ThisType = 176,
TypeOperator = 177,
IndexedAccessType = 178,
MappedType = 179,
LiteralType = 180,
ImportType = 181,
ObjectBindingPattern = 182,
ArrayBindingPattern = 183,
BindingElement = 184,
ArrayLiteralExpression = 185,
ObjectLiteralExpression = 186,
PropertyAccessExpression = 187,
ElementAccessExpression = 188,
CallExpression = 189,
NewExpression = 190,
TaggedTemplateExpression = 191,
TypeAssertionExpression = 192,
ParenthesizedExpression = 193,
FunctionExpression = 194,
ArrowFunction = 195,
DeleteExpression = 196,
TypeOfExpression = 197,
VoidExpression = 198,
AwaitExpression = 199,
PrefixUnaryExpression = 200,
PostfixUnaryExpression = 201,
BinaryExpression = 202,
ConditionalExpression = 203,
TemplateExpression = 204,
YieldExpression = 205,
SpreadElement = 206,
ClassExpression = 207,
OmittedExpression = 208,
ExpressionWithTypeArguments = 209,
AsExpression = 210,
NonNullExpression = 211,
MetaProperty = 212,
SyntheticExpression = 213,
TemplateSpan = 214,
SemicolonClassElement = 215,
Block = 216,
VariableStatement = 217,
EmptyStatement = 218,
ExpressionStatement = 219,
IfStatement = 220,
DoStatement = 221,
WhileStatement = 222,
ForStatement = 223,
ForInStatement = 224,
ForOfStatement = 225,
ContinueStatement = 226,
BreakStatement = 227,
ReturnStatement = 228,
WithStatement = 229,
SwitchStatement = 230,
LabeledStatement = 231,
ThrowStatement = 232,
TryStatement = 233,
DebuggerStatement = 234,
VariableDeclaration = 235,
VariableDeclarationList = 236,
FunctionDeclaration = 237,
ClassDeclaration = 238,
InterfaceDeclaration = 239,
TypeAliasDeclaration = 240,
EnumDeclaration = 241,
ModuleDeclaration = 242,
ModuleBlock = 243,
CaseBlock = 244,
NamespaceExportDeclaration = 245,
ImportEqualsDeclaration = 246,
ImportDeclaration = 247,
ImportClause = 248,
NamespaceImport = 249,
NamedImports = 250,
ImportSpecifier = 251,
ExportAssignment = 252,
ExportDeclaration = 253,
NamedExports = 254,
ExportSpecifier = 255,
MissingDeclaration = 256,
ExternalModuleReference = 257,
JsxElement = 258,
JsxSelfClosingElement = 259,
JsxOpeningElement = 260,
JsxClosingElement = 261,
JsxFragment = 262,
JsxOpeningFragment = 263,
JsxClosingFragment = 264,
JsxAttribute = 265,
JsxAttributes = 266,
JsxSpreadAttribute = 267,
JsxExpression = 268,
CaseClause = 269,
DefaultClause = 270,
HeritageClause = 271,
CatchClause = 272,
PropertyAssignment = 273,
ShorthandPropertyAssignment = 274,
SpreadAssignment = 275,
EnumMember = 276,
SourceFile = 277,
Bundle = 278,
UnparsedSource = 279,
InputFiles = 280,
JSDocTypeExpression = 281,
JSDocAllType = 282,
JSDocUnknownType = 283,
JSDocNullableType = 284,
JSDocNonNullableType = 285,
JSDocOptionalType = 286,
JSDocFunctionType = 287,
JSDocVariadicType = 288,
JSDocComment = 289,
JSDocTypeLiteral = 290,
JSDocSignature = 291,
JSDocTag = 292,
JSDocAugmentsTag = 293,
JSDocClassTag = 294,
JSDocCallbackTag = 295,
JSDocParameterTag = 296,
JSDocReturnTag = 297,
JSDocThisTag = 298,
JSDocTypeTag = 299,
JSDocTemplateTag = 300,
JSDocTypedefTag = 301,
JSDocPropertyTag = 302,
SyntaxList = 303,
NotEmittedStatement = 304,
PartiallyEmittedExpression = 305,
CommaListExpression = 306,
MergeDeclarationMarker = 307,
EndOfDeclarationMarker = 308,
Count = 309,
FirstAssignment = 58,
LastAssignment = 70,
FirstCompoundAssignment = 59,
@@ -375,7 +378,7 @@ declare namespace ts {
FirstFutureReservedWord = 108,
LastFutureReservedWord = 116,
FirstTypeNode = 161,
LastTypeNode = 179,
LastTypeNode = 181,
FirstPunctuation = 17,
LastPunctuation = 70,
FirstToken = 0,
@@ -389,10 +392,10 @@ declare namespace ts {
FirstBinaryOperator = 27,
LastBinaryOperator = 70,
FirstNode = 146,
FirstJSDocNode = 278,
LastJSDocNode = 299,
FirstJSDocTagNode = 289,
LastJSDocTagNode = 299
FirstJSDocNode = 281,
LastJSDocNode = 302,
FirstJSDocTagNode = 292,
LastJSDocTagNode = 302
}
enum NodeFlags {
None = 0,
@@ -751,6 +754,14 @@ declare namespace ts {
kind: SyntaxKind.TupleType;
elementTypes: NodeArray<TypeNode>;
}
interface OptionalTypeNode extends TypeNode {
kind: SyntaxKind.OptionalType;
type: TypeNode;
}
interface RestTypeNode extends TypeNode {
kind: SyntaxKind.RestType;
type: TypeNode;
}
type UnionOrIntersectionTypeNode = UnionTypeNode | IntersectionTypeNode;
interface UnionTypeNode extends TypeNode {
kind: SyntaxKind.UnionType;
@@ -875,6 +886,11 @@ declare namespace ts {
asteriskToken?: AsteriskToken;
expression?: Expression;
}
interface SyntheticExpression extends Expression {
kind: SyntaxKind.SyntheticExpression;
isSpread: boolean;
type: Type;
}
type ExponentiationOperator = SyntaxKind.AsteriskAsteriskToken;
type MultiplicativeOperator = SyntaxKind.AsteriskToken | SyntaxKind.SlashToken | SyntaxKind.PercentToken;
type MultiplicativeOperatorOrHigher = ExponentiationOperator | MultiplicativeOperator;
@@ -2267,6 +2283,14 @@ declare namespace ts {
}
interface GenericType extends InterfaceType, TypeReference {
}
interface TupleType extends GenericType {
minLength: number;
hasRestElement: boolean;
associatedNames?: __String[];
}
interface TupleTypeReference extends TypeReference {
target: TupleType;
}
interface UnionOrIntersectionType extends Type {
types: Type[];
}
@@ -3694,7 +3718,11 @@ declare namespace ts {
function createArrayTypeNode(elementType: TypeNode): ArrayTypeNode;
function updateArrayTypeNode(node: ArrayTypeNode, elementType: TypeNode): ArrayTypeNode;
function createTupleTypeNode(elementTypes: ReadonlyArray<TypeNode>): TupleTypeNode;
function updateTypleTypeNode(node: TupleTypeNode, elementTypes: ReadonlyArray<TypeNode>): TupleTypeNode;
function updateTupleTypeNode(node: TupleTypeNode, elementTypes: ReadonlyArray<TypeNode>): TupleTypeNode;
function createOptionalTypeNode(type: TypeNode): OptionalTypeNode;
function updateOptionalTypeNode(node: OptionalTypeNode, type: TypeNode): OptionalTypeNode;
function createRestTypeNode(type: TypeNode): RestTypeNode;
function updateRestTypeNode(node: RestTypeNode, type: TypeNode): RestTypeNode;
function createUnionTypeNode(types: ReadonlyArray<TypeNode>): UnionTypeNode;
function updateUnionTypeNode(node: UnionTypeNode, types: NodeArray<TypeNode>): UnionTypeNode;
function createIntersectionTypeNode(types: ReadonlyArray<TypeNode>): IntersectionTypeNode;
@@ -1,6 +1,8 @@
tests/cases/conformance/expressions/contextualTyping/argumentExpressionContextualTyping.ts(16,5): error TS2345: Argument of type '(string | number | boolean)[]' is not assignable to parameter of type '[string, number, boolean]'.
Property '0' is missing in type '(string | number | boolean)[]'.
tests/cases/conformance/expressions/contextualTyping/argumentExpressionContextualTyping.ts(17,5): error TS2345: Argument of type '(string | number | boolean)[]' is not assignable to parameter of type '[string, number, boolean]'.
tests/cases/conformance/expressions/contextualTyping/argumentExpressionContextualTyping.ts(17,5): error TS2345: Argument of type '[string, number, true, ...(string | number | boolean)[]]' is not assignable to parameter of type '[string, number, boolean]'.
Types of property 'length' are incompatible.
Type 'number' is not assignable to type '3'.
tests/cases/conformance/expressions/contextualTyping/argumentExpressionContextualTyping.ts(18,5): error TS2345: Argument of type '{ x: (string | number)[]; y: { c: boolean; d: string; e: number; }; }' is not assignable to parameter of type '{ x: [any, any]; y: { c: any; d: any; e: any; }; }'.
Types of property 'x' are incompatible.
Type '(string | number)[]' is not assignable to type '[any, any]'.
@@ -29,7 +31,9 @@ tests/cases/conformance/expressions/contextualTyping/argumentExpressionContextua
!!! error TS2345: Property '0' is missing in type '(string | number | boolean)[]'.
baz(["string", 1, true, ...array]); // Error
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
!!! error TS2345: Argument of type '(string | number | boolean)[]' is not assignable to parameter of type '[string, number, boolean]'.
!!! error TS2345: Argument of type '[string, number, true, ...(string | number | boolean)[]]' is not assignable to parameter of type '[string, number, boolean]'.
!!! error TS2345: Types of property 'length' are incompatible.
!!! error TS2345: Type 'number' is not assignable to type '3'.
foo(o); // Error because x has an array type namely (string|number)[]
~
!!! error TS2345: Argument of type '{ x: (string | number)[]; y: { c: boolean; d: string; e: number; }; }' is not assignable to parameter of type '{ x: [any, any]; y: { c: any; d: any; e: any; }; }'.
@@ -11,7 +11,7 @@ function foo({x: [a, b], y: {c, d, e}}) { }
>e : any
function bar({x: [a, b = 10], y: {c, d, e = { f:1 }}}) { }
>bar : ({ x: [a, b], y: { c, d, e } }: { x: [any, number]; y: { c: any; d: any; e?: { f: number; }; }; }) => void
>bar : ({ x: [a, b], y: { c, d, e } }: { x: [any, number?]; y: { c: any; d: any; e?: { f: number; }; }; }) => void
>x : any
>a : any
>b : number
@@ -7,8 +7,9 @@ tests/cases/conformance/expressions/contextualTyping/arrayLiteralExpressionConte
tests/cases/conformance/expressions/contextualTyping/arrayLiteralExpressionContextualTyping.ts(8,5): error TS2322: Type '[number, number, number, string]' is not assignable to type '[number, number, number]'.
Types of property 'length' are incompatible.
Type '4' is not assignable to type '3'.
tests/cases/conformance/expressions/contextualTyping/arrayLiteralExpressionContextualTyping.ts(14,5): error TS2322: Type 'number[]' is not assignable to type '[number, number, number]'.
Property '0' is missing in type 'number[]'.
tests/cases/conformance/expressions/contextualTyping/arrayLiteralExpressionContextualTyping.ts(14,5): error TS2322: Type '[number, number, number, ...number[]]' is not assignable to type '[number, number, number]'.
Types of property 'length' are incompatible.
Type 'number' is not assignable to type '3'.
==== tests/cases/conformance/expressions/contextualTyping/arrayLiteralExpressionContextualTyping.ts (4 errors) ====
@@ -39,6 +40,7 @@ tests/cases/conformance/expressions/contextualTyping/arrayLiteralExpressionConte
var spr1 = [1, 2, 3, ...tup];
var spr2:[number, number, number] = [1, 2, 3, ...tup]; // Error
~~~~
!!! error TS2322: Type 'number[]' is not assignable to type '[number, number, number]'.
!!! error TS2322: Property '0' is missing in type 'number[]'.
!!! error TS2322: Type '[number, number, number, ...number[]]' is not assignable to type '[number, number, number]'.
!!! error TS2322: Types of property 'length' are incompatible.
!!! error TS2322: Type 'number' is not assignable to type '3'.
@@ -62,7 +62,7 @@ var spr1 = [1, 2, 3, ...tup];
var spr2:[number, number, number] = [1, 2, 3, ...tup]; // Error
>spr2 : [number, number, number]
>[1, 2, 3, ...tup] : number[]
>[1, 2, 3, ...tup] : [number, number, number, ...number[]]
>1 : 1
>2 : 2
>3 : 3
@@ -1,5 +1,5 @@
tests/cases/conformance/expressions/arrayLiterals/arrayLiterals3.ts(10,5): error TS2322: Type 'undefined[]' is not assignable to type '[any, any, any]'.
Property '0' is missing in type 'undefined[]'.
tests/cases/conformance/expressions/arrayLiterals/arrayLiterals3.ts(10,5): error TS2322: Type '[]' is not assignable to type '[any, any, any]'.
Property '0' is missing in type '[]'.
tests/cases/conformance/expressions/arrayLiterals/arrayLiterals3.ts(11,5): error TS2322: Type '[string, number, boolean]' is not assignable to type '[boolean, string, number]'.
Type 'string' is not assignable to type 'boolean'.
tests/cases/conformance/expressions/arrayLiterals/arrayLiterals3.ts(17,5): error TS2322: Type '[number, number, string, boolean]' is not assignable to type '[number, number]'.
@@ -30,8 +30,8 @@ tests/cases/conformance/expressions/arrayLiterals/arrayLiterals3.ts(34,5): error
var a0: [any, any, any] = []; // Error
~~
!!! error TS2322: Type 'undefined[]' is not assignable to type '[any, any, any]'.
!!! error TS2322: Property '0' is missing in type 'undefined[]'.
!!! error TS2322: Type '[]' is not assignable to type '[any, any, any]'.
!!! error TS2322: Property '0' is missing in type '[]'.
var a1: [boolean, string, number] = ["string", 1, true]; // Error
~~
!!! error TS2322: Type '[string, number, boolean]' is not assignable to type '[boolean, string, number]'.
@@ -10,7 +10,7 @@
var a0: [any, any, any] = []; // Error
>a0 : [any, any, any]
>[] : undefined[]
>[] : []
var a1: [boolean, string, number] = ["string", 1, true]; // Error
>a1 : [boolean, string, number]
@@ -71,14 +71,14 @@ var p3 = ([, a]) => { };
>a : any
var p4 = ([, ...a]) => { };
>p4 : ([, ...a]: any[]) => void
>([, ...a]) => { } : ([, ...a]: any[]) => void
>p4 : ([, ...a]: [any?, ...any[]]) => void
>([, ...a]) => { } : ([, ...a]: [any?, ...any[]]) => void
> : undefined
>a : any[]
var p5 = ([a = 1]) => { };
>p5 : ([a]: [number]) => void
>([a = 1]) => { } : ([a]: [number]) => void
>p5 : ([a]: [number?]) => void
>([a = 1]) => { } : ([a]: [number?]) => void
>a : number
>1 : 1
@@ -2,19 +2,16 @@ tests/cases/conformance/expressions/functionCalls/callWithSpread2.ts(22,1): erro
tests/cases/conformance/expressions/functionCalls/callWithSpread2.ts(23,1): error TS2556: Expected 0 arguments, but got 1 or more.
tests/cases/conformance/expressions/functionCalls/callWithSpread2.ts(26,5): error TS2345: Argument of type 'string | number' is not assignable to parameter of type 'number'.
Type 'string' is not assignable to type 'number'.
tests/cases/conformance/expressions/functionCalls/callWithSpread2.ts(27,5): error TS2345: Argument of type 'string | number' is not assignable to parameter of type 'number'.
Type 'string' is not assignable to type 'number'.
tests/cases/conformance/expressions/functionCalls/callWithSpread2.ts(27,5): error TS2345: Argument of type 'string' is not assignable to parameter of type 'number'.
tests/cases/conformance/expressions/functionCalls/callWithSpread2.ts(28,13): error TS2345: Argument of type 'string | number' is not assignable to parameter of type 'number'.
Type 'string' is not assignable to type 'number'.
tests/cases/conformance/expressions/functionCalls/callWithSpread2.ts(29,13): error TS2345: Argument of type 'string | number' is not assignable to parameter of type 'number'.
Type 'string' is not assignable to type 'number'.
tests/cases/conformance/expressions/functionCalls/callWithSpread2.ts(29,13): error TS2345: Argument of type 'string' is not assignable to parameter of type 'number'.
tests/cases/conformance/expressions/functionCalls/callWithSpread2.ts(30,11): error TS2345: Argument of type 'string | number' is not assignable to parameter of type 'number'.
Type 'string' is not assignable to type 'number'.
tests/cases/conformance/expressions/functionCalls/callWithSpread2.ts(31,11): error TS2345: Argument of type 'string | number' is not assignable to parameter of type 'number'.
Type 'string' is not assignable to type 'number'.
tests/cases/conformance/expressions/functionCalls/callWithSpread2.ts(31,11): error TS2345: Argument of type 'string' is not assignable to parameter of type 'number'.
tests/cases/conformance/expressions/functionCalls/callWithSpread2.ts(32,1): error TS2556: Expected 1-3 arguments, but got 0 or more.
tests/cases/conformance/expressions/functionCalls/callWithSpread2.ts(33,1): error TS2556: Expected 1-3 arguments, but got 0 or more.
tests/cases/conformance/expressions/functionCalls/callWithSpread2.ts(34,1): error TS2556: Expected 1-3 arguments, but got 0 or more.
tests/cases/conformance/expressions/functionCalls/callWithSpread2.ts(34,8): error TS2345: Argument of type 'number' is not assignable to parameter of type 'string'.
==== tests/cases/conformance/expressions/functionCalls/callWithSpread2.ts (11 errors) ====
@@ -53,24 +50,21 @@ tests/cases/conformance/expressions/functionCalls/callWithSpread2.ts(34,1): erro
!!! error TS2345: Type 'string' is not assignable to type 'number'.
all(...tuple)
~~~~~~~~
!!! error TS2345: Argument of type 'string | number' is not assignable to parameter of type 'number'.
!!! error TS2345: Type 'string' is not assignable to type 'number'.
!!! error TS2345: Argument of type 'string' is not assignable to parameter of type 'number'.
prefix("b", ...mixed)
~~~~~~~~
!!! error TS2345: Argument of type 'string | number' is not assignable to parameter of type 'number'.
!!! error TS2345: Type 'string' is not assignable to type 'number'.
prefix("c", ...tuple)
~~~~~~~~
!!! error TS2345: Argument of type 'string | number' is not assignable to parameter of type 'number'.
!!! error TS2345: Type 'string' is not assignable to type 'number'.
!!! error TS2345: Argument of type 'string' is not assignable to parameter of type 'number'.
rest("e", ...mixed)
~~~~~~~~
!!! error TS2345: Argument of type 'string | number' is not assignable to parameter of type 'number'.
!!! error TS2345: Type 'string' is not assignable to type 'number'.
rest("f", ...tuple)
~~~~~~~~
!!! error TS2345: Argument of type 'string | number' is not assignable to parameter of type 'number'.
!!! error TS2345: Type 'string' is not assignable to type 'number'.
!!! error TS2345: Argument of type 'string' is not assignable to parameter of type 'number'.
prefix(...ns) // required parameters are required
~~~~~~~~~~~~~
!!! error TS2556: Expected 1-3 arguments, but got 0 or more.
@@ -78,6 +72,6 @@ tests/cases/conformance/expressions/functionCalls/callWithSpread2.ts(34,1): erro
~~~~~~~~~~~~~~~~
!!! error TS2556: Expected 1-3 arguments, but got 0 or more.
prefix(...tuple)
~~~~~~~~~~~~~~~~
!!! error TS2556: Expected 1-3 arguments, but got 0 or more.
~~~~~~~~
!!! error TS2345: Argument of type 'number' is not assignable to parameter of type 'string'.
@@ -14,5 +14,5 @@ function foo(_a) {
//// [declarationEmitDestructuring3.d.ts]
declare function bar([x, z, ...w]: any[]): void;
declare function foo([x, ...y]?: (string | number | boolean)[]): void;
declare function bar([x, z, ...w]: [any, any, ...any[]]): void;
declare function foo([x, ...y]?: [number, string, boolean]): void;
@@ -1,15 +1,15 @@
=== tests/cases/compiler/declarationEmitDestructuring3.ts ===
function bar([x, z, ...w]) { }
>bar : ([x, z, ...w]: any[]) => void
>bar : ([x, z, ...w]: [any, any, ...any[]]) => void
>x : any
>z : any
>w : any[]
function foo([x, ...y] = [1, "string", true]) { }
>foo : ([x, ...y]?: (string | number | boolean)[]) => void
>x : string | number | boolean
>y : (string | number | boolean)[]
>[1, "string", true] : (string | number | boolean)[]
>foo : ([x, ...y]?: [number, string, boolean]) => void
>x : number
>y : (string | boolean)[]
>[1, "string", true] : [number, string, boolean]
>1 : 1
>"string" : "string"
>true : true
@@ -24,8 +24,8 @@ function bar2(_a) {
//// [declarationEmitDestructuring5.d.ts]
declare function baz([, z, ,]: [any, any, any]): void;
declare function baz([, z, ,]: [any, any, any?]): void;
declare function foo([, b,]: [any, any]): void;
declare function bar([z, , ,]: [any, any, any]): void;
declare function bar([z, , ,]: [any, any?, any?]): void;
declare function bar1([z, , ,]?: [number, number, number, number, number]): void;
declare function bar2([, , z, , ,]: [any, any, any, any, any]): void;
declare function bar2([, , z, , ,]: [any, any, any, any?, any?]): void;
@@ -1,6 +1,6 @@
=== tests/cases/compiler/declarationEmitDestructuring5.ts ===
function baz([, z, , ]) { }
>baz : ([, z, ,]: [any, any, any]) => void
>baz : ([, z, ,]: [any, any, any?]) => void
> : undefined
>z : any
> : undefined
@@ -11,7 +11,7 @@ function foo([, b, ]: [any, any]): void { }
>b : any
function bar([z, , , ]) { }
>bar : ([z, , ,]: [any, any, any]) => void
>bar : ([z, , ,]: [any, any?, any?]) => void
>z : any
> : undefined
> : undefined
@@ -29,7 +29,7 @@ function bar1([z, , , ] = [1, 3, 4, 6, 7]) { }
>7 : 7
function bar2([,,z, , , ]) { }
>bar2 : ([, , z, , ,]: [any, any, any, any, any]) => void
>bar2 : ([, , z, , ,]: [any, any, any, any?, any?]) => void
> : undefined
> : undefined
>z : any
@@ -23,7 +23,7 @@ var [a11, b11, c11] = [];
>a11 : any
>b11 : any
>c11 : any
>[] : [undefined, undefined, undefined]
>[] : [undefined?, undefined?, undefined?]
var [a2, [b2, { x12, y12: c2 }]=["abc", { x12: 10, y12: false }]] = [1, ["hello", { x12: 5, y12: true }]];
>a2 : number
@@ -24,8 +24,8 @@ var _f = [1, "hello", true], x19 = _f[0], y19 = _f[1], z19 = _f[2], a13 = _f.sli
declare var a5: number[];
declare var x14: number, a6: number[];
declare var x15: number, y15: number, a7: number[];
declare var x16: number, y16: number, z16: number, a8: number[];
declare var x16: number, y16: number, z16: number, a8: any[];
declare var a9: (string | number | boolean)[];
declare var x17: string | number | boolean, a10: (string | number | boolean)[];
declare var x18: string | number | boolean, y18: string | number | boolean, a12: (string | number | boolean)[];
declare var x19: string | number | boolean, y19: string | number | boolean, z19: string | number | boolean, a13: (string | number | boolean)[];
declare var x17: number, a10: (string | boolean)[];
declare var x18: number, y18: string, a12: boolean[];
declare var x19: number, y19: string, z19: boolean, a13: any[];
@@ -9,7 +9,7 @@ var [...a5] = [1, 2, 3];
var [x14, ...a6] = [1, 2, 3];
>x14 : number
>a6 : number[]
>[1, 2, 3] : number[]
>[1, 2, 3] : [number, number, number]
>1 : 1
>2 : 2
>3 : 3
@@ -18,7 +18,7 @@ var [x15, y15, ...a7] = [1, 2, 3];
>x15 : number
>y15 : number
>a7 : number[]
>[1, 2, 3] : number[]
>[1, 2, 3] : [number, number, number]
>1 : 1
>2 : 2
>3 : 3
@@ -27,8 +27,8 @@ var [x16, y16, z16, ...a8] = [1, 2, 3];
>x16 : number
>y16 : number
>z16 : number
>a8 : number[]
>[1, 2, 3] : number[]
>a8 : any[]
>[1, 2, 3] : [number, number, number]
>1 : 1
>2 : 2
>3 : 3
@@ -41,28 +41,28 @@ var [...a9] = [1, "hello", true];
>true : true
var [x17, ...a10] = [1, "hello", true];
>x17 : string | number | boolean
>a10 : (string | number | boolean)[]
>[1, "hello", true] : (string | number | boolean)[]
>x17 : number
>a10 : (string | boolean)[]
>[1, "hello", true] : [number, string, boolean]
>1 : 1
>"hello" : "hello"
>true : true
var [x18, y18, ...a12] = [1, "hello", true];
>x18 : string | number | boolean
>y18 : string | number | boolean
>a12 : (string | number | boolean)[]
>[1, "hello", true] : (string | number | boolean)[]
>x18 : number
>y18 : string
>a12 : boolean[]
>[1, "hello", true] : [number, string, boolean]
>1 : 1
>"hello" : "hello"
>true : true
var [x19, y19, z19, ...a13] = [1, "hello", true];
>x19 : string | number | boolean
>y19 : string | number | boolean
>z19 : string | number | boolean
>a13 : (string | number | boolean)[]
>[1, "hello", true] : (string | number | boolean)[]
>x19 : number
>y19 : string
>z19 : boolean
>a13 : any[]
>[1, "hello", true] : [number, string, boolean]
>1 : 1
>"hello" : "hello"
>true : true
@@ -103,7 +103,7 @@ tests/cases/conformance/es6/destructuring/declarationsAndAssignments.ts(138,9):
}
function f8() {
var [a, b, c] = []; // Ok, [] is an array
var [a, b, c] = []; // Error, [] is an empty tuple
~
!!! error TS2525: Initializer provides no value for this binding element and the binding element has no default value.
~
@@ -224,32 +224,36 @@ tests/cases/conformance/es6/destructuring/declarationsAndAssignments.ts(138,9):
}
function f20() {
var a: number[];
var x: number;
var y: number;
var z: number;
var a: number[];
var a3: any[];
var [...a] = [1, 2, 3];
var [x, ...a] = [1, 2, 3];
var [x, y, ...a] = [1, 2, 3];
var [x, y, z, ...a] = [1, 2, 3];
var [x, y, z, ...a3] = [1, 2, 3];
[...a] = [1, 2, 3];
[x, ...a] = [1, 2, 3];
[x, y, ...a] = [1, 2, 3];
[x, y, z, ...a] = [1, 2, 3];
[x, y, z, ...a3] = [1, 2, 3];
}
function f21() {
var a: (number | string | boolean)[];
var x: number | string | boolean;
var y: number | string | boolean;
var z: number | string | boolean;
var [...a] = [1, "hello", true];
var [x, ...a] = [1, "hello", true];
var [x, y, ...a] = [1, "hello", true];
var [x, y, z, ...a] = [1, "hello", true];
[...a] = [1, "hello", true];
[x, ...a] = [1, "hello", true];
[x, y, ...a] = [1, "hello", true];
[x, y, z, ...a] = [1, "hello", true];
var x: number;
var y: string;
var z: boolean;
var a0: (number | string | boolean)[];
var a1: (string | boolean)[];
var a2: boolean[];
var a3: any[];
var [...a0] = [1, "hello", true];
var [x, ...a1] = [1, "hello", true];
var [x, y, ...a2] = [1, "hello", true];
var [x, y, z, ...a3] = [1, "hello", true];
[...a0] = [1, "hello", true];
[x, ...a1] = [1, "hello", true];
[x, y, ...a2] = [1, "hello", true];
[x, y, z, ...a3] = [1, "hello", true];
}
@@ -60,7 +60,7 @@ function f7() {
}
function f8() {
var [a, b, c] = []; // Ok, [] is an array
var [a, b, c] = []; // Error, [] is an empty tuple
var [d, e, f] = [1]; // Error, [1] is a tuple
}
@@ -150,33 +150,37 @@ function f19() {
}
function f20() {
var a: number[];
var x: number;
var y: number;
var z: number;
var a: number[];
var a3: any[];
var [...a] = [1, 2, 3];
var [x, ...a] = [1, 2, 3];
var [x, y, ...a] = [1, 2, 3];
var [x, y, z, ...a] = [1, 2, 3];
var [x, y, z, ...a3] = [1, 2, 3];
[...a] = [1, 2, 3];
[x, ...a] = [1, 2, 3];
[x, y, ...a] = [1, 2, 3];
[x, y, z, ...a] = [1, 2, 3];
[x, y, z, ...a3] = [1, 2, 3];
}
function f21() {
var a: (number | string | boolean)[];
var x: number | string | boolean;
var y: number | string | boolean;
var z: number | string | boolean;
var [...a] = [1, "hello", true];
var [x, ...a] = [1, "hello", true];
var [x, y, ...a] = [1, "hello", true];
var [x, y, z, ...a] = [1, "hello", true];
[...a] = [1, "hello", true];
[x, ...a] = [1, "hello", true];
[x, y, ...a] = [1, "hello", true];
[x, y, z, ...a] = [1, "hello", true];
var x: number;
var y: string;
var z: boolean;
var a0: (number | string | boolean)[];
var a1: (string | boolean)[];
var a2: boolean[];
var a3: any[];
var [...a0] = [1, "hello", true];
var [x, ...a1] = [1, "hello", true];
var [x, y, ...a2] = [1, "hello", true];
var [x, y, z, ...a3] = [1, "hello", true];
[...a0] = [1, "hello", true];
[x, ...a1] = [1, "hello", true];
[x, y, ...a2] = [1, "hello", true];
[x, y, z, ...a3] = [1, "hello", true];
}
@@ -235,7 +239,7 @@ function f7() {
var y;
}
function f8() {
var _a = [], a = _a[0], b = _a[1], c = _a[2]; // Ok, [] is an array
var _a = [], a = _a[0], b = _a[1], c = _a[2]; // Error, [] is an empty tuple
var _b = [1], d = _b[0], e = _b[1], f = _b[2]; // Error, [1] is a tuple
}
function f9() {
@@ -318,31 +322,35 @@ function f19() {
}
function f20() {
var _a, _b, _c;
var a;
var x;
var y;
var z;
var a;
var a3;
var a = [1, 2, 3].slice(0);
var _d = [1, 2, 3], x = _d[0], a = _d.slice(1);
var _e = [1, 2, 3], x = _e[0], y = _e[1], a = _e.slice(2);
var _f = [1, 2, 3], x = _f[0], y = _f[1], z = _f[2], a = _f.slice(3);
var _f = [1, 2, 3], x = _f[0], y = _f[1], z = _f[2], a3 = _f.slice(3);
a = [1, 2, 3].slice(0);
_a = [1, 2, 3], x = _a[0], a = _a.slice(1);
_b = [1, 2, 3], x = _b[0], y = _b[1], a = _b.slice(2);
_c = [1, 2, 3], x = _c[0], y = _c[1], z = _c[2], a = _c.slice(3);
_c = [1, 2, 3], x = _c[0], y = _c[1], z = _c[2], a3 = _c.slice(3);
}
function f21() {
var _a, _b, _c;
var a;
var x;
var y;
var z;
var a = [1, "hello", true].slice(0);
var _d = [1, "hello", true], x = _d[0], a = _d.slice(1);
var _e = [1, "hello", true], x = _e[0], y = _e[1], a = _e.slice(2);
var _f = [1, "hello", true], x = _f[0], y = _f[1], z = _f[2], a = _f.slice(3);
a = [1, "hello", true].slice(0);
_a = [1, "hello", true], x = _a[0], a = _a.slice(1);
_b = [1, "hello", true], x = _b[0], y = _b[1], a = _b.slice(2);
_c = [1, "hello", true], x = _c[0], y = _c[1], z = _c[2], a = _c.slice(3);
var a0;
var a1;
var a2;
var a3;
var a0 = [1, "hello", true].slice(0);
var _d = [1, "hello", true], x = _d[0], a1 = _d.slice(1);
var _e = [1, "hello", true], x = _e[0], y = _e[1], a2 = _e.slice(2);
var _f = [1, "hello", true], x = _f[0], y = _f[1], z = _f[2], a3 = _f.slice(3);
a0 = [1, "hello", true].slice(0);
_a = [1, "hello", true], x = _a[0], a1 = _a.slice(1);
_b = [1, "hello", true], x = _b[0], y = _b[1], a2 = _b.slice(2);
_c = [1, "hello", true], x = _c[0], y = _c[1], z = _c[2], a3 = _c.slice(3);
}
@@ -189,7 +189,7 @@ function f7() {
function f8() {
>f8 : Symbol(f8, Decl(declarationsAndAssignments.ts, 58, 1))
var [a, b, c] = []; // Ok, [] is an array
var [a, b, c] = []; // Error, [] is an empty tuple
>a : Symbol(a, Decl(declarationsAndAssignments.ts, 61, 9))
>b : Symbol(b, Decl(declarationsAndAssignments.ts, 61, 11))
>c : Symbol(c, Decl(declarationsAndAssignments.ts, 61, 14))
@@ -474,104 +474,116 @@ function f19() {
function f20() {
>f20 : Symbol(f20, Decl(declarationsAndAssignments.ts, 148, 1))
var a: number[];
>a : Symbol(a, Decl(declarationsAndAssignments.ts, 151, 7), Decl(declarationsAndAssignments.ts, 155, 9), Decl(declarationsAndAssignments.ts, 156, 11), Decl(declarationsAndAssignments.ts, 157, 14), Decl(declarationsAndAssignments.ts, 158, 17))
var x: number;
>x : Symbol(x, Decl(declarationsAndAssignments.ts, 152, 7), Decl(declarationsAndAssignments.ts, 156, 9), Decl(declarationsAndAssignments.ts, 157, 9), Decl(declarationsAndAssignments.ts, 158, 9))
>x : Symbol(x, Decl(declarationsAndAssignments.ts, 151, 7), Decl(declarationsAndAssignments.ts, 157, 9), Decl(declarationsAndAssignments.ts, 158, 9), Decl(declarationsAndAssignments.ts, 159, 9))
var y: number;
>y : Symbol(y, Decl(declarationsAndAssignments.ts, 153, 7), Decl(declarationsAndAssignments.ts, 157, 11), Decl(declarationsAndAssignments.ts, 158, 11))
>y : Symbol(y, Decl(declarationsAndAssignments.ts, 152, 7), Decl(declarationsAndAssignments.ts, 158, 11), Decl(declarationsAndAssignments.ts, 159, 11))
var z: number;
>z : Symbol(z, Decl(declarationsAndAssignments.ts, 154, 7), Decl(declarationsAndAssignments.ts, 158, 14))
>z : Symbol(z, Decl(declarationsAndAssignments.ts, 153, 7), Decl(declarationsAndAssignments.ts, 159, 14))
var a: number[];
>a : Symbol(a, Decl(declarationsAndAssignments.ts, 154, 7), Decl(declarationsAndAssignments.ts, 156, 9), Decl(declarationsAndAssignments.ts, 157, 11), Decl(declarationsAndAssignments.ts, 158, 14))
var a3: any[];
>a3 : Symbol(a3, Decl(declarationsAndAssignments.ts, 155, 7), Decl(declarationsAndAssignments.ts, 159, 17))
var [...a] = [1, 2, 3];
>a : Symbol(a, Decl(declarationsAndAssignments.ts, 151, 7), Decl(declarationsAndAssignments.ts, 155, 9), Decl(declarationsAndAssignments.ts, 156, 11), Decl(declarationsAndAssignments.ts, 157, 14), Decl(declarationsAndAssignments.ts, 158, 17))
>a : Symbol(a, Decl(declarationsAndAssignments.ts, 154, 7), Decl(declarationsAndAssignments.ts, 156, 9), Decl(declarationsAndAssignments.ts, 157, 11), Decl(declarationsAndAssignments.ts, 158, 14))
var [x, ...a] = [1, 2, 3];
>x : Symbol(x, Decl(declarationsAndAssignments.ts, 152, 7), Decl(declarationsAndAssignments.ts, 156, 9), Decl(declarationsAndAssignments.ts, 157, 9), Decl(declarationsAndAssignments.ts, 158, 9))
>a : Symbol(a, Decl(declarationsAndAssignments.ts, 151, 7), Decl(declarationsAndAssignments.ts, 155, 9), Decl(declarationsAndAssignments.ts, 156, 11), Decl(declarationsAndAssignments.ts, 157, 14), Decl(declarationsAndAssignments.ts, 158, 17))
>x : Symbol(x, Decl(declarationsAndAssignments.ts, 151, 7), Decl(declarationsAndAssignments.ts, 157, 9), Decl(declarationsAndAssignments.ts, 158, 9), Decl(declarationsAndAssignments.ts, 159, 9))
>a : Symbol(a, Decl(declarationsAndAssignments.ts, 154, 7), Decl(declarationsAndAssignments.ts, 156, 9), Decl(declarationsAndAssignments.ts, 157, 11), Decl(declarationsAndAssignments.ts, 158, 14))
var [x, y, ...a] = [1, 2, 3];
>x : Symbol(x, Decl(declarationsAndAssignments.ts, 152, 7), Decl(declarationsAndAssignments.ts, 156, 9), Decl(declarationsAndAssignments.ts, 157, 9), Decl(declarationsAndAssignments.ts, 158, 9))
>y : Symbol(y, Decl(declarationsAndAssignments.ts, 153, 7), Decl(declarationsAndAssignments.ts, 157, 11), Decl(declarationsAndAssignments.ts, 158, 11))
>a : Symbol(a, Decl(declarationsAndAssignments.ts, 151, 7), Decl(declarationsAndAssignments.ts, 155, 9), Decl(declarationsAndAssignments.ts, 156, 11), Decl(declarationsAndAssignments.ts, 157, 14), Decl(declarationsAndAssignments.ts, 158, 17))
>x : Symbol(x, Decl(declarationsAndAssignments.ts, 151, 7), Decl(declarationsAndAssignments.ts, 157, 9), Decl(declarationsAndAssignments.ts, 158, 9), Decl(declarationsAndAssignments.ts, 159, 9))
>y : Symbol(y, Decl(declarationsAndAssignments.ts, 152, 7), Decl(declarationsAndAssignments.ts, 158, 11), Decl(declarationsAndAssignments.ts, 159, 11))
>a : Symbol(a, Decl(declarationsAndAssignments.ts, 154, 7), Decl(declarationsAndAssignments.ts, 156, 9), Decl(declarationsAndAssignments.ts, 157, 11), Decl(declarationsAndAssignments.ts, 158, 14))
var [x, y, z, ...a] = [1, 2, 3];
>x : Symbol(x, Decl(declarationsAndAssignments.ts, 152, 7), Decl(declarationsAndAssignments.ts, 156, 9), Decl(declarationsAndAssignments.ts, 157, 9), Decl(declarationsAndAssignments.ts, 158, 9))
>y : Symbol(y, Decl(declarationsAndAssignments.ts, 153, 7), Decl(declarationsAndAssignments.ts, 157, 11), Decl(declarationsAndAssignments.ts, 158, 11))
>z : Symbol(z, Decl(declarationsAndAssignments.ts, 154, 7), Decl(declarationsAndAssignments.ts, 158, 14))
>a : Symbol(a, Decl(declarationsAndAssignments.ts, 151, 7), Decl(declarationsAndAssignments.ts, 155, 9), Decl(declarationsAndAssignments.ts, 156, 11), Decl(declarationsAndAssignments.ts, 157, 14), Decl(declarationsAndAssignments.ts, 158, 17))
var [x, y, z, ...a3] = [1, 2, 3];
>x : Symbol(x, Decl(declarationsAndAssignments.ts, 151, 7), Decl(declarationsAndAssignments.ts, 157, 9), Decl(declarationsAndAssignments.ts, 158, 9), Decl(declarationsAndAssignments.ts, 159, 9))
>y : Symbol(y, Decl(declarationsAndAssignments.ts, 152, 7), Decl(declarationsAndAssignments.ts, 158, 11), Decl(declarationsAndAssignments.ts, 159, 11))
>z : Symbol(z, Decl(declarationsAndAssignments.ts, 153, 7), Decl(declarationsAndAssignments.ts, 159, 14))
>a3 : Symbol(a3, Decl(declarationsAndAssignments.ts, 155, 7), Decl(declarationsAndAssignments.ts, 159, 17))
[...a] = [1, 2, 3];
>a : Symbol(a, Decl(declarationsAndAssignments.ts, 151, 7), Decl(declarationsAndAssignments.ts, 155, 9), Decl(declarationsAndAssignments.ts, 156, 11), Decl(declarationsAndAssignments.ts, 157, 14), Decl(declarationsAndAssignments.ts, 158, 17))
>a : Symbol(a, Decl(declarationsAndAssignments.ts, 154, 7), Decl(declarationsAndAssignments.ts, 156, 9), Decl(declarationsAndAssignments.ts, 157, 11), Decl(declarationsAndAssignments.ts, 158, 14))
[x, ...a] = [1, 2, 3];
>x : Symbol(x, Decl(declarationsAndAssignments.ts, 152, 7), Decl(declarationsAndAssignments.ts, 156, 9), Decl(declarationsAndAssignments.ts, 157, 9), Decl(declarationsAndAssignments.ts, 158, 9))
>a : Symbol(a, Decl(declarationsAndAssignments.ts, 151, 7), Decl(declarationsAndAssignments.ts, 155, 9), Decl(declarationsAndAssignments.ts, 156, 11), Decl(declarationsAndAssignments.ts, 157, 14), Decl(declarationsAndAssignments.ts, 158, 17))
>x : Symbol(x, Decl(declarationsAndAssignments.ts, 151, 7), Decl(declarationsAndAssignments.ts, 157, 9), Decl(declarationsAndAssignments.ts, 158, 9), Decl(declarationsAndAssignments.ts, 159, 9))
>a : Symbol(a, Decl(declarationsAndAssignments.ts, 154, 7), Decl(declarationsAndAssignments.ts, 156, 9), Decl(declarationsAndAssignments.ts, 157, 11), Decl(declarationsAndAssignments.ts, 158, 14))
[x, y, ...a] = [1, 2, 3];
>x : Symbol(x, Decl(declarationsAndAssignments.ts, 152, 7), Decl(declarationsAndAssignments.ts, 156, 9), Decl(declarationsAndAssignments.ts, 157, 9), Decl(declarationsAndAssignments.ts, 158, 9))
>y : Symbol(y, Decl(declarationsAndAssignments.ts, 153, 7), Decl(declarationsAndAssignments.ts, 157, 11), Decl(declarationsAndAssignments.ts, 158, 11))
>a : Symbol(a, Decl(declarationsAndAssignments.ts, 151, 7), Decl(declarationsAndAssignments.ts, 155, 9), Decl(declarationsAndAssignments.ts, 156, 11), Decl(declarationsAndAssignments.ts, 157, 14), Decl(declarationsAndAssignments.ts, 158, 17))
>x : Symbol(x, Decl(declarationsAndAssignments.ts, 151, 7), Decl(declarationsAndAssignments.ts, 157, 9), Decl(declarationsAndAssignments.ts, 158, 9), Decl(declarationsAndAssignments.ts, 159, 9))
>y : Symbol(y, Decl(declarationsAndAssignments.ts, 152, 7), Decl(declarationsAndAssignments.ts, 158, 11), Decl(declarationsAndAssignments.ts, 159, 11))
>a : Symbol(a, Decl(declarationsAndAssignments.ts, 154, 7), Decl(declarationsAndAssignments.ts, 156, 9), Decl(declarationsAndAssignments.ts, 157, 11), Decl(declarationsAndAssignments.ts, 158, 14))
[x, y, z, ...a] = [1, 2, 3];
>x : Symbol(x, Decl(declarationsAndAssignments.ts, 152, 7), Decl(declarationsAndAssignments.ts, 156, 9), Decl(declarationsAndAssignments.ts, 157, 9), Decl(declarationsAndAssignments.ts, 158, 9))
>y : Symbol(y, Decl(declarationsAndAssignments.ts, 153, 7), Decl(declarationsAndAssignments.ts, 157, 11), Decl(declarationsAndAssignments.ts, 158, 11))
>z : Symbol(z, Decl(declarationsAndAssignments.ts, 154, 7), Decl(declarationsAndAssignments.ts, 158, 14))
>a : Symbol(a, Decl(declarationsAndAssignments.ts, 151, 7), Decl(declarationsAndAssignments.ts, 155, 9), Decl(declarationsAndAssignments.ts, 156, 11), Decl(declarationsAndAssignments.ts, 157, 14), Decl(declarationsAndAssignments.ts, 158, 17))
[x, y, z, ...a3] = [1, 2, 3];
>x : Symbol(x, Decl(declarationsAndAssignments.ts, 151, 7), Decl(declarationsAndAssignments.ts, 157, 9), Decl(declarationsAndAssignments.ts, 158, 9), Decl(declarationsAndAssignments.ts, 159, 9))
>y : Symbol(y, Decl(declarationsAndAssignments.ts, 152, 7), Decl(declarationsAndAssignments.ts, 158, 11), Decl(declarationsAndAssignments.ts, 159, 11))
>z : Symbol(z, Decl(declarationsAndAssignments.ts, 153, 7), Decl(declarationsAndAssignments.ts, 159, 14))
>a3 : Symbol(a3, Decl(declarationsAndAssignments.ts, 155, 7), Decl(declarationsAndAssignments.ts, 159, 17))
}
function f21() {
>f21 : Symbol(f21, Decl(declarationsAndAssignments.ts, 163, 1))
>f21 : Symbol(f21, Decl(declarationsAndAssignments.ts, 164, 1))
var a: (number | string | boolean)[];
>a : Symbol(a, Decl(declarationsAndAssignments.ts, 166, 7), Decl(declarationsAndAssignments.ts, 170, 9), Decl(declarationsAndAssignments.ts, 171, 11), Decl(declarationsAndAssignments.ts, 172, 14), Decl(declarationsAndAssignments.ts, 173, 17))
var x: number;
>x : Symbol(x, Decl(declarationsAndAssignments.ts, 167, 7), Decl(declarationsAndAssignments.ts, 175, 9), Decl(declarationsAndAssignments.ts, 176, 9), Decl(declarationsAndAssignments.ts, 177, 9))
var x: number | string | boolean;
>x : Symbol(x, Decl(declarationsAndAssignments.ts, 167, 7), Decl(declarationsAndAssignments.ts, 171, 9), Decl(declarationsAndAssignments.ts, 172, 9), Decl(declarationsAndAssignments.ts, 173, 9))
var y: string;
>y : Symbol(y, Decl(declarationsAndAssignments.ts, 168, 7), Decl(declarationsAndAssignments.ts, 176, 11), Decl(declarationsAndAssignments.ts, 177, 11))
var y: number | string | boolean;
>y : Symbol(y, Decl(declarationsAndAssignments.ts, 168, 7), Decl(declarationsAndAssignments.ts, 172, 11), Decl(declarationsAndAssignments.ts, 173, 11))
var z: boolean;
>z : Symbol(z, Decl(declarationsAndAssignments.ts, 169, 7), Decl(declarationsAndAssignments.ts, 177, 14))
var z: number | string | boolean;
>z : Symbol(z, Decl(declarationsAndAssignments.ts, 169, 7), Decl(declarationsAndAssignments.ts, 173, 14))
var a0: (number | string | boolean)[];
>a0 : Symbol(a0, Decl(declarationsAndAssignments.ts, 170, 7), Decl(declarationsAndAssignments.ts, 174, 9))
var [...a] = [1, "hello", true];
>a : Symbol(a, Decl(declarationsAndAssignments.ts, 166, 7), Decl(declarationsAndAssignments.ts, 170, 9), Decl(declarationsAndAssignments.ts, 171, 11), Decl(declarationsAndAssignments.ts, 172, 14), Decl(declarationsAndAssignments.ts, 173, 17))
var a1: (string | boolean)[];
>a1 : Symbol(a1, Decl(declarationsAndAssignments.ts, 171, 7), Decl(declarationsAndAssignments.ts, 175, 11))
var [x, ...a] = [1, "hello", true];
>x : Symbol(x, Decl(declarationsAndAssignments.ts, 167, 7), Decl(declarationsAndAssignments.ts, 171, 9), Decl(declarationsAndAssignments.ts, 172, 9), Decl(declarationsAndAssignments.ts, 173, 9))
>a : Symbol(a, Decl(declarationsAndAssignments.ts, 166, 7), Decl(declarationsAndAssignments.ts, 170, 9), Decl(declarationsAndAssignments.ts, 171, 11), Decl(declarationsAndAssignments.ts, 172, 14), Decl(declarationsAndAssignments.ts, 173, 17))
var a2: boolean[];
>a2 : Symbol(a2, Decl(declarationsAndAssignments.ts, 172, 7), Decl(declarationsAndAssignments.ts, 176, 14))
var [x, y, ...a] = [1, "hello", true];
>x : Symbol(x, Decl(declarationsAndAssignments.ts, 167, 7), Decl(declarationsAndAssignments.ts, 171, 9), Decl(declarationsAndAssignments.ts, 172, 9), Decl(declarationsAndAssignments.ts, 173, 9))
>y : Symbol(y, Decl(declarationsAndAssignments.ts, 168, 7), Decl(declarationsAndAssignments.ts, 172, 11), Decl(declarationsAndAssignments.ts, 173, 11))
>a : Symbol(a, Decl(declarationsAndAssignments.ts, 166, 7), Decl(declarationsAndAssignments.ts, 170, 9), Decl(declarationsAndAssignments.ts, 171, 11), Decl(declarationsAndAssignments.ts, 172, 14), Decl(declarationsAndAssignments.ts, 173, 17))
var a3: any[];
>a3 : Symbol(a3, Decl(declarationsAndAssignments.ts, 173, 7), Decl(declarationsAndAssignments.ts, 177, 17))
var [x, y, z, ...a] = [1, "hello", true];
>x : Symbol(x, Decl(declarationsAndAssignments.ts, 167, 7), Decl(declarationsAndAssignments.ts, 171, 9), Decl(declarationsAndAssignments.ts, 172, 9), Decl(declarationsAndAssignments.ts, 173, 9))
>y : Symbol(y, Decl(declarationsAndAssignments.ts, 168, 7), Decl(declarationsAndAssignments.ts, 172, 11), Decl(declarationsAndAssignments.ts, 173, 11))
>z : Symbol(z, Decl(declarationsAndAssignments.ts, 169, 7), Decl(declarationsAndAssignments.ts, 173, 14))
>a : Symbol(a, Decl(declarationsAndAssignments.ts, 166, 7), Decl(declarationsAndAssignments.ts, 170, 9), Decl(declarationsAndAssignments.ts, 171, 11), Decl(declarationsAndAssignments.ts, 172, 14), Decl(declarationsAndAssignments.ts, 173, 17))
var [...a0] = [1, "hello", true];
>a0 : Symbol(a0, Decl(declarationsAndAssignments.ts, 170, 7), Decl(declarationsAndAssignments.ts, 174, 9))
[...a] = [1, "hello", true];
>a : Symbol(a, Decl(declarationsAndAssignments.ts, 166, 7), Decl(declarationsAndAssignments.ts, 170, 9), Decl(declarationsAndAssignments.ts, 171, 11), Decl(declarationsAndAssignments.ts, 172, 14), Decl(declarationsAndAssignments.ts, 173, 17))
var [x, ...a1] = [1, "hello", true];
>x : Symbol(x, Decl(declarationsAndAssignments.ts, 167, 7), Decl(declarationsAndAssignments.ts, 175, 9), Decl(declarationsAndAssignments.ts, 176, 9), Decl(declarationsAndAssignments.ts, 177, 9))
>a1 : Symbol(a1, Decl(declarationsAndAssignments.ts, 171, 7), Decl(declarationsAndAssignments.ts, 175, 11))
[x, ...a] = [1, "hello", true];
>x : Symbol(x, Decl(declarationsAndAssignments.ts, 167, 7), Decl(declarationsAndAssignments.ts, 171, 9), Decl(declarationsAndAssignments.ts, 172, 9), Decl(declarationsAndAssignments.ts, 173, 9))
>a : Symbol(a, Decl(declarationsAndAssignments.ts, 166, 7), Decl(declarationsAndAssignments.ts, 170, 9), Decl(declarationsAndAssignments.ts, 171, 11), Decl(declarationsAndAssignments.ts, 172, 14), Decl(declarationsAndAssignments.ts, 173, 17))
var [x, y, ...a2] = [1, "hello", true];
>x : Symbol(x, Decl(declarationsAndAssignments.ts, 167, 7), Decl(declarationsAndAssignments.ts, 175, 9), Decl(declarationsAndAssignments.ts, 176, 9), Decl(declarationsAndAssignments.ts, 177, 9))
>y : Symbol(y, Decl(declarationsAndAssignments.ts, 168, 7), Decl(declarationsAndAssignments.ts, 176, 11), Decl(declarationsAndAssignments.ts, 177, 11))
>a2 : Symbol(a2, Decl(declarationsAndAssignments.ts, 172, 7), Decl(declarationsAndAssignments.ts, 176, 14))
[x, y, ...a] = [1, "hello", true];
>x : Symbol(x, Decl(declarationsAndAssignments.ts, 167, 7), Decl(declarationsAndAssignments.ts, 171, 9), Decl(declarationsAndAssignments.ts, 172, 9), Decl(declarationsAndAssignments.ts, 173, 9))
>y : Symbol(y, Decl(declarationsAndAssignments.ts, 168, 7), Decl(declarationsAndAssignments.ts, 172, 11), Decl(declarationsAndAssignments.ts, 173, 11))
>a : Symbol(a, Decl(declarationsAndAssignments.ts, 166, 7), Decl(declarationsAndAssignments.ts, 170, 9), Decl(declarationsAndAssignments.ts, 171, 11), Decl(declarationsAndAssignments.ts, 172, 14), Decl(declarationsAndAssignments.ts, 173, 17))
var [x, y, z, ...a3] = [1, "hello", true];
>x : Symbol(x, Decl(declarationsAndAssignments.ts, 167, 7), Decl(declarationsAndAssignments.ts, 175, 9), Decl(declarationsAndAssignments.ts, 176, 9), Decl(declarationsAndAssignments.ts, 177, 9))
>y : Symbol(y, Decl(declarationsAndAssignments.ts, 168, 7), Decl(declarationsAndAssignments.ts, 176, 11), Decl(declarationsAndAssignments.ts, 177, 11))
>z : Symbol(z, Decl(declarationsAndAssignments.ts, 169, 7), Decl(declarationsAndAssignments.ts, 177, 14))
>a3 : Symbol(a3, Decl(declarationsAndAssignments.ts, 173, 7), Decl(declarationsAndAssignments.ts, 177, 17))
[x, y, z, ...a] = [1, "hello", true];
>x : Symbol(x, Decl(declarationsAndAssignments.ts, 167, 7), Decl(declarationsAndAssignments.ts, 171, 9), Decl(declarationsAndAssignments.ts, 172, 9), Decl(declarationsAndAssignments.ts, 173, 9))
>y : Symbol(y, Decl(declarationsAndAssignments.ts, 168, 7), Decl(declarationsAndAssignments.ts, 172, 11), Decl(declarationsAndAssignments.ts, 173, 11))
>z : Symbol(z, Decl(declarationsAndAssignments.ts, 169, 7), Decl(declarationsAndAssignments.ts, 173, 14))
>a : Symbol(a, Decl(declarationsAndAssignments.ts, 166, 7), Decl(declarationsAndAssignments.ts, 170, 9), Decl(declarationsAndAssignments.ts, 171, 11), Decl(declarationsAndAssignments.ts, 172, 14), Decl(declarationsAndAssignments.ts, 173, 17))
[...a0] = [1, "hello", true];
>a0 : Symbol(a0, Decl(declarationsAndAssignments.ts, 170, 7), Decl(declarationsAndAssignments.ts, 174, 9))
[x, ...a1] = [1, "hello", true];
>x : Symbol(x, Decl(declarationsAndAssignments.ts, 167, 7), Decl(declarationsAndAssignments.ts, 175, 9), Decl(declarationsAndAssignments.ts, 176, 9), Decl(declarationsAndAssignments.ts, 177, 9))
>a1 : Symbol(a1, Decl(declarationsAndAssignments.ts, 171, 7), Decl(declarationsAndAssignments.ts, 175, 11))
[x, y, ...a2] = [1, "hello", true];
>x : Symbol(x, Decl(declarationsAndAssignments.ts, 167, 7), Decl(declarationsAndAssignments.ts, 175, 9), Decl(declarationsAndAssignments.ts, 176, 9), Decl(declarationsAndAssignments.ts, 177, 9))
>y : Symbol(y, Decl(declarationsAndAssignments.ts, 168, 7), Decl(declarationsAndAssignments.ts, 176, 11), Decl(declarationsAndAssignments.ts, 177, 11))
>a2 : Symbol(a2, Decl(declarationsAndAssignments.ts, 172, 7), Decl(declarationsAndAssignments.ts, 176, 14))
[x, y, z, ...a3] = [1, "hello", true];
>x : Symbol(x, Decl(declarationsAndAssignments.ts, 167, 7), Decl(declarationsAndAssignments.ts, 175, 9), Decl(declarationsAndAssignments.ts, 176, 9), Decl(declarationsAndAssignments.ts, 177, 9))
>y : Symbol(y, Decl(declarationsAndAssignments.ts, 168, 7), Decl(declarationsAndAssignments.ts, 176, 11), Decl(declarationsAndAssignments.ts, 177, 11))
>z : Symbol(z, Decl(declarationsAndAssignments.ts, 169, 7), Decl(declarationsAndAssignments.ts, 177, 14))
>a3 : Symbol(a3, Decl(declarationsAndAssignments.ts, 173, 7), Decl(declarationsAndAssignments.ts, 177, 17))
}
@@ -24,7 +24,7 @@ function f0() {
>x : number
>y : string
>z : any
>[1, "hello"] : [number, string, undefined]
>[1, "hello"] : [number, string, undefined?]
>1 : 1
>"hello" : "hello"
@@ -254,17 +254,17 @@ function f7() {
function f8() {
>f8 : () => void
var [a, b, c] = []; // Ok, [] is an array
var [a, b, c] = []; // Error, [] is an empty tuple
>a : any
>b : any
>c : any
>[] : [undefined, undefined, undefined]
>[] : [undefined?, undefined?, undefined?]
var [d, e, f] = [1]; // Error, [1] is a tuple
>d : number
>e : any
>f : any
>[1] : [number, undefined, undefined]
>[1] : [number, undefined?, undefined?]
>1 : 1
}
@@ -681,9 +681,6 @@ function f19() {
function f20() {
>f20 : () => void
var a: number[];
>a : number[]
var x: number;
>x : number
@@ -693,6 +690,12 @@ function f20() {
var z: number;
>z : number
var a: number[];
>a : number[]
var a3: any[];
>a3 : any[]
var [...a] = [1, 2, 3];
>a : number[]
>[1, 2, 3] : number[]
@@ -703,7 +706,7 @@ function f20() {
var [x, ...a] = [1, 2, 3];
>x : number
>a : number[]
>[1, 2, 3] : number[]
>[1, 2, 3] : [number, number, number]
>1 : 1
>2 : 2
>3 : 3
@@ -712,17 +715,17 @@ function f20() {
>x : number
>y : number
>a : number[]
>[1, 2, 3] : number[]
>[1, 2, 3] : [number, number, number]
>1 : 1
>2 : 2
>3 : 3
var [x, y, z, ...a] = [1, 2, 3];
var [x, y, z, ...a3] = [1, 2, 3];
>x : number
>y : number
>z : number
>a : number[]
>[1, 2, 3] : number[]
>a3 : any[]
>[1, 2, 3] : [number, number, number]
>1 : 1
>2 : 2
>3 : 3
@@ -738,37 +741,37 @@ function f20() {
>3 : 3
[x, ...a] = [1, 2, 3];
>[x, ...a] = [1, 2, 3] : number[]
>[x, ...a] : number[]
>[x, ...a] = [1, 2, 3] : [number, number, number]
>[x, ...a] : [number, ...number[]]
>x : number
>...a : number
>a : number[]
>[1, 2, 3] : number[]
>[1, 2, 3] : [number, number, number]
>1 : 1
>2 : 2
>3 : 3
[x, y, ...a] = [1, 2, 3];
>[x, y, ...a] = [1, 2, 3] : number[]
>[x, y, ...a] : number[]
>[x, y, ...a] = [1, 2, 3] : [number, number, number]
>[x, y, ...a] : [number, number, ...number[]]
>x : number
>y : number
>...a : number
>a : number[]
>[1, 2, 3] : number[]
>[1, 2, 3] : [number, number, number]
>1 : 1
>2 : 2
>3 : 3
[x, y, z, ...a] = [1, 2, 3];
>[x, y, z, ...a] = [1, 2, 3] : number[]
>[x, y, z, ...a] : number[]
[x, y, z, ...a3] = [1, 2, 3];
>[x, y, z, ...a3] = [1, 2, 3] : [number, number, number]
>[x, y, z, ...a3] : [number, number, number, ...any[]]
>x : number
>y : number
>z : number
>...a : number
>a : number[]
>[1, 2, 3] : number[]
>...a3 : any
>a3 : any[]
>[1, 2, 3] : [number, number, number]
>1 : 1
>2 : 2
>3 : 3
@@ -777,94 +780,103 @@ function f20() {
function f21() {
>f21 : () => void
var a: (number | string | boolean)[];
>a : (string | number | boolean)[]
var x: number;
>x : number
var x: number | string | boolean;
>x : string | number | boolean
var y: string;
>y : string
var y: number | string | boolean;
>y : string | number | boolean
var z: boolean;
>z : boolean
var z: number | string | boolean;
>z : string | number | boolean
var a0: (number | string | boolean)[];
>a0 : (string | number | boolean)[]
var [...a] = [1, "hello", true];
>a : (string | number | boolean)[]
var a1: (string | boolean)[];
>a1 : (string | boolean)[]
var a2: boolean[];
>a2 : boolean[]
var a3: any[];
>a3 : any[]
var [...a0] = [1, "hello", true];
>a0 : (string | number | boolean)[]
>[1, "hello", true] : (string | number | boolean)[]
>1 : 1
>"hello" : "hello"
>true : true
var [x, ...a] = [1, "hello", true];
>x : string | number | boolean
>a : (string | number | boolean)[]
>[1, "hello", true] : (string | number | boolean)[]
var [x, ...a1] = [1, "hello", true];
>x : number
>a1 : (string | boolean)[]
>[1, "hello", true] : [number, string, boolean]
>1 : 1
>"hello" : "hello"
>true : true
var [x, y, ...a] = [1, "hello", true];
>x : string | number | boolean
>y : string | number | boolean
>a : (string | number | boolean)[]
>[1, "hello", true] : (string | number | boolean)[]
var [x, y, ...a2] = [1, "hello", true];
>x : number
>y : string
>a2 : boolean[]
>[1, "hello", true] : [number, string, boolean]
>1 : 1
>"hello" : "hello"
>true : true
var [x, y, z, ...a] = [1, "hello", true];
>x : string | number | boolean
>y : string | number | boolean
>z : string | number | boolean
>a : (string | number | boolean)[]
>[1, "hello", true] : (string | number | boolean)[]
var [x, y, z, ...a3] = [1, "hello", true];
>x : number
>y : string
>z : boolean
>a3 : any[]
>[1, "hello", true] : [number, string, boolean]
>1 : 1
>"hello" : "hello"
>true : true
[...a] = [1, "hello", true];
>[...a] = [1, "hello", true] : (string | number | true)[]
>[...a] : (string | number | boolean)[]
>...a : string | number | boolean
>a : (string | number | boolean)[]
[...a0] = [1, "hello", true];
>[...a0] = [1, "hello", true] : (string | number | true)[]
>[...a0] : (string | number | boolean)[]
>...a0 : string | number | boolean
>a0 : (string | number | boolean)[]
>[1, "hello", true] : (string | number | true)[]
>1 : 1
>"hello" : "hello"
>true : true
[x, ...a] = [1, "hello", true];
>[x, ...a] = [1, "hello", true] : (string | number | true)[]
>[x, ...a] : (string | number | boolean)[]
>x : string | number | boolean
>...a : string | number | boolean
>a : (string | number | boolean)[]
>[1, "hello", true] : (string | number | true)[]
[x, ...a1] = [1, "hello", true];
>[x, ...a1] = [1, "hello", true] : [number, string, true]
>[x, ...a1] : [number, ...(string | boolean)[]]
>x : number
>...a1 : string | boolean
>a1 : (string | boolean)[]
>[1, "hello", true] : [number, string, true]
>1 : 1
>"hello" : "hello"
>true : true
[x, y, ...a] = [1, "hello", true];
>[x, y, ...a] = [1, "hello", true] : (string | number | true)[]
>[x, y, ...a] : (string | number | boolean)[]
>x : string | number | boolean
>y : string | number | boolean
>...a : string | number | boolean
>a : (string | number | boolean)[]
>[1, "hello", true] : (string | number | true)[]
[x, y, ...a2] = [1, "hello", true];
>[x, y, ...a2] = [1, "hello", true] : [number, string, true]
>[x, y, ...a2] : [number, string, ...boolean[]]
>x : number
>y : string
>...a2 : boolean
>a2 : boolean[]
>[1, "hello", true] : [number, string, true]
>1 : 1
>"hello" : "hello"
>true : true
[x, y, z, ...a] = [1, "hello", true];
>[x, y, z, ...a] = [1, "hello", true] : (string | number | true)[]
>[x, y, z, ...a] : (string | number | boolean)[]
>x : string | number | boolean
>y : string | number | boolean
>z : string | number | boolean
>...a : string | number | boolean
>a : (string | number | boolean)[]
>[1, "hello", true] : (string | number | true)[]
[x, y, z, ...a3] = [1, "hello", true];
>[x, y, z, ...a3] = [1, "hello", true] : [number, string, true]
>[x, y, z, ...a3] : [number, string, boolean, ...any[]]
>x : number
>y : string
>z : boolean
>...a3 : any
>a3 : any[]
>[1, "hello", true] : [number, string, true]
>1 : 1
>"hello" : "hello"
>true : true
@@ -93,18 +93,18 @@ var [c0, c1] = [...temp];
var [c2] = [];
>c2 : any
>[] : [undefined]
>[] : [undefined?]
var [[[c3]], [[[[c4]]]]] = [[[]], [[[[]]]]]
>c3 : any
>c4 : any
>[[[]], [[[[]]]]] : [[[undefined]], [[[[undefined]]]]]
>[[]] : [[undefined]]
>[] : [undefined]
>[[[[]]]] : [[[[undefined]]]]
>[[[]]] : [[[undefined]]]
>[[]] : [[undefined]]
>[] : [undefined]
>[[[]], [[[[]]]]] : [[[undefined?]], [[[[undefined?]]]]]
>[[]] : [[undefined?]]
>[] : [undefined?]
>[[[[]]]] : [[[[undefined?]]]]
>[[[]]] : [[[undefined?]]]
>[[]] : [[undefined?]]
>[] : [undefined?]
var [[c5], c6]: [[string|number], boolean] = [[1], true];
>c5 : string | number
@@ -149,7 +149,7 @@ var [,,,...c10] = [1, 2, 3, 4, "hello"];
> : undefined
> : undefined
>c10 : (string | number)[]
>[1, 2, 3, 4, "hello"] : (string | number)[]
>[1, 2, 3, 4, "hello"] : [number, number, number, number, string]
>1 : 1
>2 : 2
>3 : 3
@@ -157,10 +157,10 @@ var [,,,...c10] = [1, 2, 3, 4, "hello"];
>"hello" : "hello"
var [c11, c12, ...c13] = [1, 2, "string"];
>c11 : string | number
>c12 : string | number
>c13 : (string | number)[]
>[1, 2, "string"] : (string | number)[]
>c11 : number
>c12 : number
>c13 : string[]
>[1, 2, "string"] : [number, number, string]
>1 : 1
>2 : 2
>"string" : "string"
@@ -93,18 +93,18 @@ var [c0, c1] = [...temp];
var [c2] = [];
>c2 : any
>[] : [undefined]
>[] : [undefined?]
var [[[c3]], [[[[c4]]]]] = [[[]], [[[[]]]]]
>c3 : any
>c4 : any
>[[[]], [[[[]]]]] : [[[undefined]], [[[[undefined]]]]]
>[[]] : [[undefined]]
>[] : [undefined]
>[[[[]]]] : [[[[undefined]]]]
>[[[]]] : [[[undefined]]]
>[[]] : [[undefined]]
>[] : [undefined]
>[[[]], [[[[]]]]] : [[[undefined?]], [[[[undefined?]]]]]
>[[]] : [[undefined?]]
>[] : [undefined?]
>[[[[]]]] : [[[[undefined?]]]]
>[[[]]] : [[[undefined?]]]
>[[]] : [[undefined?]]
>[] : [undefined?]
var [[c5], c6]: [[string|number], boolean] = [[1], true];
>c5 : string | number
@@ -149,7 +149,7 @@ var [,,,...c10] = [1, 2, 3, 4, "hello"];
> : undefined
> : undefined
>c10 : (string | number)[]
>[1, 2, 3, 4, "hello"] : (string | number)[]
>[1, 2, 3, 4, "hello"] : [number, number, number, number, string]
>1 : 1
>2 : 2
>3 : 3
@@ -157,10 +157,10 @@ var [,,,...c10] = [1, 2, 3, 4, "hello"];
>"hello" : "hello"
var [c11, c12, ...c13] = [1, 2, "string"];
>c11 : string | number
>c12 : string | number
>c13 : (string | number)[]
>[1, 2, "string"] : (string | number)[]
>c11 : number
>c12 : number
>c13 : string[]
>[1, 2, "string"] : [number, number, string]
>1 : 1
>2 : 2
>"string" : "string"
@@ -93,18 +93,18 @@ var [c0, c1] = [...temp];
var [c2] = [];
>c2 : any
>[] : [undefined]
>[] : [undefined?]
var [[[c3]], [[[[c4]]]]] = [[[]], [[[[]]]]]
>c3 : any
>c4 : any
>[[[]], [[[[]]]]] : [[[undefined]], [[[[undefined]]]]]
>[[]] : [[undefined]]
>[] : [undefined]
>[[[[]]]] : [[[[undefined]]]]
>[[[]]] : [[[undefined]]]
>[[]] : [[undefined]]
>[] : [undefined]
>[[[]], [[[[]]]]] : [[[undefined?]], [[[[undefined?]]]]]
>[[]] : [[undefined?]]
>[] : [undefined?]
>[[[[]]]] : [[[[undefined?]]]]
>[[[]]] : [[[undefined?]]]
>[[]] : [[undefined?]]
>[] : [undefined?]
var [[c5], c6]: [[string|number], boolean] = [[1], true];
>c5 : string | number
@@ -149,7 +149,7 @@ var [,,,...c10] = [1, 2, 3, 4, "hello"];
> : undefined
> : undefined
>c10 : (string | number)[]
>[1, 2, 3, 4, "hello"] : (string | number)[]
>[1, 2, 3, 4, "hello"] : [number, number, number, number, string]
>1 : 1
>2 : 2
>3 : 3
@@ -157,10 +157,10 @@ var [,,,...c10] = [1, 2, 3, 4, "hello"];
>"hello" : "hello"
var [c11, c12, ...c13] = [1, 2, "string"];
>c11 : string | number
>c12 : string | number
>c13 : (string | number)[]
>[1, 2, "string"] : (string | number)[]
>c11 : number
>c12 : number
>c13 : string[]
>[1, 2, "string"] : [number, number, string]
>1 : 1
>2 : 2
>"string" : "string"
@@ -4,7 +4,7 @@
var [[a0], [[a1]]] = [] // Error
>a0 : any
>a1 : any
>[] : [undefined, undefined]
>[] : [undefined?, undefined?]
var [[a2], [[a3]]] = undefined // Error
>a2 : any
@@ -3,7 +3,7 @@ const [a, b = a] = [1]; // ok
>a : any
>b : any
>a : any
>[1] : [number, any]
>[1] : [number, any?]
>1 : 1
const [c, d = c, e = e] = [1]; // error for e = e
@@ -12,7 +12,7 @@ const [c, d = c, e = e] = [1]; // error for e = e
>c : any
>e : any
>e : any
>[1] : [number, any, any]
>[1] : [number, any?, any?]
>1 : 1
const [f, g = f, h = i, i = f] = [1]; // error for h = i
@@ -23,7 +23,7 @@ const [f, g = f, h = i, i = f] = [1]; // error for h = i
>i : any
>i : any
>f : any
>[1] : [number, any, any, any]
>[1] : [number, any?, any?, any?]
>1 : 1
(function ([a, b = a]) { // ok
@@ -229,7 +229,7 @@ function c5([a, b, [[c]]]) { }
>c : any
function c6([a, b, [[c=1]]]) { }
>c6 : ([a, b, [[c]]]: [any, any, [[number]]]) => void
>c6 : ([a, b, [[c]]]: [any, any, [[number?]]]) => void
>a : any
>b : any
>c : number
@@ -229,7 +229,7 @@ function c5([a, b, [[c]]]) { }
>c : any
function c6([a, b, [[c=1]]]) { }
>c6 : ([a, b, [[c]]]: [any, any, [[number]]]) => void
>c6 : ([a, b, [[c]]]: [any, any, [[number?]]]) => void
>a : any
>b : any
>c : number
@@ -212,7 +212,7 @@ function c5([a, b, [[c]]]) { }
>c : any
function c6([a, b, [[c=1]]]) { }
>c6 : ([a, b, [[c]]]: [any, any, [[number]]]) => void
>c6 : ([a, b, [[c]]]: [any, any, [[number?]]]) => void
>a : any
>b : any
>c : number
@@ -28,10 +28,11 @@ tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration2.ts(
tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration2.ts(39,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]]'.
tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration2.ts(40,4): error TS2345: Argument of type '[number, number, [[string]]]' is not assignable to parameter of type '[any, any, [[number]]]'.
Type '[[string]]' is not assignable to type '[[number]]'.
Type '[string]' is not assignable to type '[number]'.
Type 'string' is not assignable to type 'number'.
tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration2.ts(40,4): error TS2345: Argument of type '[number, number, [[string]]]' is not assignable to parameter of type '[any, any, [[number?]]]'.
Type '[[string]]' is not assignable to type '[[number?]]'.
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/destructuringParameterDeclaration2.ts(46,13): error TS2463: A binding pattern parameter cannot be optional in an implementation signature.
tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration2.ts(47,13): error TS2463: A binding pattern parameter cannot be optional in an implementation signature.
tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration2.ts(56,8): error TS2463: A binding pattern parameter cannot be optional in an implementation signature.
@@ -131,10 +132,11 @@ tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration2.ts(
!!! error TS2345: Type 'boolean' is not assignable to type '[[any]]'.
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: Type '[[string]]' is not assignable to type '[[number]]'.
!!! error TS2345: Type '[string]' is not assignable to type '[number]'.
!!! error TS2345: Type 'string' is not assignable to type 'number'.
!!! error TS2345: Argument of type '[number, number, [[string]]]' is not assignable to parameter of type '[any, any, [[number?]]]'.
!!! error TS2345: Type '[[string]]' is not assignable to type '[[number?]]'.
!!! 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. Initializers (including binding property or element initializers) are
@@ -143,7 +143,7 @@ function c5([a, b, [[c]]]) { }
>c : any
function c6([a, b, [[c = 1]]]) { }
>c6 : ([a, b, [[c]]]: [any, any, [[number]]]) => void
>c6 : ([a, b, [[c]]]: [any, any, [[number?]]]) => void
>a : any
>b : any
>c : number
@@ -193,7 +193,7 @@ 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
>c6([1, 2, [["string"]]]) : void
>c6 : ([a, b, [[c]]]: [any, any, [[number]]]) => void
>c6 : ([a, b, [[c]]]: [any, any, [[number?]]]) => void
>[1, 2, [["string"]]] : (number | string[][])[]
>1 : 1
>2 : 2
@@ -1,9 +1,14 @@
tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration3ES5.ts(26,4): error TS2345: Argument of type '[number, number, [[string]], boolean, boolean]' is not assignable to parameter of type '[any, any, [[any]]]'.
Types of property 'length' are incompatible.
Type '5' is not assignable to type '3'.
tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration3ES5.ts(29,5): error TS2345: Argument of type '[number, number, number, boolean, boolean]' is not assignable to parameter of type '[any, any, [[any]], ...any[]]'.
Types of property '2' are incompatible.
Type 'number' is not assignable to type '[[any]]'.
tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration3ES5.ts(30,5): error TS2345: Argument of type '[number, number]' is not assignable to parameter of type '[any, any, [[any]], ...any[]]'.
Property '2' is missing in type '[number, number]'.
==== tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration3ES5.ts (1 errors) ====
==== tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration3ES5.ts (3 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.
@@ -37,7 +42,14 @@ tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration3ES5.
a10([1, 2, [["string"]], false, true]); // Parameter type is any[]
a10([1, 2, 3, false, true]); // Parameter type is any[]
~~~~~~~~~~~~~~~~~~~~~~
!!! error TS2345: Argument of type '[number, number, number, boolean, boolean]' is not assignable to parameter of type '[any, any, [[any]], ...any[]]'.
!!! error TS2345: Types of property '2' are incompatible.
!!! error TS2345: Type 'number' is not assignable to type '[[any]]'.
a10([1, 2]); // Parameter type is any[]
~~~~~~
!!! error TS2345: Argument of type '[number, number]' is not assignable to parameter of type '[any, any, [[any]], ...any[]]'.
!!! error TS2345: Property '2' is missing in type '[number, number]'.
a11([1, 2]); // Parameter type is number[]
// Rest parameter with generic
@@ -52,7 +52,7 @@ function a9([a, b, [[c]]]) { }
>c : any
function a10([a, b, [[c]], ...x]) { }
>a10 : ([a, b, [[c]], ...x]: Iterable<any>) => void
>a10 : ([a, b, [[c]], ...x]: [any, any, [[any]], ...any[]]) => void
>a : any
>b : any
>c : any
@@ -107,19 +107,19 @@ a9([1, 2, [["string"]], false, true]); // Parameter type is [any, any, [[any]]
a10([1, 2, [["string"]], false, true]); // Parameter type is any[]
>a10([1, 2, [["string"]], false, true]) : void
>a10 : ([a, b, [[c]], ...x]: Iterable<any>) => void
>[1, 2, [["string"]], false, true] : (number | boolean | string[][])[]
>a10 : ([a, b, [[c]], ...x]: [any, any, [[any]], ...any[]]) => void
>[1, 2, [["string"]], false, true] : [number, number, [[string]], boolean, boolean]
>1 : 1
>2 : 2
>[["string"]] : string[][]
>["string"] : string[]
>[["string"]] : [[string]]
>["string"] : [string]
>"string" : "string"
>false : false
>true : true
a10([1, 2, 3, false, true]); // Parameter type is any[]
>a10([1, 2, 3, false, true]) : void
>a10 : ([a, b, [[c]], ...x]: Iterable<any>) => void
>a10 : ([a, b, [[c]], ...x]: [any, any, [[any]], ...any[]]) => void
>[1, 2, 3, false, true] : (number | boolean)[]
>1 : 1
>2 : 2
@@ -129,7 +129,7 @@ a10([1, 2, 3, false, true]); // Parameter type is any[]
a10([1, 2]); // Parameter type is any[]
>a10([1, 2]) : void
>a10 : ([a, b, [[c]], ...x]: Iterable<any>) => void
>a10 : ([a, b, [[c]], ...x]: [any, any, [[any]], ...any[]]) => void
>[1, 2] : number[]
>1 : 1
>2 : 2
@@ -1,9 +1,14 @@
tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration3ES5iterable.ts(26,4): error TS2345: Argument of type '[number, number, [[string]], boolean, boolean]' is not assignable to parameter of type '[any, any, [[any]]]'.
Types of property 'length' are incompatible.
Type '5' is not assignable to type '3'.
tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration3ES5iterable.ts(29,5): error TS2345: Argument of type '[number, number, number, boolean, boolean]' is not assignable to parameter of type '[any, any, [[any]], ...any[]]'.
Types of property '2' are incompatible.
Type 'number' is not assignable to type '[[any]]'.
tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration3ES5iterable.ts(30,5): error TS2345: Argument of type '[number, number]' is not assignable to parameter of type '[any, any, [[any]], ...any[]]'.
Property '2' is missing in type '[number, number]'.
==== tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration3ES5iterable.ts (1 errors) ====
==== tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration3ES5iterable.ts (3 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.
@@ -37,7 +42,14 @@ tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration3ES5i
a10([1, 2, [["string"]], false, true]); // Parameter type is any[]
a10([1, 2, 3, false, true]); // Parameter type is any[]
~~~~~~~~~~~~~~~~~~~~~~
!!! error TS2345: Argument of type '[number, number, number, boolean, boolean]' is not assignable to parameter of type '[any, any, [[any]], ...any[]]'.
!!! error TS2345: Types of property '2' are incompatible.
!!! error TS2345: Type 'number' is not assignable to type '[[any]]'.
a10([1, 2]); // Parameter type is any[]
~~~~~~
!!! error TS2345: Argument of type '[number, number]' is not assignable to parameter of type '[any, any, [[any]], ...any[]]'.
!!! error TS2345: Property '2' is missing in type '[number, number]'.
a11([1, 2]); // Parameter type is number[]
// Rest parameter with generic
@@ -52,7 +52,7 @@ function a9([a, b, [[c]]]) { }
>c : any
function a10([a, b, [[c]], ...x]) { }
>a10 : ([a, b, [[c]], ...x]: any[]) => void
>a10 : ([a, b, [[c]], ...x]: [any, any, [[any]], ...any[]]) => void
>a : any
>b : any
>c : any
@@ -107,19 +107,19 @@ a9([1, 2, [["string"]], false, true]); // Parameter type is [any, any, [[any]]
a10([1, 2, [["string"]], false, true]); // Parameter type is any[]
>a10([1, 2, [["string"]], false, true]) : void
>a10 : ([a, b, [[c]], ...x]: any[]) => void
>[1, 2, [["string"]], false, true] : (number | boolean | string[][])[]
>a10 : ([a, b, [[c]], ...x]: [any, any, [[any]], ...any[]]) => void
>[1, 2, [["string"]], false, true] : [number, number, [[string]], boolean, boolean]
>1 : 1
>2 : 2
>[["string"]] : string[][]
>["string"] : string[]
>[["string"]] : [[string]]
>["string"] : [string]
>"string" : "string"
>false : false
>true : true
a10([1, 2, 3, false, true]); // Parameter type is any[]
>a10([1, 2, 3, false, true]) : void
>a10 : ([a, b, [[c]], ...x]: any[]) => void
>a10 : ([a, b, [[c]], ...x]: [any, any, [[any]], ...any[]]) => void
>[1, 2, 3, false, true] : (number | boolean)[]
>1 : 1
>2 : 2
@@ -129,7 +129,7 @@ a10([1, 2, 3, false, true]); // Parameter type is any[]
a10([1, 2]); // Parameter type is any[]
>a10([1, 2]) : void
>a10 : ([a, b, [[c]], ...x]: any[]) => void
>a10 : ([a, b, [[c]], ...x]: [any, any, [[any]], ...any[]]) => void
>[1, 2] : number[]
>1 : 1
>2 : 2
@@ -1,9 +1,14 @@
tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration3ES6.ts(26,4): error TS2345: Argument of type '[number, number, [[string]], boolean, boolean]' is not assignable to parameter of type '[any, any, [[any]]]'.
Types of property 'length' are incompatible.
Type '5' is not assignable to type '3'.
tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration3ES6.ts(29,5): error TS2345: Argument of type '[number, number, number, boolean, boolean]' is not assignable to parameter of type '[any, any, [[any]], ...any[]]'.
Types of property '2' are incompatible.
Type 'number' is not assignable to type '[[any]]'.
tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration3ES6.ts(30,5): error TS2345: Argument of type '[number, number]' is not assignable to parameter of type '[any, any, [[any]], ...any[]]'.
Property '2' is missing in type '[number, number]'.
==== tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration3ES6.ts (1 errors) ====
==== tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration3ES6.ts (3 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.
@@ -37,7 +42,14 @@ tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration3ES6.
a10([1, 2, [["string"]], false, true]); // Parameter type is any[]
a10([1, 2, 3, false, true]); // Parameter type is any[]
~~~~~~~~~~~~~~~~~~~~~~
!!! error TS2345: Argument of type '[number, number, number, boolean, boolean]' is not assignable to parameter of type '[any, any, [[any]], ...any[]]'.
!!! error TS2345: Types of property '2' are incompatible.
!!! error TS2345: Type 'number' is not assignable to type '[[any]]'.
a10([1, 2]); // Parameter type is any[]
~~~~~~
!!! error TS2345: Argument of type '[number, number]' is not assignable to parameter of type '[any, any, [[any]], ...any[]]'.
!!! error TS2345: Property '2' is missing in type '[number, number]'.
a11([1, 2]); // Parameter type is number[]
// Rest parameter with generic
@@ -52,7 +52,7 @@ function a9([a, b, [[c]]]) { }
>c : any
function a10([a, b, [[c]], ...x]) { }
>a10 : ([a, b, [[c]], ...x]: Iterable<any>) => void
>a10 : ([a, b, [[c]], ...x]: [any, any, [[any]], ...any[]]) => void
>a : any
>b : any
>c : any
@@ -107,19 +107,19 @@ a9([1, 2, [["string"]], false, true]); // Parameter type is [any, any, [[any]]
a10([1, 2, [["string"]], false, true]); // Parameter type is any[]
>a10([1, 2, [["string"]], false, true]) : void
>a10 : ([a, b, [[c]], ...x]: Iterable<any>) => void
>[1, 2, [["string"]], false, true] : (number | boolean | string[][])[]
>a10 : ([a, b, [[c]], ...x]: [any, any, [[any]], ...any[]]) => void
>[1, 2, [["string"]], false, true] : [number, number, [[string]], boolean, boolean]
>1 : 1
>2 : 2
>[["string"]] : string[][]
>["string"] : string[]
>[["string"]] : [[string]]
>["string"] : [string]
>"string" : "string"
>false : false
>true : true
a10([1, 2, 3, false, true]); // Parameter type is any[]
>a10([1, 2, 3, false, true]) : void
>a10 : ([a, b, [[c]], ...x]: Iterable<any>) => void
>a10 : ([a, b, [[c]], ...x]: [any, any, [[any]], ...any[]]) => void
>[1, 2, 3, false, true] : (number | boolean)[]
>1 : 1
>2 : 2
@@ -129,7 +129,7 @@ a10([1, 2, 3, false, true]); // Parameter type is any[]
a10([1, 2]); // Parameter type is any[]
>a10([1, 2]) : void
>a10 : ([a, b, [[c]], ...x]: Iterable<any>) => void
>a10 : ([a, b, [[c]], ...x]: [any, any, [[any]], ...any[]]) => void
>[1, 2] : number[]
>1 : 1
>2 : 2
@@ -1,4 +1,3 @@
tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration4.ts(11,13): error TS2370: A rest parameter must be of an array type.
tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration4.ts(13,13): error TS2370: A rest parameter must be of an array type.
tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration4.ts(14,17): error TS1047: A rest parameter cannot be optional.
tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration4.ts(15,16): error TS1048: A rest parameter cannot have an initializer.
@@ -17,7 +16,7 @@ tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration4.ts(
tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration4.ts(34,28): error TS2304: Cannot find name 'E'.
==== tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration4.ts (12 errors) ====
==== tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration4.ts (11 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.
@@ -29,8 +28,6 @@ tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration4.ts(
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: someArray) { } // Error, rest parameter must be array type
~~~~~~~~~~~~~~~
@@ -22,7 +22,7 @@ type stringOrNumArray = Array<String|Number>;
>Number : Number
function a0(...x: [number, number, string]) { } // Error, rest parameter must be array type
>a0 : (...x: [number, number, string]) => void
>a0 : (x_0: number, x_1: number, x_2: string) => void
>x : [number, number, string]
function a1(...x: (number|string)[]) { }
@@ -113,9 +113,9 @@ var temp1 = [true, false, true]
>true : true
var [d3, d4] = [1, "string", ...temp1];
>d3 : string | number | boolean
>d4 : string | number | boolean
>[1, "string", ...temp1] : (string | number | boolean)[]
>d3 : number
>d4 : string
>[1, "string", ...temp1] : [number, string, ...boolean[]]
>1 : 1
>"string" : "string"
>...temp1 : boolean
@@ -151,9 +151,9 @@ var {f: [f1, f2, { f3: f4, f5 }, , ]} = { f: [1, 2, { f3: 4, f5: 0 }] };
>f4 : number
>f5 : number
> : undefined
>{ f: [1, 2, { f3: 4, f5: 0 }] } : { f: [number, number, { f3: number; f5: number; }, undefined]; }
>f : [number, number, { f3: number; f5: number; }, undefined]
>[1, 2, { f3: 4, f5: 0 }] : [number, number, { f3: number; f5: number; }, undefined]
>{ f: [1, 2, { f3: 4, f5: 0 }] } : { f: [number, number, { f3: number; f5: number; }, undefined?]; }
>f : [number, number, { f3: number; f5: number; }, undefined?]
>[1, 2, { f3: 4, f5: 0 }] : [number, number, { f3: number; f5: number; }, undefined?]
>1 : 1
>2 : 2
>{ f3: 4, f5: 0 } : { f3: number; f5: number; }
@@ -113,9 +113,9 @@ var temp1 = [true, false, true]
>true : true
var [d3, d4] = [1, "string", ...temp1];
>d3 : string | number | boolean
>d4 : string | number | boolean
>[1, "string", ...temp1] : (string | number | boolean)[]
>d3 : number
>d4 : string
>[1, "string", ...temp1] : [number, string, ...boolean[]]
>1 : 1
>"string" : "string"
>...temp1 : boolean
@@ -151,9 +151,9 @@ var {f: [f1, f2, { f3: f4, f5 }, , ]} = { f: [1, 2, { f3: 4, f5: 0 }] };
>f4 : number
>f5 : number
> : undefined
>{ f: [1, 2, { f3: 4, f5: 0 }] } : { f: [number, number, { f3: number; f5: number; }, undefined]; }
>f : [number, number, { f3: number; f5: number; }, undefined]
>[1, 2, { f3: 4, f5: 0 }] : [number, number, { f3: number; f5: number; }, undefined]
>{ f: [1, 2, { f3: 4, f5: 0 }] } : { f: [number, number, { f3: number; f5: number; }, undefined?]; }
>f : [number, number, { f3: number; f5: number; }, undefined?]
>[1, 2, { f3: 4, f5: 0 }] : [number, number, { f3: number; f5: number; }, undefined?]
>1 : 1
>2 : 2
>{ f3: 4, f5: 0 } : { f3: number; f5: number; }
@@ -113,9 +113,9 @@ var temp1 = [true, false, true]
>true : true
var [d3, d4] = [1, "string", ...temp1];
>d3 : string | number | boolean
>d4 : string | number | boolean
>[1, "string", ...temp1] : (string | number | boolean)[]
>d3 : number
>d4 : string
>[1, "string", ...temp1] : [number, string, ...boolean[]]
>1 : 1
>"string" : "string"
>...temp1 : boolean
@@ -151,9 +151,9 @@ var {f: [f1, f2, { f3: f4, f5 }, , ]} = { f: [1, 2, { f3: 4, f5: 0 }] };
>f4 : number
>f5 : number
> : undefined
>{ f: [1, 2, { f3: 4, f5: 0 }] } : { f: [number, number, { f3: number; f5: number; }, undefined]; }
>f : [number, number, { f3: number; f5: number; }, undefined]
>[1, 2, { f3: 4, f5: 0 }] : [number, number, { f3: number; f5: number; }, undefined]
>{ f: [1, 2, { f3: 4, f5: 0 }] } : { f: [number, number, { f3: number; f5: number; }, undefined?]; }
>f : [number, number, { f3: number; f5: number; }, undefined?]
>[1, 2, { f3: 4, f5: 0 }] : [number, number, { f3: number; f5: number; }, undefined?]
>1 : 1
>2 : 2
>{ f3: 4, f5: 0 } : { f3: number; f5: number; }
@@ -5,11 +5,9 @@ tests/cases/conformance/es6/destructuring/destructuringVariableDeclaration2.ts(4
Type '[[boolean]]' is not assignable to type '[[string]]'.
Type '[boolean]' is not assignable to type '[string]'.
Type 'boolean' is not assignable to type 'string'.
tests/cases/conformance/es6/destructuring/destructuringVariableDeclaration2.ts(14,16): error TS2459: Type 'number | { c3: number; c5: number; }' has no property 'c3' and no string index signature.
tests/cases/conformance/es6/destructuring/destructuringVariableDeclaration2.ts(14,24): error TS2459: Type 'number | { c3: number; c5: number; }' has no property 'c5' and no string index signature.
==== tests/cases/conformance/es6/destructuring/destructuringVariableDeclaration2.ts (4 errors) ====
==== tests/cases/conformance/es6/destructuring/destructuringVariableDeclaration2.ts (2 errors) ====
// The type T associated with a destructuring variable declaration is determined as follows:
// If the declaration includes a type annotation, T is that type.
var {a1, a2}: { a1: number, a2: string } = { a1: true, a2: 1 } // Error
@@ -33,10 +31,6 @@ tests/cases/conformance/es6/destructuring/destructuringVariableDeclaration2.ts(1
// If the binding element is a rest element, T is an array type with
// an element type E, where E is the type of the numeric index signature of S.
var [c1, c2, { c3: c4, c5 }, , ...c6] = [1, 2, { c3: 4, c5: 0 }]; // Error
~~
!!! error TS2459: Type 'number | { c3: number; c5: number; }' has no property 'c3' and no string index signature.
~~
!!! error TS2459: Type 'number | { c3: number; c5: number; }' has no property 'c5' and no string index signature.
// When a destructuring variable declaration, binding property, or binding element specifies
// an initializer expression, the type of the initializer expression is required to be assignable
@@ -35,6 +35,7 @@ var [b0 = 3, b1 = true, b2 = temp] = [3, false, { t1: false, t2: 5}]; // Error
var [c1, c2, { c3: c4, c5 }, , ...c6] = [1, 2, { c3: 4, c5: 0 }]; // Error
>c1 : Symbol(c1, Decl(destructuringVariableDeclaration2.ts, 13, 5))
>c2 : Symbol(c2, Decl(destructuringVariableDeclaration2.ts, 13, 8))
>c3 : Symbol(c3, Decl(destructuringVariableDeclaration2.ts, 13, 48))
>c4 : Symbol(c4, Decl(destructuringVariableDeclaration2.ts, 13, 14))
>c5 : Symbol(c5, Decl(destructuringVariableDeclaration2.ts, 13, 22))
>c6 : Symbol(c6, Decl(destructuringVariableDeclaration2.ts, 13, 30))
@@ -53,14 +53,14 @@ var [b0 = 3, b1 = true, b2 = temp] = [3, false, { t1: false, t2: 5}]; // Error
// If the binding element is a rest element, T is an array type with
// an element type E, where E is the type of the numeric index signature of S.
var [c1, c2, { c3: c4, c5 }, , ...c6] = [1, 2, { c3: 4, c5: 0 }]; // Error
>c1 : number | { c3: number; c5: number; }
>c2 : number | { c3: number; c5: number; }
>c1 : number
>c2 : number
>c3 : any
>c4 : any
>c5 : any
>c4 : number
>c5 : number
> : undefined
>c6 : (number | { c3: number; c5: number; })[]
>[1, 2, { c3: 4, c5: 0 }] : (number | { c3: number; c5: number; })[]
>c6 : any[]
>[1, 2, { c3: 4, c5: 0 }] : [number, number, { c3: number; c5: number; }, undefined?]
>1 : 1
>2 : 2
>{ c3: 4, c5: 0 } : { c3: number; c5: number; }
@@ -235,7 +235,7 @@ g1([1, 1]);
// (arg: [number, number]) => void
function g2([x = 0, y = 0]) { }
>g2 : ([x, y]: [number, number]) => void
>g2 : ([x, y]: [number?, number?]) => void
>x : number
>0 : 0
>y : number
@@ -243,7 +243,7 @@ function g2([x = 0, y = 0]) { }
g2([1, 1]);
>g2([1, 1]) : void
>g2 : ([x, y]: [number, number]) => void
>g2 : ([x, y]: [number?, number?]) => void
>[1, 1] : [number, number]
>1 : 1
>1 : 1
@@ -270,40 +270,40 @@ g3([1, 1]);
// (arg?: [number, number]) => void
function g4([x, y = 0] = [0]) { }
>g4 : ([x, y]?: [number, number]) => void
>g4 : ([x, y]?: [number, number?]) => void
>x : number
>y : number
>0 : 0
>[0] : [number, number]
>[0] : [number, number?]
>0 : 0
g4();
>g4() : void
>g4 : ([x, y]?: [number, number]) => void
>g4 : ([x, y]?: [number, number?]) => void
g4([1, 1]);
>g4([1, 1]) : void
>g4 : ([x, y]?: [number, number]) => void
>g4 : ([x, y]?: [number, number?]) => void
>[1, 1] : [number, number]
>1 : 1
>1 : 1
// (arg?: [number, number]) => void
function g5([x = 0, y = 0] = []) { }
>g5 : ([x, y]?: [number, number]) => void
>g5 : ([x, y]?: [number?, number?]) => void
>x : number
>0 : 0
>y : number
>0 : 0
>[] : [number, number]
>[] : [number?, number?]
g5();
>g5() : void
>g5 : ([x, y]?: [number, number]) => void
>g5 : ([x, y]?: [number?, number?]) => void
g5([1, 1]);
>g5([1, 1]) : void
>g5 : ([x, y]?: [number, number]) => void
>g5 : ([x, y]?: [number?, number?]) => void
>[1, 1] : [number, number]
>1 : 1
>1 : 1
@@ -12,7 +12,7 @@ const bar = 1;
let [baz] = [];
>baz : any
>[] : [undefined]
>[] : [undefined?]
let {a: baz2} = { a: 1 };
>a : any
@@ -23,7 +23,7 @@ let {a: baz2} = { a: 1 };
const [baz3] = []
>baz3 : any
>[] : [undefined]
>[] : [undefined?]
const {a: baz4} = { a: 1 };
>a : any
@@ -516,7 +516,7 @@ function foo3() {
}
for (let [y] = []; ;) {
>y : any
>[] : [undefined]
>[] : [undefined?]
use(y);
>use(y) : any
@@ -555,7 +555,7 @@ function foo4() {
}
for (const [y] = []; ;) {
>y : any
>[] : [undefined]
>[] : [undefined?]
use(y);
>use(y) : any
@@ -40,7 +40,7 @@ function f5({e, e: {e}}, {e}, [d,e, [[e]]], ...e) { }
>e : any[]
function f6([f, ...f]) { }
>f6 : ([f, ...f]: any[]) => void
>f6 : ([f, ...f]: [any, ...any[]]) => void
>f : any
>f : any[]
@@ -43,7 +43,7 @@ function f5({e, e: {e}}, {e}, [d, e, [[e]]], ...e) { }
>e : any[]
function f6([f, ...f]) { }
>f6 : ([f, ...f]: any[]) => void
>f6 : ([f, ...f]: [any, ...any[]]) => void
>f : any
>f : any[]
@@ -58,14 +58,14 @@ var p3 = ([, a]) => { };
>a : any
var p4 = ([, ...a]) => { };
>p4 : ([, ...a]: Iterable<any>) => void
>([, ...a]) => { } : ([, ...a]: Iterable<any>) => void
>p4 : ([, ...a]: [any?, ...any[]]) => void
>([, ...a]) => { } : ([, ...a]: [any?, ...any[]]) => void
> : undefined
>a : any[]
var p5 = ([a = 1]) => { };
>p5 : ([a]: [number]) => void
>([a = 1]) => { } : ([a]: [number]) => void
>p5 : ([a]: [number?]) => void
>([a = 1]) => { } : ([a]: [number?]) => void
>a : number
>1 : 1
@@ -1,8 +0,0 @@
tests/cases/conformance/types/tuple/emptyTuples/emptyTuplesTypeAssertion01.ts(1,10): error TS1122: A tuple type element list cannot be empty.
==== tests/cases/conformance/types/tuple/emptyTuples/emptyTuplesTypeAssertion01.ts (1 errors) ====
let x = <[]>[];
~~
!!! error TS1122: A tuple type element list cannot be empty.
let y = x[0];
@@ -2,7 +2,7 @@
let x = <[]>[];
>x : []
><[]>[] : []
>[] : undefined[]
>[] : []
let y = x[0];
>y : never
@@ -1,8 +0,0 @@
tests/cases/conformance/types/tuple/emptyTuples/emptyTuplesTypeAssertion02.ts(1,15): error TS1122: A tuple type element list cannot be empty.
==== tests/cases/conformance/types/tuple/emptyTuples/emptyTuplesTypeAssertion02.ts (1 errors) ====
let x = [] as [];
~~
!!! error TS1122: A tuple type element list cannot be empty.
let y = x[0];
@@ -2,7 +2,7 @@
let x = [] as [];
>x : []
>[] as [] : []
>[] : undefined[]
>[] : []
let y = x[0];
>y : never
@@ -1,14 +0,0 @@
tests/cases/conformance/es6/for-ofStatements/for-of49.ts(3,14): error TS2322: Type 'string | boolean' is not assignable to type 'boolean'.
Type 'string' is not assignable to type 'boolean'.
==== tests/cases/conformance/es6/for-ofStatements/for-of49.ts (1 errors) ====
var k: string, v: boolean;
var map = new Map([["", true]]);
for ([k, ...[v]] of map) {
~
!!! error TS2322: Type 'string | boolean' is not assignable to type 'boolean'.
!!! error TS2322: Type 'string' is not assignable to type 'boolean'.
k;
v;
}
+1 -1
View File
@@ -13,7 +13,7 @@ var map = new Map([["", true]]);
>true : true
for ([k, ...[v]] of map) {
>[k, ...[v]] : (string | boolean)[]
>[k, ...[v]] : [string, ...boolean[]]
>k : string
>...[v] : boolean
>[v] : [boolean]
@@ -0,0 +1,164 @@
tests/cases/conformance/types/rest/genericRestParameters1.ts(22,1): error TS2556: Expected 3 arguments, but got 1 or more.
tests/cases/conformance/types/rest/genericRestParameters1.ts(31,1): error TS2556: Expected 3 arguments, but got 1 or more.
==== tests/cases/conformance/types/rest/genericRestParameters1.ts (2 errors) ====
declare let f1: (...x: [number, string, boolean]) => void;
declare let f2: (x0: number, x1: string, x2: boolean) => void;
f1 = f2;
f2 = f1;
declare const t3: [number, string, boolean];
declare const t2: [string, boolean];
declare const t1: [boolean];
declare const t0: [];
declare const ns: [number, string];
declare const sn: [string, number];
f1(42, "hello", true);
f1(t3[0], t3[1], t3[2]);
f1(...t3);
f1(42, ...t2);
f1(42, "hello", ...t1);
f1(42, "hello", true, ...t0);
f1(ns[0], ns[1], true);
f1(...ns, true); // Error, tuple spread only expanded when last
~~~~~~~~~~~~~~~
!!! error TS2556: Expected 3 arguments, but got 1 or more.
f2(42, "hello", true);
f2(t3[0], t3[1], t3[2]);
f2(...t3);
f2(42, ...t2);
f2(42, "hello", ...t1);
f2(42, "hello", true, ...t0);
f2(ns[0], ns[1], true);
f2(...ns, true); // Error, tuple spread only expanded when last
~~~~~~~~~~~~~~~
!!! error TS2556: Expected 3 arguments, but got 1 or more.
declare function f10<T extends unknown[]>(...args: T): T;
const x10 = f10(42, "hello", true); // [number, string, boolean]
const x11 = f10(42, "hello"); // [number, string]
const x12 = f10(42); // [number]
const x13 = f10(); // []
const x14 = f10(...t3); // [number, string, boolean]
const x15 = f10(42, ...t2); // [number, string, boolean]
const x16 = f10(42, "hello", ...t1); // [number, string, boolean]
const x17 = f10(42, "hello", true, ...t0); // [number, string, boolean]
const x18 = f10(...ns, true); // (string | number | boolean)[]
function g10<U extends string[], V extends [number, number]>(u: U, v: V) {
let x1 = f10(...u); // U
let x2 = f10(...v); // V
let x3 = f10(1, ...u); // [number, ...string[]]
let x4 = f10(...u, ...v); // (string | number)[]
}
declare function f11<T extends (string | number | boolean)[]>(...args: T): T;
const z10 = f11(42, "hello", true); // [42, "hello", true]
const z11 = f11(42, "hello"); // [42, "hello"]
const z12 = f11(42); // [42]
const z13 = f11(); // []
const z14 = f11(...t3); // [number, string, boolean]
const z15 = f11(42, ...t2); // [42, string, boolean]
const z16 = f11(42, "hello", ...t1); // [42, "hello", boolean]
const z17 = f11(42, "hello", true, ...t0); // [42, "hello", true]
const z18 = f11(...ns, true); // (string | number | true)[]
function g11<U extends string[], V extends [number, number]>(u: U, v: V) {
let x1 = f11(...u); // U
let x2 = f11(...v); // V
let x3 = f11(1, ...u); // [1, ...string[]]
let x4 = f11(...u, ...v); // (string | number)[]
}
function call<T extends unknown[], U>(f: (...args: T) => U, ...args: T) {
return f(...args);
}
function callr<T extends unknown[], U>(args: T, f: (...args: T) => U) {
return f(...args);
}
declare function f15(a: string, b: number): string | number;
declare function f16<A, B>(a: A, b: B): A | B;
let x20 = call((x, y) => x + y, 10, 20); // number
let x21 = call((x, y) => x + y, 10, "hello"); // string
let x22 = call(f15, "hello", 42); // string | number
let x23 = call(f16, "hello", 42); // unknown
let x24 = call<[string, number], string | number>(f16, "hello", 42); // string | number
let x30 = callr(sn, (x, y) => x + y); // string
let x31 = callr(sn, f15); // string | number
let x32 = callr(sn, f16); // string | number
function bind<T, U extends unknown[], V>(f: (x: T, ...rest: U) => V, x: T) {
return (...rest: U) => f(x, ...rest);
}
declare const f20: (x: number, y: string, z: boolean) => string[];
const f21 = bind(f20, 42); // (y: string, z: boolean) => string[]
const f22 = bind(f21, "hello"); // (z: boolean) => string[]
const f23 = bind(f22, true); // () => string[]
f20(42, "hello", true);
f21("hello", true);
f22(true);
f23();
declare const g20: (x: number, y?: string, z?: boolean) => string[];
const g21 = bind(g20, 42); // (y: string, z: boolean) => string[]
const g22 = bind(g21, "hello"); // (z: boolean) => string[]
const g23 = bind(g22, true); // () => string[]
g20(42, "hello", true);
g20(42, "hello");
g20(42);
g21("hello", true);
g21("hello");
g21();
g22(true);
g22();
g23();
declare function f30<T, U extends ((x: T) => any)[]>(x: T, ...args: U): U;
const c30 = f30(42, x => "" + x, x => x + 1); // [(x: number) => string, (x: number) => number]
type Parameters<T extends Function> = T extends ((...args: infer U) => any) | (new(...args: infer U) => any) ? U : any[];
type T01 = Parameters<(x: number, y: string, z: boolean) => void>;
type T02 = Parameters<(...args: [number, string, boolean]) => void>;
type T03 = Parameters<new (x: number, y: string, z: boolean) => void>;
type T04 = Parameters<new (...args: [number, string, boolean]) => void>;
type T05<T> = Parameters<(...args: T[]) => void>;
type T06<T> = Parameters<new (...args: []) => void>;
type T07<T extends any[]> = Parameters<(...args: T) => void>;
type T08<T extends any[]> = Parameters<new (...args: T) => void>;
type T09 = Parameters<Function>;
type Record1 = {
move: [number, 'left' | 'right'];
jump: [number, 'up' | 'down'];
stop: string;
done: [];
}
type EventType<T> = {
emit<K extends keyof T = keyof T>(e: K, ...payload: T[K] extends any[] ? T[K] : [T[K]]): void;
}
declare var events: EventType<Record1>;
events.emit('move', 10, 'left');
events.emit('jump', 20, 'up');
events.emit('stop', 'Bye!');
events.emit('done');
@@ -0,0 +1,334 @@
//// [genericRestParameters1.ts]
declare let f1: (...x: [number, string, boolean]) => void;
declare let f2: (x0: number, x1: string, x2: boolean) => void;
f1 = f2;
f2 = f1;
declare const t3: [number, string, boolean];
declare const t2: [string, boolean];
declare const t1: [boolean];
declare const t0: [];
declare const ns: [number, string];
declare const sn: [string, number];
f1(42, "hello", true);
f1(t3[0], t3[1], t3[2]);
f1(...t3);
f1(42, ...t2);
f1(42, "hello", ...t1);
f1(42, "hello", true, ...t0);
f1(ns[0], ns[1], true);
f1(...ns, true); // Error, tuple spread only expanded when last
f2(42, "hello", true);
f2(t3[0], t3[1], t3[2]);
f2(...t3);
f2(42, ...t2);
f2(42, "hello", ...t1);
f2(42, "hello", true, ...t0);
f2(ns[0], ns[1], true);
f2(...ns, true); // Error, tuple spread only expanded when last
declare function f10<T extends unknown[]>(...args: T): T;
const x10 = f10(42, "hello", true); // [number, string, boolean]
const x11 = f10(42, "hello"); // [number, string]
const x12 = f10(42); // [number]
const x13 = f10(); // []
const x14 = f10(...t3); // [number, string, boolean]
const x15 = f10(42, ...t2); // [number, string, boolean]
const x16 = f10(42, "hello", ...t1); // [number, string, boolean]
const x17 = f10(42, "hello", true, ...t0); // [number, string, boolean]
const x18 = f10(...ns, true); // (string | number | boolean)[]
function g10<U extends string[], V extends [number, number]>(u: U, v: V) {
let x1 = f10(...u); // U
let x2 = f10(...v); // V
let x3 = f10(1, ...u); // [number, ...string[]]
let x4 = f10(...u, ...v); // (string | number)[]
}
declare function f11<T extends (string | number | boolean)[]>(...args: T): T;
const z10 = f11(42, "hello", true); // [42, "hello", true]
const z11 = f11(42, "hello"); // [42, "hello"]
const z12 = f11(42); // [42]
const z13 = f11(); // []
const z14 = f11(...t3); // [number, string, boolean]
const z15 = f11(42, ...t2); // [42, string, boolean]
const z16 = f11(42, "hello", ...t1); // [42, "hello", boolean]
const z17 = f11(42, "hello", true, ...t0); // [42, "hello", true]
const z18 = f11(...ns, true); // (string | number | true)[]
function g11<U extends string[], V extends [number, number]>(u: U, v: V) {
let x1 = f11(...u); // U
let x2 = f11(...v); // V
let x3 = f11(1, ...u); // [1, ...string[]]
let x4 = f11(...u, ...v); // (string | number)[]
}
function call<T extends unknown[], U>(f: (...args: T) => U, ...args: T) {
return f(...args);
}
function callr<T extends unknown[], U>(args: T, f: (...args: T) => U) {
return f(...args);
}
declare function f15(a: string, b: number): string | number;
declare function f16<A, B>(a: A, b: B): A | B;
let x20 = call((x, y) => x + y, 10, 20); // number
let x21 = call((x, y) => x + y, 10, "hello"); // string
let x22 = call(f15, "hello", 42); // string | number
let x23 = call(f16, "hello", 42); // unknown
let x24 = call<[string, number], string | number>(f16, "hello", 42); // string | number
let x30 = callr(sn, (x, y) => x + y); // string
let x31 = callr(sn, f15); // string | number
let x32 = callr(sn, f16); // string | number
function bind<T, U extends unknown[], V>(f: (x: T, ...rest: U) => V, x: T) {
return (...rest: U) => f(x, ...rest);
}
declare const f20: (x: number, y: string, z: boolean) => string[];
const f21 = bind(f20, 42); // (y: string, z: boolean) => string[]
const f22 = bind(f21, "hello"); // (z: boolean) => string[]
const f23 = bind(f22, true); // () => string[]
f20(42, "hello", true);
f21("hello", true);
f22(true);
f23();
declare const g20: (x: number, y?: string, z?: boolean) => string[];
const g21 = bind(g20, 42); // (y: string, z: boolean) => string[]
const g22 = bind(g21, "hello"); // (z: boolean) => string[]
const g23 = bind(g22, true); // () => string[]
g20(42, "hello", true);
g20(42, "hello");
g20(42);
g21("hello", true);
g21("hello");
g21();
g22(true);
g22();
g23();
declare function f30<T, U extends ((x: T) => any)[]>(x: T, ...args: U): U;
const c30 = f30(42, x => "" + x, x => x + 1); // [(x: number) => string, (x: number) => number]
type Parameters<T extends Function> = T extends ((...args: infer U) => any) | (new(...args: infer U) => any) ? U : any[];
type T01 = Parameters<(x: number, y: string, z: boolean) => void>;
type T02 = Parameters<(...args: [number, string, boolean]) => void>;
type T03 = Parameters<new (x: number, y: string, z: boolean) => void>;
type T04 = Parameters<new (...args: [number, string, boolean]) => void>;
type T05<T> = Parameters<(...args: T[]) => void>;
type T06<T> = Parameters<new (...args: []) => void>;
type T07<T extends any[]> = Parameters<(...args: T) => void>;
type T08<T extends any[]> = Parameters<new (...args: T) => void>;
type T09 = Parameters<Function>;
type Record1 = {
move: [number, 'left' | 'right'];
jump: [number, 'up' | 'down'];
stop: string;
done: [];
}
type EventType<T> = {
emit<K extends keyof T = keyof T>(e: K, ...payload: T[K] extends any[] ? T[K] : [T[K]]): void;
}
declare var events: EventType<Record1>;
events.emit('move', 10, 'left');
events.emit('jump', 20, 'up');
events.emit('stop', 'Bye!');
events.emit('done');
//// [genericRestParameters1.js]
"use strict";
f1 = f2;
f2 = f1;
f1(42, "hello", true);
f1(t3[0], t3[1], t3[2]);
f1.apply(void 0, t3);
f1.apply(void 0, [42].concat(t2));
f1.apply(void 0, [42, "hello"].concat(t1));
f1.apply(void 0, [42, "hello", true].concat(t0));
f1(ns[0], ns[1], true);
f1.apply(void 0, ns.concat([true])); // Error, tuple spread only expanded when last
f2(42, "hello", true);
f2(t3[0], t3[1], t3[2]);
f2.apply(void 0, t3);
f2.apply(void 0, [42].concat(t2));
f2.apply(void 0, [42, "hello"].concat(t1));
f2.apply(void 0, [42, "hello", true].concat(t0));
f2(ns[0], ns[1], true);
f2.apply(void 0, ns.concat([true])); // Error, tuple spread only expanded when last
var x10 = f10(42, "hello", true); // [number, string, boolean]
var x11 = f10(42, "hello"); // [number, string]
var x12 = f10(42); // [number]
var x13 = f10(); // []
var x14 = f10.apply(void 0, t3); // [number, string, boolean]
var x15 = f10.apply(void 0, [42].concat(t2)); // [number, string, boolean]
var x16 = f10.apply(void 0, [42, "hello"].concat(t1)); // [number, string, boolean]
var x17 = f10.apply(void 0, [42, "hello", true].concat(t0)); // [number, string, boolean]
var x18 = f10.apply(void 0, ns.concat([true])); // (string | number | boolean)[]
function g10(u, v) {
var x1 = f10.apply(void 0, u); // U
var x2 = f10.apply(void 0, v); // V
var x3 = f10.apply(void 0, [1].concat(u)); // [number, ...string[]]
var x4 = f10.apply(void 0, u.concat(v)); // (string | number)[]
}
var z10 = f11(42, "hello", true); // [42, "hello", true]
var z11 = f11(42, "hello"); // [42, "hello"]
var z12 = f11(42); // [42]
var z13 = f11(); // []
var z14 = f11.apply(void 0, t3); // [number, string, boolean]
var z15 = f11.apply(void 0, [42].concat(t2)); // [42, string, boolean]
var z16 = f11.apply(void 0, [42, "hello"].concat(t1)); // [42, "hello", boolean]
var z17 = f11.apply(void 0, [42, "hello", true].concat(t0)); // [42, "hello", true]
var z18 = f11.apply(void 0, ns.concat([true])); // (string | number | true)[]
function g11(u, v) {
var x1 = f11.apply(void 0, u); // U
var x2 = f11.apply(void 0, v); // V
var x3 = f11.apply(void 0, [1].concat(u)); // [1, ...string[]]
var x4 = f11.apply(void 0, u.concat(v)); // (string | number)[]
}
function call(f) {
var args = [];
for (var _i = 1; _i < arguments.length; _i++) {
args[_i - 1] = arguments[_i];
}
return f.apply(void 0, args);
}
function callr(args, f) {
return f.apply(void 0, args);
}
var x20 = call(function (x, y) { return x + y; }, 10, 20); // number
var x21 = call(function (x, y) { return x + y; }, 10, "hello"); // string
var x22 = call(f15, "hello", 42); // string | number
var x23 = call(f16, "hello", 42); // unknown
var x24 = call(f16, "hello", 42); // string | number
var x30 = callr(sn, function (x, y) { return x + y; }); // string
var x31 = callr(sn, f15); // string | number
var x32 = callr(sn, f16); // string | number
function bind(f, x) {
return function () {
var rest = [];
for (var _i = 0; _i < arguments.length; _i++) {
rest[_i] = arguments[_i];
}
return f.apply(void 0, [x].concat(rest));
};
}
var f21 = bind(f20, 42); // (y: string, z: boolean) => string[]
var f22 = bind(f21, "hello"); // (z: boolean) => string[]
var f23 = bind(f22, true); // () => string[]
f20(42, "hello", true);
f21("hello", true);
f22(true);
f23();
var g21 = bind(g20, 42); // (y: string, z: boolean) => string[]
var g22 = bind(g21, "hello"); // (z: boolean) => string[]
var g23 = bind(g22, true); // () => string[]
g20(42, "hello", true);
g20(42, "hello");
g20(42);
g21("hello", true);
g21("hello");
g21();
g22(true);
g22();
g23();
var c30 = f30(42, function (x) { return "" + x; }, function (x) { return x + 1; }); // [(x: number) => string, (x: number) => number]
events.emit('move', 10, 'left');
events.emit('jump', 20, 'up');
events.emit('stop', 'Bye!');
events.emit('done');
//// [genericRestParameters1.d.ts]
declare let f1: (...x: [number, string, boolean]) => void;
declare let f2: (x0: number, x1: string, x2: boolean) => void;
declare const t3: [number, string, boolean];
declare const t2: [string, boolean];
declare const t1: [boolean];
declare const t0: [];
declare const ns: [number, string];
declare const sn: [string, number];
declare function f10<T extends unknown[]>(...args: T): T;
declare const x10: [number, string, boolean];
declare const x11: [number, string];
declare const x12: [number];
declare const x13: [];
declare const x14: [number, string, boolean];
declare const x15: [number, string, boolean];
declare const x16: [number, string, boolean];
declare const x17: [number, string, boolean];
declare const x18: (string | number | boolean)[];
declare function g10<U extends string[], V extends [number, number]>(u: U, v: V): void;
declare function f11<T extends (string | number | boolean)[]>(...args: T): T;
declare const z10: [42, "hello", true];
declare const z11: [42, "hello"];
declare const z12: [42];
declare const z13: [];
declare const z14: [number, string, boolean];
declare const z15: [42, string, boolean];
declare const z16: [42, "hello", boolean];
declare const z17: [42, "hello", true];
declare const z18: (string | number | true)[];
declare function g11<U extends string[], V extends [number, number]>(u: U, v: V): void;
declare function call<T extends unknown[], U>(f: (...args: T) => U, ...args: T): U;
declare function callr<T extends unknown[], U>(args: T, f: (...args: T) => U): U;
declare function f15(a: string, b: number): string | number;
declare function f16<A, B>(a: A, b: B): A | B;
declare let x20: number;
declare let x21: string;
declare let x22: string | number;
declare let x23: unknown;
declare let x24: string | number;
declare let x30: string;
declare let x31: string | number;
declare let x32: string | number;
declare function bind<T, U extends unknown[], V>(f: (x: T, ...rest: U) => V, x: T): (...rest: U) => V;
declare const f20: (x: number, y: string, z: boolean) => string[];
declare const f21: (y: string, z: boolean) => string[];
declare const f22: (z: boolean) => string[];
declare const f23: () => string[];
declare const g20: (x: number, y?: string, z?: boolean) => string[];
declare const g21: (y?: string | undefined, z?: boolean | undefined) => string[];
declare const g22: (z?: boolean | undefined) => string[];
declare const g23: () => string[];
declare function f30<T, U extends ((x: T) => any)[]>(x: T, ...args: U): U;
declare const c30: [(x: number) => string, (x: number) => number];
declare type Parameters<T extends Function> = T extends ((...args: infer U) => any) | (new (...args: infer U) => any) ? U : any[];
declare type T01 = Parameters<(x: number, y: string, z: boolean) => void>;
declare type T02 = Parameters<(...args: [number, string, boolean]) => void>;
declare type T03 = Parameters<new (x: number, y: string, z: boolean) => void>;
declare type T04 = Parameters<new (...args: [number, string, boolean]) => void>;
declare type T05<T> = Parameters<(...args: T[]) => void>;
declare type T06<T> = Parameters<new (...args: []) => void>;
declare type T07<T extends any[]> = Parameters<(...args: T) => void>;
declare type T08<T extends any[]> = Parameters<new (...args: T) => void>;
declare type T09 = Parameters<Function>;
declare type Record1 = {
move: [number, 'left' | 'right'];
jump: [number, 'up' | 'down'];
stop: string;
done: [];
};
declare type EventType<T> = {
emit<K extends keyof T = keyof T>(e: K, ...payload: T[K] extends any[] ? T[K] : [T[K]]): void;
};
declare var events: EventType<Record1>;
@@ -0,0 +1,624 @@
=== tests/cases/conformance/types/rest/genericRestParameters1.ts ===
declare let f1: (...x: [number, string, boolean]) => void;
>f1 : Symbol(f1, Decl(genericRestParameters1.ts, 0, 11))
>x : Symbol(x, Decl(genericRestParameters1.ts, 0, 17))
declare let f2: (x0: number, x1: string, x2: boolean) => void;
>f2 : Symbol(f2, Decl(genericRestParameters1.ts, 1, 11))
>x0 : Symbol(x0, Decl(genericRestParameters1.ts, 1, 17))
>x1 : Symbol(x1, Decl(genericRestParameters1.ts, 1, 28))
>x2 : Symbol(x2, Decl(genericRestParameters1.ts, 1, 40))
f1 = f2;
>f1 : Symbol(f1, Decl(genericRestParameters1.ts, 0, 11))
>f2 : Symbol(f2, Decl(genericRestParameters1.ts, 1, 11))
f2 = f1;
>f2 : Symbol(f2, Decl(genericRestParameters1.ts, 1, 11))
>f1 : Symbol(f1, Decl(genericRestParameters1.ts, 0, 11))
declare const t3: [number, string, boolean];
>t3 : Symbol(t3, Decl(genericRestParameters1.ts, 6, 13))
declare const t2: [string, boolean];
>t2 : Symbol(t2, Decl(genericRestParameters1.ts, 7, 13))
declare const t1: [boolean];
>t1 : Symbol(t1, Decl(genericRestParameters1.ts, 8, 13))
declare const t0: [];
>t0 : Symbol(t0, Decl(genericRestParameters1.ts, 9, 13))
declare const ns: [number, string];
>ns : Symbol(ns, Decl(genericRestParameters1.ts, 11, 13))
declare const sn: [string, number];
>sn : Symbol(sn, Decl(genericRestParameters1.ts, 12, 13))
f1(42, "hello", true);
>f1 : Symbol(f1, Decl(genericRestParameters1.ts, 0, 11))
f1(t3[0], t3[1], t3[2]);
>f1 : Symbol(f1, Decl(genericRestParameters1.ts, 0, 11))
>t3 : Symbol(t3, Decl(genericRestParameters1.ts, 6, 13))
>0 : Symbol(0)
>t3 : Symbol(t3, Decl(genericRestParameters1.ts, 6, 13))
>1 : Symbol(1)
>t3 : Symbol(t3, Decl(genericRestParameters1.ts, 6, 13))
>2 : Symbol(2)
f1(...t3);
>f1 : Symbol(f1, Decl(genericRestParameters1.ts, 0, 11))
>t3 : Symbol(t3, Decl(genericRestParameters1.ts, 6, 13))
f1(42, ...t2);
>f1 : Symbol(f1, Decl(genericRestParameters1.ts, 0, 11))
>t2 : Symbol(t2, Decl(genericRestParameters1.ts, 7, 13))
f1(42, "hello", ...t1);
>f1 : Symbol(f1, Decl(genericRestParameters1.ts, 0, 11))
>t1 : Symbol(t1, Decl(genericRestParameters1.ts, 8, 13))
f1(42, "hello", true, ...t0);
>f1 : Symbol(f1, Decl(genericRestParameters1.ts, 0, 11))
>t0 : Symbol(t0, Decl(genericRestParameters1.ts, 9, 13))
f1(ns[0], ns[1], true);
>f1 : Symbol(f1, Decl(genericRestParameters1.ts, 0, 11))
>ns : Symbol(ns, Decl(genericRestParameters1.ts, 11, 13))
>0 : Symbol(0)
>ns : Symbol(ns, Decl(genericRestParameters1.ts, 11, 13))
>1 : Symbol(1)
f1(...ns, true); // Error, tuple spread only expanded when last
>f1 : Symbol(f1, Decl(genericRestParameters1.ts, 0, 11))
>ns : Symbol(ns, Decl(genericRestParameters1.ts, 11, 13))
f2(42, "hello", true);
>f2 : Symbol(f2, Decl(genericRestParameters1.ts, 1, 11))
f2(t3[0], t3[1], t3[2]);
>f2 : Symbol(f2, Decl(genericRestParameters1.ts, 1, 11))
>t3 : Symbol(t3, Decl(genericRestParameters1.ts, 6, 13))
>0 : Symbol(0)
>t3 : Symbol(t3, Decl(genericRestParameters1.ts, 6, 13))
>1 : Symbol(1)
>t3 : Symbol(t3, Decl(genericRestParameters1.ts, 6, 13))
>2 : Symbol(2)
f2(...t3);
>f2 : Symbol(f2, Decl(genericRestParameters1.ts, 1, 11))
>t3 : Symbol(t3, Decl(genericRestParameters1.ts, 6, 13))
f2(42, ...t2);
>f2 : Symbol(f2, Decl(genericRestParameters1.ts, 1, 11))
>t2 : Symbol(t2, Decl(genericRestParameters1.ts, 7, 13))
f2(42, "hello", ...t1);
>f2 : Symbol(f2, Decl(genericRestParameters1.ts, 1, 11))
>t1 : Symbol(t1, Decl(genericRestParameters1.ts, 8, 13))
f2(42, "hello", true, ...t0);
>f2 : Symbol(f2, Decl(genericRestParameters1.ts, 1, 11))
>t0 : Symbol(t0, Decl(genericRestParameters1.ts, 9, 13))
f2(ns[0], ns[1], true);
>f2 : Symbol(f2, Decl(genericRestParameters1.ts, 1, 11))
>ns : Symbol(ns, Decl(genericRestParameters1.ts, 11, 13))
>0 : Symbol(0)
>ns : Symbol(ns, Decl(genericRestParameters1.ts, 11, 13))
>1 : Symbol(1)
f2(...ns, true); // Error, tuple spread only expanded when last
>f2 : Symbol(f2, Decl(genericRestParameters1.ts, 1, 11))
>ns : Symbol(ns, Decl(genericRestParameters1.ts, 11, 13))
declare function f10<T extends unknown[]>(...args: T): T;
>f10 : Symbol(f10, Decl(genericRestParameters1.ts, 30, 16))
>T : Symbol(T, Decl(genericRestParameters1.ts, 32, 21))
>args : Symbol(args, Decl(genericRestParameters1.ts, 32, 42))
>T : Symbol(T, Decl(genericRestParameters1.ts, 32, 21))
>T : Symbol(T, Decl(genericRestParameters1.ts, 32, 21))
const x10 = f10(42, "hello", true); // [number, string, boolean]
>x10 : Symbol(x10, Decl(genericRestParameters1.ts, 34, 5))
>f10 : Symbol(f10, Decl(genericRestParameters1.ts, 30, 16))
const x11 = f10(42, "hello"); // [number, string]
>x11 : Symbol(x11, Decl(genericRestParameters1.ts, 35, 5))
>f10 : Symbol(f10, Decl(genericRestParameters1.ts, 30, 16))
const x12 = f10(42); // [number]
>x12 : Symbol(x12, Decl(genericRestParameters1.ts, 36, 5))
>f10 : Symbol(f10, Decl(genericRestParameters1.ts, 30, 16))
const x13 = f10(); // []
>x13 : Symbol(x13, Decl(genericRestParameters1.ts, 37, 5))
>f10 : Symbol(f10, Decl(genericRestParameters1.ts, 30, 16))
const x14 = f10(...t3); // [number, string, boolean]
>x14 : Symbol(x14, Decl(genericRestParameters1.ts, 38, 5))
>f10 : Symbol(f10, Decl(genericRestParameters1.ts, 30, 16))
>t3 : Symbol(t3, Decl(genericRestParameters1.ts, 6, 13))
const x15 = f10(42, ...t2); // [number, string, boolean]
>x15 : Symbol(x15, Decl(genericRestParameters1.ts, 39, 5))
>f10 : Symbol(f10, Decl(genericRestParameters1.ts, 30, 16))
>t2 : Symbol(t2, Decl(genericRestParameters1.ts, 7, 13))
const x16 = f10(42, "hello", ...t1); // [number, string, boolean]
>x16 : Symbol(x16, Decl(genericRestParameters1.ts, 40, 5))
>f10 : Symbol(f10, Decl(genericRestParameters1.ts, 30, 16))
>t1 : Symbol(t1, Decl(genericRestParameters1.ts, 8, 13))
const x17 = f10(42, "hello", true, ...t0); // [number, string, boolean]
>x17 : Symbol(x17, Decl(genericRestParameters1.ts, 41, 5))
>f10 : Symbol(f10, Decl(genericRestParameters1.ts, 30, 16))
>t0 : Symbol(t0, Decl(genericRestParameters1.ts, 9, 13))
const x18 = f10(...ns, true); // (string | number | boolean)[]
>x18 : Symbol(x18, Decl(genericRestParameters1.ts, 42, 5))
>f10 : Symbol(f10, Decl(genericRestParameters1.ts, 30, 16))
>ns : Symbol(ns, Decl(genericRestParameters1.ts, 11, 13))
function g10<U extends string[], V extends [number, number]>(u: U, v: V) {
>g10 : Symbol(g10, Decl(genericRestParameters1.ts, 42, 29))
>U : Symbol(U, Decl(genericRestParameters1.ts, 44, 13))
>V : Symbol(V, Decl(genericRestParameters1.ts, 44, 32))
>u : Symbol(u, Decl(genericRestParameters1.ts, 44, 61))
>U : Symbol(U, Decl(genericRestParameters1.ts, 44, 13))
>v : Symbol(v, Decl(genericRestParameters1.ts, 44, 66))
>V : Symbol(V, Decl(genericRestParameters1.ts, 44, 32))
let x1 = f10(...u); // U
>x1 : Symbol(x1, Decl(genericRestParameters1.ts, 45, 7))
>f10 : Symbol(f10, Decl(genericRestParameters1.ts, 30, 16))
>u : Symbol(u, Decl(genericRestParameters1.ts, 44, 61))
let x2 = f10(...v); // V
>x2 : Symbol(x2, Decl(genericRestParameters1.ts, 46, 7))
>f10 : Symbol(f10, Decl(genericRestParameters1.ts, 30, 16))
>v : Symbol(v, Decl(genericRestParameters1.ts, 44, 66))
let x3 = f10(1, ...u); // [number, ...string[]]
>x3 : Symbol(x3, Decl(genericRestParameters1.ts, 47, 7))
>f10 : Symbol(f10, Decl(genericRestParameters1.ts, 30, 16))
>u : Symbol(u, Decl(genericRestParameters1.ts, 44, 61))
let x4 = f10(...u, ...v); // (string | number)[]
>x4 : Symbol(x4, Decl(genericRestParameters1.ts, 48, 7))
>f10 : Symbol(f10, Decl(genericRestParameters1.ts, 30, 16))
>u : Symbol(u, Decl(genericRestParameters1.ts, 44, 61))
>v : Symbol(v, Decl(genericRestParameters1.ts, 44, 66))
}
declare function f11<T extends (string | number | boolean)[]>(...args: T): T;
>f11 : Symbol(f11, Decl(genericRestParameters1.ts, 49, 1))
>T : Symbol(T, Decl(genericRestParameters1.ts, 51, 21))
>args : Symbol(args, Decl(genericRestParameters1.ts, 51, 62))
>T : Symbol(T, Decl(genericRestParameters1.ts, 51, 21))
>T : Symbol(T, Decl(genericRestParameters1.ts, 51, 21))
const z10 = f11(42, "hello", true); // [42, "hello", true]
>z10 : Symbol(z10, Decl(genericRestParameters1.ts, 53, 5))
>f11 : Symbol(f11, Decl(genericRestParameters1.ts, 49, 1))
const z11 = f11(42, "hello"); // [42, "hello"]
>z11 : Symbol(z11, Decl(genericRestParameters1.ts, 54, 5))
>f11 : Symbol(f11, Decl(genericRestParameters1.ts, 49, 1))
const z12 = f11(42); // [42]
>z12 : Symbol(z12, Decl(genericRestParameters1.ts, 55, 5))
>f11 : Symbol(f11, Decl(genericRestParameters1.ts, 49, 1))
const z13 = f11(); // []
>z13 : Symbol(z13, Decl(genericRestParameters1.ts, 56, 5))
>f11 : Symbol(f11, Decl(genericRestParameters1.ts, 49, 1))
const z14 = f11(...t3); // [number, string, boolean]
>z14 : Symbol(z14, Decl(genericRestParameters1.ts, 57, 5))
>f11 : Symbol(f11, Decl(genericRestParameters1.ts, 49, 1))
>t3 : Symbol(t3, Decl(genericRestParameters1.ts, 6, 13))
const z15 = f11(42, ...t2); // [42, string, boolean]
>z15 : Symbol(z15, Decl(genericRestParameters1.ts, 58, 5))
>f11 : Symbol(f11, Decl(genericRestParameters1.ts, 49, 1))
>t2 : Symbol(t2, Decl(genericRestParameters1.ts, 7, 13))
const z16 = f11(42, "hello", ...t1); // [42, "hello", boolean]
>z16 : Symbol(z16, Decl(genericRestParameters1.ts, 59, 5))
>f11 : Symbol(f11, Decl(genericRestParameters1.ts, 49, 1))
>t1 : Symbol(t1, Decl(genericRestParameters1.ts, 8, 13))
const z17 = f11(42, "hello", true, ...t0); // [42, "hello", true]
>z17 : Symbol(z17, Decl(genericRestParameters1.ts, 60, 5))
>f11 : Symbol(f11, Decl(genericRestParameters1.ts, 49, 1))
>t0 : Symbol(t0, Decl(genericRestParameters1.ts, 9, 13))
const z18 = f11(...ns, true); // (string | number | true)[]
>z18 : Symbol(z18, Decl(genericRestParameters1.ts, 61, 5))
>f11 : Symbol(f11, Decl(genericRestParameters1.ts, 49, 1))
>ns : Symbol(ns, Decl(genericRestParameters1.ts, 11, 13))
function g11<U extends string[], V extends [number, number]>(u: U, v: V) {
>g11 : Symbol(g11, Decl(genericRestParameters1.ts, 61, 29))
>U : Symbol(U, Decl(genericRestParameters1.ts, 63, 13))
>V : Symbol(V, Decl(genericRestParameters1.ts, 63, 32))
>u : Symbol(u, Decl(genericRestParameters1.ts, 63, 61))
>U : Symbol(U, Decl(genericRestParameters1.ts, 63, 13))
>v : Symbol(v, Decl(genericRestParameters1.ts, 63, 66))
>V : Symbol(V, Decl(genericRestParameters1.ts, 63, 32))
let x1 = f11(...u); // U
>x1 : Symbol(x1, Decl(genericRestParameters1.ts, 64, 7))
>f11 : Symbol(f11, Decl(genericRestParameters1.ts, 49, 1))
>u : Symbol(u, Decl(genericRestParameters1.ts, 63, 61))
let x2 = f11(...v); // V
>x2 : Symbol(x2, Decl(genericRestParameters1.ts, 65, 7))
>f11 : Symbol(f11, Decl(genericRestParameters1.ts, 49, 1))
>v : Symbol(v, Decl(genericRestParameters1.ts, 63, 66))
let x3 = f11(1, ...u); // [1, ...string[]]
>x3 : Symbol(x3, Decl(genericRestParameters1.ts, 66, 7))
>f11 : Symbol(f11, Decl(genericRestParameters1.ts, 49, 1))
>u : Symbol(u, Decl(genericRestParameters1.ts, 63, 61))
let x4 = f11(...u, ...v); // (string | number)[]
>x4 : Symbol(x4, Decl(genericRestParameters1.ts, 67, 7))
>f11 : Symbol(f11, Decl(genericRestParameters1.ts, 49, 1))
>u : Symbol(u, Decl(genericRestParameters1.ts, 63, 61))
>v : Symbol(v, Decl(genericRestParameters1.ts, 63, 66))
}
function call<T extends unknown[], U>(f: (...args: T) => U, ...args: T) {
>call : Symbol(call, Decl(genericRestParameters1.ts, 68, 1))
>T : Symbol(T, Decl(genericRestParameters1.ts, 70, 14))
>U : Symbol(U, Decl(genericRestParameters1.ts, 70, 34))
>f : Symbol(f, Decl(genericRestParameters1.ts, 70, 38))
>args : Symbol(args, Decl(genericRestParameters1.ts, 70, 42))
>T : Symbol(T, Decl(genericRestParameters1.ts, 70, 14))
>U : Symbol(U, Decl(genericRestParameters1.ts, 70, 34))
>args : Symbol(args, Decl(genericRestParameters1.ts, 70, 59))
>T : Symbol(T, Decl(genericRestParameters1.ts, 70, 14))
return f(...args);
>f : Symbol(f, Decl(genericRestParameters1.ts, 70, 38))
>args : Symbol(args, Decl(genericRestParameters1.ts, 70, 59))
}
function callr<T extends unknown[], U>(args: T, f: (...args: T) => U) {
>callr : Symbol(callr, Decl(genericRestParameters1.ts, 72, 1))
>T : Symbol(T, Decl(genericRestParameters1.ts, 74, 15))
>U : Symbol(U, Decl(genericRestParameters1.ts, 74, 35))
>args : Symbol(args, Decl(genericRestParameters1.ts, 74, 39))
>T : Symbol(T, Decl(genericRestParameters1.ts, 74, 15))
>f : Symbol(f, Decl(genericRestParameters1.ts, 74, 47))
>args : Symbol(args, Decl(genericRestParameters1.ts, 74, 52))
>T : Symbol(T, Decl(genericRestParameters1.ts, 74, 15))
>U : Symbol(U, Decl(genericRestParameters1.ts, 74, 35))
return f(...args);
>f : Symbol(f, Decl(genericRestParameters1.ts, 74, 47))
>args : Symbol(args, Decl(genericRestParameters1.ts, 74, 39))
}
declare function f15(a: string, b: number): string | number;
>f15 : Symbol(f15, Decl(genericRestParameters1.ts, 76, 1))
>a : Symbol(a, Decl(genericRestParameters1.ts, 78, 21))
>b : Symbol(b, Decl(genericRestParameters1.ts, 78, 31))
declare function f16<A, B>(a: A, b: B): A | B;
>f16 : Symbol(f16, Decl(genericRestParameters1.ts, 78, 60))
>A : Symbol(A, Decl(genericRestParameters1.ts, 79, 21))
>B : Symbol(B, Decl(genericRestParameters1.ts, 79, 23))
>a : Symbol(a, Decl(genericRestParameters1.ts, 79, 27))
>A : Symbol(A, Decl(genericRestParameters1.ts, 79, 21))
>b : Symbol(b, Decl(genericRestParameters1.ts, 79, 32))
>B : Symbol(B, Decl(genericRestParameters1.ts, 79, 23))
>A : Symbol(A, Decl(genericRestParameters1.ts, 79, 21))
>B : Symbol(B, Decl(genericRestParameters1.ts, 79, 23))
let x20 = call((x, y) => x + y, 10, 20); // number
>x20 : Symbol(x20, Decl(genericRestParameters1.ts, 81, 3))
>call : Symbol(call, Decl(genericRestParameters1.ts, 68, 1))
>x : Symbol(x, Decl(genericRestParameters1.ts, 81, 16))
>y : Symbol(y, Decl(genericRestParameters1.ts, 81, 18))
>x : Symbol(x, Decl(genericRestParameters1.ts, 81, 16))
>y : Symbol(y, Decl(genericRestParameters1.ts, 81, 18))
let x21 = call((x, y) => x + y, 10, "hello"); // string
>x21 : Symbol(x21, Decl(genericRestParameters1.ts, 82, 3))
>call : Symbol(call, Decl(genericRestParameters1.ts, 68, 1))
>x : Symbol(x, Decl(genericRestParameters1.ts, 82, 16))
>y : Symbol(y, Decl(genericRestParameters1.ts, 82, 18))
>x : Symbol(x, Decl(genericRestParameters1.ts, 82, 16))
>y : Symbol(y, Decl(genericRestParameters1.ts, 82, 18))
let x22 = call(f15, "hello", 42); // string | number
>x22 : Symbol(x22, Decl(genericRestParameters1.ts, 83, 3))
>call : Symbol(call, Decl(genericRestParameters1.ts, 68, 1))
>f15 : Symbol(f15, Decl(genericRestParameters1.ts, 76, 1))
let x23 = call(f16, "hello", 42); // unknown
>x23 : Symbol(x23, Decl(genericRestParameters1.ts, 84, 3))
>call : Symbol(call, Decl(genericRestParameters1.ts, 68, 1))
>f16 : Symbol(f16, Decl(genericRestParameters1.ts, 78, 60))
let x24 = call<[string, number], string | number>(f16, "hello", 42); // string | number
>x24 : Symbol(x24, Decl(genericRestParameters1.ts, 85, 3))
>call : Symbol(call, Decl(genericRestParameters1.ts, 68, 1))
>f16 : Symbol(f16, Decl(genericRestParameters1.ts, 78, 60))
let x30 = callr(sn, (x, y) => x + y); // string
>x30 : Symbol(x30, Decl(genericRestParameters1.ts, 87, 3))
>callr : Symbol(callr, Decl(genericRestParameters1.ts, 72, 1))
>sn : Symbol(sn, Decl(genericRestParameters1.ts, 12, 13))
>x : Symbol(x, Decl(genericRestParameters1.ts, 87, 21))
>y : Symbol(y, Decl(genericRestParameters1.ts, 87, 23))
>x : Symbol(x, Decl(genericRestParameters1.ts, 87, 21))
>y : Symbol(y, Decl(genericRestParameters1.ts, 87, 23))
let x31 = callr(sn, f15); // string | number
>x31 : Symbol(x31, Decl(genericRestParameters1.ts, 88, 3))
>callr : Symbol(callr, Decl(genericRestParameters1.ts, 72, 1))
>sn : Symbol(sn, Decl(genericRestParameters1.ts, 12, 13))
>f15 : Symbol(f15, Decl(genericRestParameters1.ts, 76, 1))
let x32 = callr(sn, f16); // string | number
>x32 : Symbol(x32, Decl(genericRestParameters1.ts, 89, 3))
>callr : Symbol(callr, Decl(genericRestParameters1.ts, 72, 1))
>sn : Symbol(sn, Decl(genericRestParameters1.ts, 12, 13))
>f16 : Symbol(f16, Decl(genericRestParameters1.ts, 78, 60))
function bind<T, U extends unknown[], V>(f: (x: T, ...rest: U) => V, x: T) {
>bind : Symbol(bind, Decl(genericRestParameters1.ts, 89, 25))
>T : Symbol(T, Decl(genericRestParameters1.ts, 91, 14))
>U : Symbol(U, Decl(genericRestParameters1.ts, 91, 16))
>V : Symbol(V, Decl(genericRestParameters1.ts, 91, 37))
>f : Symbol(f, Decl(genericRestParameters1.ts, 91, 41))
>x : Symbol(x, Decl(genericRestParameters1.ts, 91, 45))
>T : Symbol(T, Decl(genericRestParameters1.ts, 91, 14))
>rest : Symbol(rest, Decl(genericRestParameters1.ts, 91, 50))
>U : Symbol(U, Decl(genericRestParameters1.ts, 91, 16))
>V : Symbol(V, Decl(genericRestParameters1.ts, 91, 37))
>x : Symbol(x, Decl(genericRestParameters1.ts, 91, 68))
>T : Symbol(T, Decl(genericRestParameters1.ts, 91, 14))
return (...rest: U) => f(x, ...rest);
>rest : Symbol(rest, Decl(genericRestParameters1.ts, 92, 12))
>U : Symbol(U, Decl(genericRestParameters1.ts, 91, 16))
>f : Symbol(f, Decl(genericRestParameters1.ts, 91, 41))
>x : Symbol(x, Decl(genericRestParameters1.ts, 91, 68))
>rest : Symbol(rest, Decl(genericRestParameters1.ts, 92, 12))
}
declare const f20: (x: number, y: string, z: boolean) => string[];
>f20 : Symbol(f20, Decl(genericRestParameters1.ts, 95, 13))
>x : Symbol(x, Decl(genericRestParameters1.ts, 95, 20))
>y : Symbol(y, Decl(genericRestParameters1.ts, 95, 30))
>z : Symbol(z, Decl(genericRestParameters1.ts, 95, 41))
const f21 = bind(f20, 42); // (y: string, z: boolean) => string[]
>f21 : Symbol(f21, Decl(genericRestParameters1.ts, 97, 5))
>bind : Symbol(bind, Decl(genericRestParameters1.ts, 89, 25))
>f20 : Symbol(f20, Decl(genericRestParameters1.ts, 95, 13))
const f22 = bind(f21, "hello"); // (z: boolean) => string[]
>f22 : Symbol(f22, Decl(genericRestParameters1.ts, 98, 5))
>bind : Symbol(bind, Decl(genericRestParameters1.ts, 89, 25))
>f21 : Symbol(f21, Decl(genericRestParameters1.ts, 97, 5))
const f23 = bind(f22, true); // () => string[]
>f23 : Symbol(f23, Decl(genericRestParameters1.ts, 99, 5))
>bind : Symbol(bind, Decl(genericRestParameters1.ts, 89, 25))
>f22 : Symbol(f22, Decl(genericRestParameters1.ts, 98, 5))
f20(42, "hello", true);
>f20 : Symbol(f20, Decl(genericRestParameters1.ts, 95, 13))
f21("hello", true);
>f21 : Symbol(f21, Decl(genericRestParameters1.ts, 97, 5))
f22(true);
>f22 : Symbol(f22, Decl(genericRestParameters1.ts, 98, 5))
f23();
>f23 : Symbol(f23, Decl(genericRestParameters1.ts, 99, 5))
declare const g20: (x: number, y?: string, z?: boolean) => string[];
>g20 : Symbol(g20, Decl(genericRestParameters1.ts, 106, 13))
>x : Symbol(x, Decl(genericRestParameters1.ts, 106, 20))
>y : Symbol(y, Decl(genericRestParameters1.ts, 106, 30))
>z : Symbol(z, Decl(genericRestParameters1.ts, 106, 42))
const g21 = bind(g20, 42); // (y: string, z: boolean) => string[]
>g21 : Symbol(g21, Decl(genericRestParameters1.ts, 108, 5))
>bind : Symbol(bind, Decl(genericRestParameters1.ts, 89, 25))
>g20 : Symbol(g20, Decl(genericRestParameters1.ts, 106, 13))
const g22 = bind(g21, "hello"); // (z: boolean) => string[]
>g22 : Symbol(g22, Decl(genericRestParameters1.ts, 109, 5))
>bind : Symbol(bind, Decl(genericRestParameters1.ts, 89, 25))
>g21 : Symbol(g21, Decl(genericRestParameters1.ts, 108, 5))
const g23 = bind(g22, true); // () => string[]
>g23 : Symbol(g23, Decl(genericRestParameters1.ts, 110, 5))
>bind : Symbol(bind, Decl(genericRestParameters1.ts, 89, 25))
>g22 : Symbol(g22, Decl(genericRestParameters1.ts, 109, 5))
g20(42, "hello", true);
>g20 : Symbol(g20, Decl(genericRestParameters1.ts, 106, 13))
g20(42, "hello");
>g20 : Symbol(g20, Decl(genericRestParameters1.ts, 106, 13))
g20(42);
>g20 : Symbol(g20, Decl(genericRestParameters1.ts, 106, 13))
g21("hello", true);
>g21 : Symbol(g21, Decl(genericRestParameters1.ts, 108, 5))
g21("hello");
>g21 : Symbol(g21, Decl(genericRestParameters1.ts, 108, 5))
g21();
>g21 : Symbol(g21, Decl(genericRestParameters1.ts, 108, 5))
g22(true);
>g22 : Symbol(g22, Decl(genericRestParameters1.ts, 109, 5))
g22();
>g22 : Symbol(g22, Decl(genericRestParameters1.ts, 109, 5))
g23();
>g23 : Symbol(g23, Decl(genericRestParameters1.ts, 110, 5))
declare function f30<T, U extends ((x: T) => any)[]>(x: T, ...args: U): U;
>f30 : Symbol(f30, Decl(genericRestParameters1.ts, 120, 6))
>T : Symbol(T, Decl(genericRestParameters1.ts, 122, 21))
>U : Symbol(U, Decl(genericRestParameters1.ts, 122, 23))
>x : Symbol(x, Decl(genericRestParameters1.ts, 122, 36))
>T : Symbol(T, Decl(genericRestParameters1.ts, 122, 21))
>x : Symbol(x, Decl(genericRestParameters1.ts, 122, 53))
>T : Symbol(T, Decl(genericRestParameters1.ts, 122, 21))
>args : Symbol(args, Decl(genericRestParameters1.ts, 122, 58))
>U : Symbol(U, Decl(genericRestParameters1.ts, 122, 23))
>U : Symbol(U, Decl(genericRestParameters1.ts, 122, 23))
const c30 = f30(42, x => "" + x, x => x + 1); // [(x: number) => string, (x: number) => number]
>c30 : Symbol(c30, Decl(genericRestParameters1.ts, 124, 5))
>f30 : Symbol(f30, Decl(genericRestParameters1.ts, 120, 6))
>x : Symbol(x, Decl(genericRestParameters1.ts, 124, 19))
>x : Symbol(x, Decl(genericRestParameters1.ts, 124, 19))
>x : Symbol(x, Decl(genericRestParameters1.ts, 124, 32))
>x : Symbol(x, Decl(genericRestParameters1.ts, 124, 32))
type Parameters<T extends Function> = T extends ((...args: infer U) => any) | (new(...args: infer U) => any) ? U : any[];
>Parameters : Symbol(Parameters, Decl(genericRestParameters1.ts, 124, 45))
>T : Symbol(T, Decl(genericRestParameters1.ts, 126, 16))
>Function : Symbol(Function, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --))
>T : Symbol(T, Decl(genericRestParameters1.ts, 126, 16))
>args : Symbol(args, Decl(genericRestParameters1.ts, 126, 50))
>U : Symbol(U, Decl(genericRestParameters1.ts, 126, 64), Decl(genericRestParameters1.ts, 126, 97))
>args : Symbol(args, Decl(genericRestParameters1.ts, 126, 83))
>U : Symbol(U, Decl(genericRestParameters1.ts, 126, 64), Decl(genericRestParameters1.ts, 126, 97))
>U : Symbol(U, Decl(genericRestParameters1.ts, 126, 64), Decl(genericRestParameters1.ts, 126, 97))
type T01 = Parameters<(x: number, y: string, z: boolean) => void>;
>T01 : Symbol(T01, Decl(genericRestParameters1.ts, 126, 121))
>Parameters : Symbol(Parameters, Decl(genericRestParameters1.ts, 124, 45))
>x : Symbol(x, Decl(genericRestParameters1.ts, 128, 23))
>y : Symbol(y, Decl(genericRestParameters1.ts, 128, 33))
>z : Symbol(z, Decl(genericRestParameters1.ts, 128, 44))
type T02 = Parameters<(...args: [number, string, boolean]) => void>;
>T02 : Symbol(T02, Decl(genericRestParameters1.ts, 128, 66))
>Parameters : Symbol(Parameters, Decl(genericRestParameters1.ts, 124, 45))
>args : Symbol(args, Decl(genericRestParameters1.ts, 129, 23))
type T03 = Parameters<new (x: number, y: string, z: boolean) => void>;
>T03 : Symbol(T03, Decl(genericRestParameters1.ts, 129, 68))
>Parameters : Symbol(Parameters, Decl(genericRestParameters1.ts, 124, 45))
>x : Symbol(x, Decl(genericRestParameters1.ts, 130, 27))
>y : Symbol(y, Decl(genericRestParameters1.ts, 130, 37))
>z : Symbol(z, Decl(genericRestParameters1.ts, 130, 48))
type T04 = Parameters<new (...args: [number, string, boolean]) => void>;
>T04 : Symbol(T04, Decl(genericRestParameters1.ts, 130, 70))
>Parameters : Symbol(Parameters, Decl(genericRestParameters1.ts, 124, 45))
>args : Symbol(args, Decl(genericRestParameters1.ts, 131, 27))
type T05<T> = Parameters<(...args: T[]) => void>;
>T05 : Symbol(T05, Decl(genericRestParameters1.ts, 131, 72))
>T : Symbol(T, Decl(genericRestParameters1.ts, 132, 9))
>Parameters : Symbol(Parameters, Decl(genericRestParameters1.ts, 124, 45))
>args : Symbol(args, Decl(genericRestParameters1.ts, 132, 26))
>T : Symbol(T, Decl(genericRestParameters1.ts, 132, 9))
type T06<T> = Parameters<new (...args: []) => void>;
>T06 : Symbol(T06, Decl(genericRestParameters1.ts, 132, 49))
>T : Symbol(T, Decl(genericRestParameters1.ts, 133, 9))
>Parameters : Symbol(Parameters, Decl(genericRestParameters1.ts, 124, 45))
>args : Symbol(args, Decl(genericRestParameters1.ts, 133, 30))
type T07<T extends any[]> = Parameters<(...args: T) => void>;
>T07 : Symbol(T07, Decl(genericRestParameters1.ts, 133, 52))
>T : Symbol(T, Decl(genericRestParameters1.ts, 134, 9))
>Parameters : Symbol(Parameters, Decl(genericRestParameters1.ts, 124, 45))
>args : Symbol(args, Decl(genericRestParameters1.ts, 134, 40))
>T : Symbol(T, Decl(genericRestParameters1.ts, 134, 9))
type T08<T extends any[]> = Parameters<new (...args: T) => void>;
>T08 : Symbol(T08, Decl(genericRestParameters1.ts, 134, 61))
>T : Symbol(T, Decl(genericRestParameters1.ts, 135, 9))
>Parameters : Symbol(Parameters, Decl(genericRestParameters1.ts, 124, 45))
>args : Symbol(args, Decl(genericRestParameters1.ts, 135, 44))
>T : Symbol(T, Decl(genericRestParameters1.ts, 135, 9))
type T09 = Parameters<Function>;
>T09 : Symbol(T09, Decl(genericRestParameters1.ts, 135, 65))
>Parameters : Symbol(Parameters, Decl(genericRestParameters1.ts, 124, 45))
>Function : Symbol(Function, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --))
type Record1 = {
>Record1 : Symbol(Record1, Decl(genericRestParameters1.ts, 136, 32))
move: [number, 'left' | 'right'];
>move : Symbol(move, Decl(genericRestParameters1.ts, 138, 16))
jump: [number, 'up' | 'down'];
>jump : Symbol(jump, Decl(genericRestParameters1.ts, 139, 35))
stop: string;
>stop : Symbol(stop, Decl(genericRestParameters1.ts, 140, 32))
done: [];
>done : Symbol(done, Decl(genericRestParameters1.ts, 141, 15))
}
type EventType<T> = {
>EventType : Symbol(EventType, Decl(genericRestParameters1.ts, 143, 1))
>T : Symbol(T, Decl(genericRestParameters1.ts, 145, 15))
emit<K extends keyof T = keyof T>(e: K, ...payload: T[K] extends any[] ? T[K] : [T[K]]): void;
>emit : Symbol(emit, Decl(genericRestParameters1.ts, 145, 21))
>K : Symbol(K, Decl(genericRestParameters1.ts, 146, 7))
>T : Symbol(T, Decl(genericRestParameters1.ts, 145, 15))
>T : Symbol(T, Decl(genericRestParameters1.ts, 145, 15))
>e : Symbol(e, Decl(genericRestParameters1.ts, 146, 36))
>K : Symbol(K, Decl(genericRestParameters1.ts, 146, 7))
>payload : Symbol(payload, Decl(genericRestParameters1.ts, 146, 41))
>T : Symbol(T, Decl(genericRestParameters1.ts, 145, 15))
>K : Symbol(K, Decl(genericRestParameters1.ts, 146, 7))
>T : Symbol(T, Decl(genericRestParameters1.ts, 145, 15))
>K : Symbol(K, Decl(genericRestParameters1.ts, 146, 7))
>T : Symbol(T, Decl(genericRestParameters1.ts, 145, 15))
>K : Symbol(K, Decl(genericRestParameters1.ts, 146, 7))
}
declare var events: EventType<Record1>;
>events : Symbol(events, Decl(genericRestParameters1.ts, 149, 11))
>EventType : Symbol(EventType, Decl(genericRestParameters1.ts, 143, 1))
>Record1 : Symbol(Record1, Decl(genericRestParameters1.ts, 136, 32))
events.emit('move', 10, 'left');
>events.emit : Symbol(emit, Decl(genericRestParameters1.ts, 145, 21))
>events : Symbol(events, Decl(genericRestParameters1.ts, 149, 11))
>emit : Symbol(emit, Decl(genericRestParameters1.ts, 145, 21))
events.emit('jump', 20, 'up');
>events.emit : Symbol(emit, Decl(genericRestParameters1.ts, 145, 21))
>events : Symbol(events, Decl(genericRestParameters1.ts, 149, 11))
>emit : Symbol(emit, Decl(genericRestParameters1.ts, 145, 21))
events.emit('stop', 'Bye!');
>events.emit : Symbol(emit, Decl(genericRestParameters1.ts, 145, 21))
>events : Symbol(events, Decl(genericRestParameters1.ts, 149, 11))
>emit : Symbol(emit, Decl(genericRestParameters1.ts, 145, 21))
events.emit('done');
>events.emit : Symbol(emit, Decl(genericRestParameters1.ts, 145, 21))
>events : Symbol(events, Decl(genericRestParameters1.ts, 149, 11))
>emit : Symbol(emit, Decl(genericRestParameters1.ts, 145, 21))
@@ -0,0 +1,851 @@
=== tests/cases/conformance/types/rest/genericRestParameters1.ts ===
declare let f1: (...x: [number, string, boolean]) => void;
>f1 : (x_0: number, x_1: string, x_2: boolean) => void
>x : [number, string, boolean]
declare let f2: (x0: number, x1: string, x2: boolean) => void;
>f2 : (x0: number, x1: string, x2: boolean) => void
>x0 : number
>x1 : string
>x2 : boolean
f1 = f2;
>f1 = f2 : (x0: number, x1: string, x2: boolean) => void
>f1 : (x_0: number, x_1: string, x_2: boolean) => void
>f2 : (x0: number, x1: string, x2: boolean) => void
f2 = f1;
>f2 = f1 : (x_0: number, x_1: string, x_2: boolean) => void
>f2 : (x0: number, x1: string, x2: boolean) => void
>f1 : (x_0: number, x_1: string, x_2: boolean) => void
declare const t3: [number, string, boolean];
>t3 : [number, string, boolean]
declare const t2: [string, boolean];
>t2 : [string, boolean]
declare const t1: [boolean];
>t1 : [boolean]
declare const t0: [];
>t0 : []
declare const ns: [number, string];
>ns : [number, string]
declare const sn: [string, number];
>sn : [string, number]
f1(42, "hello", true);
>f1(42, "hello", true) : void
>f1 : (x_0: number, x_1: string, x_2: boolean) => void
>42 : 42
>"hello" : "hello"
>true : true
f1(t3[0], t3[1], t3[2]);
>f1(t3[0], t3[1], t3[2]) : void
>f1 : (x_0: number, x_1: string, x_2: boolean) => void
>t3[0] : number
>t3 : [number, string, boolean]
>0 : 0
>t3[1] : string
>t3 : [number, string, boolean]
>1 : 1
>t3[2] : boolean
>t3 : [number, string, boolean]
>2 : 2
f1(...t3);
>f1(...t3) : void
>f1 : (x_0: number, x_1: string, x_2: boolean) => void
>...t3 : string | number | boolean
>t3 : [number, string, boolean]
f1(42, ...t2);
>f1(42, ...t2) : void
>f1 : (x_0: number, x_1: string, x_2: boolean) => void
>42 : 42
>...t2 : string | boolean
>t2 : [string, boolean]
f1(42, "hello", ...t1);
>f1(42, "hello", ...t1) : void
>f1 : (x_0: number, x_1: string, x_2: boolean) => void
>42 : 42
>"hello" : "hello"
>...t1 : boolean
>t1 : [boolean]
f1(42, "hello", true, ...t0);
>f1(42, "hello", true, ...t0) : void
>f1 : (x_0: number, x_1: string, x_2: boolean) => void
>42 : 42
>"hello" : "hello"
>true : true
>...t0 : never
>t0 : []
f1(ns[0], ns[1], true);
>f1(ns[0], ns[1], true) : void
>f1 : (x_0: number, x_1: string, x_2: boolean) => void
>ns[0] : number
>ns : [number, string]
>0 : 0
>ns[1] : string
>ns : [number, string]
>1 : 1
>true : true
f1(...ns, true); // Error, tuple spread only expanded when last
>f1(...ns, true) : void
>f1 : (x_0: number, x_1: string, x_2: boolean) => void
>...ns : string | number
>ns : [number, string]
>true : true
f2(42, "hello", true);
>f2(42, "hello", true) : void
>f2 : (x0: number, x1: string, x2: boolean) => void
>42 : 42
>"hello" : "hello"
>true : true
f2(t3[0], t3[1], t3[2]);
>f2(t3[0], t3[1], t3[2]) : void
>f2 : (x0: number, x1: string, x2: boolean) => void
>t3[0] : number
>t3 : [number, string, boolean]
>0 : 0
>t3[1] : string
>t3 : [number, string, boolean]
>1 : 1
>t3[2] : boolean
>t3 : [number, string, boolean]
>2 : 2
f2(...t3);
>f2(...t3) : void
>f2 : (x0: number, x1: string, x2: boolean) => void
>...t3 : string | number | boolean
>t3 : [number, string, boolean]
f2(42, ...t2);
>f2(42, ...t2) : void
>f2 : (x0: number, x1: string, x2: boolean) => void
>42 : 42
>...t2 : string | boolean
>t2 : [string, boolean]
f2(42, "hello", ...t1);
>f2(42, "hello", ...t1) : void
>f2 : (x0: number, x1: string, x2: boolean) => void
>42 : 42
>"hello" : "hello"
>...t1 : boolean
>t1 : [boolean]
f2(42, "hello", true, ...t0);
>f2(42, "hello", true, ...t0) : void
>f2 : (x0: number, x1: string, x2: boolean) => void
>42 : 42
>"hello" : "hello"
>true : true
>...t0 : never
>t0 : []
f2(ns[0], ns[1], true);
>f2(ns[0], ns[1], true) : void
>f2 : (x0: number, x1: string, x2: boolean) => void
>ns[0] : number
>ns : [number, string]
>0 : 0
>ns[1] : string
>ns : [number, string]
>1 : 1
>true : true
f2(...ns, true); // Error, tuple spread only expanded when last
>f2(...ns, true) : void
>f2 : (x0: number, x1: string, x2: boolean) => void
>...ns : string | number
>ns : [number, string]
>true : true
declare function f10<T extends unknown[]>(...args: T): T;
>f10 : <T extends unknown[]>(...args: T) => T
>T : T
>args : T
>T : T
>T : T
const x10 = f10(42, "hello", true); // [number, string, boolean]
>x10 : [number, string, boolean]
>f10(42, "hello", true) : [number, string, boolean]
>f10 : <T extends unknown[]>(...args: T) => T
>42 : 42
>"hello" : "hello"
>true : true
const x11 = f10(42, "hello"); // [number, string]
>x11 : [number, string]
>f10(42, "hello") : [number, string]
>f10 : <T extends unknown[]>(...args: T) => T
>42 : 42
>"hello" : "hello"
const x12 = f10(42); // [number]
>x12 : [number]
>f10(42) : [number]
>f10 : <T extends unknown[]>(...args: T) => T
>42 : 42
const x13 = f10(); // []
>x13 : []
>f10() : []
>f10 : <T extends unknown[]>(...args: T) => T
const x14 = f10(...t3); // [number, string, boolean]
>x14 : [number, string, boolean]
>f10(...t3) : [number, string, boolean]
>f10 : <T extends unknown[]>(...args: T) => T
>...t3 : string | number | boolean
>t3 : [number, string, boolean]
const x15 = f10(42, ...t2); // [number, string, boolean]
>x15 : [number, string, boolean]
>f10(42, ...t2) : [number, string, boolean]
>f10 : <T extends unknown[]>(...args: T) => T
>42 : 42
>...t2 : string | boolean
>t2 : [string, boolean]
const x16 = f10(42, "hello", ...t1); // [number, string, boolean]
>x16 : [number, string, boolean]
>f10(42, "hello", ...t1) : [number, string, boolean]
>f10 : <T extends unknown[]>(...args: T) => T
>42 : 42
>"hello" : "hello"
>...t1 : boolean
>t1 : [boolean]
const x17 = f10(42, "hello", true, ...t0); // [number, string, boolean]
>x17 : [number, string, boolean]
>f10(42, "hello", true, ...t0) : [number, string, boolean]
>f10 : <T extends unknown[]>(...args: T) => T
>42 : 42
>"hello" : "hello"
>true : true
>...t0 : never
>t0 : []
const x18 = f10(...ns, true); // (string | number | boolean)[]
>x18 : (string | number | boolean)[]
>f10(...ns, true) : (string | number | boolean)[]
>f10 : <T extends unknown[]>(...args: T) => T
>...ns : string | number
>ns : [number, string]
>true : true
function g10<U extends string[], V extends [number, number]>(u: U, v: V) {
>g10 : <U extends string[], V extends [number, number]>(u: U, v: V) => void
>U : U
>V : V
>u : U
>U : U
>v : V
>V : V
let x1 = f10(...u); // U
>x1 : U
>f10(...u) : U
>f10 : <T extends unknown[]>(...args: T) => T
>...u : string
>u : U
let x2 = f10(...v); // V
>x2 : V
>f10(...v) : V
>f10 : <T extends unknown[]>(...args: T) => T
>...v : number
>v : V
let x3 = f10(1, ...u); // [number, ...string[]]
>x3 : [number, ...string[]]
>f10(1, ...u) : [number, ...string[]]
>f10 : <T extends unknown[]>(...args: T) => T
>1 : 1
>...u : string
>u : U
let x4 = f10(...u, ...v); // (string | number)[]
>x4 : (string | number)[]
>f10(...u, ...v) : (string | number)[]
>f10 : <T extends unknown[]>(...args: T) => T
>...u : string
>u : U
>...v : number
>v : V
}
declare function f11<T extends (string | number | boolean)[]>(...args: T): T;
>f11 : <T extends (string | number | boolean)[]>(...args: T) => T
>T : T
>args : T
>T : T
>T : T
const z10 = f11(42, "hello", true); // [42, "hello", true]
>z10 : [42, "hello", true]
>f11(42, "hello", true) : [42, "hello", true]
>f11 : <T extends (string | number | boolean)[]>(...args: T) => T
>42 : 42
>"hello" : "hello"
>true : true
const z11 = f11(42, "hello"); // [42, "hello"]
>z11 : [42, "hello"]
>f11(42, "hello") : [42, "hello"]
>f11 : <T extends (string | number | boolean)[]>(...args: T) => T
>42 : 42
>"hello" : "hello"
const z12 = f11(42); // [42]
>z12 : [42]
>f11(42) : [42]
>f11 : <T extends (string | number | boolean)[]>(...args: T) => T
>42 : 42
const z13 = f11(); // []
>z13 : []
>f11() : []
>f11 : <T extends (string | number | boolean)[]>(...args: T) => T
const z14 = f11(...t3); // [number, string, boolean]
>z14 : [number, string, boolean]
>f11(...t3) : [number, string, boolean]
>f11 : <T extends (string | number | boolean)[]>(...args: T) => T
>...t3 : string | number | boolean
>t3 : [number, string, boolean]
const z15 = f11(42, ...t2); // [42, string, boolean]
>z15 : [42, string, boolean]
>f11(42, ...t2) : [42, string, boolean]
>f11 : <T extends (string | number | boolean)[]>(...args: T) => T
>42 : 42
>...t2 : string | boolean
>t2 : [string, boolean]
const z16 = f11(42, "hello", ...t1); // [42, "hello", boolean]
>z16 : [42, "hello", boolean]
>f11(42, "hello", ...t1) : [42, "hello", boolean]
>f11 : <T extends (string | number | boolean)[]>(...args: T) => T
>42 : 42
>"hello" : "hello"
>...t1 : boolean
>t1 : [boolean]
const z17 = f11(42, "hello", true, ...t0); // [42, "hello", true]
>z17 : [42, "hello", true]
>f11(42, "hello", true, ...t0) : [42, "hello", true]
>f11 : <T extends (string | number | boolean)[]>(...args: T) => T
>42 : 42
>"hello" : "hello"
>true : true
>...t0 : never
>t0 : []
const z18 = f11(...ns, true); // (string | number | true)[]
>z18 : (string | number | true)[]
>f11(...ns, true) : (string | number | true)[]
>f11 : <T extends (string | number | boolean)[]>(...args: T) => T
>...ns : string | number
>ns : [number, string]
>true : true
function g11<U extends string[], V extends [number, number]>(u: U, v: V) {
>g11 : <U extends string[], V extends [number, number]>(u: U, v: V) => void
>U : U
>V : V
>u : U
>U : U
>v : V
>V : V
let x1 = f11(...u); // U
>x1 : U
>f11(...u) : U
>f11 : <T extends (string | number | boolean)[]>(...args: T) => T
>...u : string
>u : U
let x2 = f11(...v); // V
>x2 : V
>f11(...v) : V
>f11 : <T extends (string | number | boolean)[]>(...args: T) => T
>...v : number
>v : V
let x3 = f11(1, ...u); // [1, ...string[]]
>x3 : [1, ...string[]]
>f11(1, ...u) : [1, ...string[]]
>f11 : <T extends (string | number | boolean)[]>(...args: T) => T
>1 : 1
>...u : string
>u : U
let x4 = f11(...u, ...v); // (string | number)[]
>x4 : (string | number)[]
>f11(...u, ...v) : (string | number)[]
>f11 : <T extends (string | number | boolean)[]>(...args: T) => T
>...u : string
>u : U
>...v : number
>v : V
}
function call<T extends unknown[], U>(f: (...args: T) => U, ...args: T) {
>call : <T extends unknown[], U>(f: (...args: T) => U, ...args: T) => U
>T : T
>U : U
>f : (...args: T) => U
>args : T
>T : T
>U : U
>args : T
>T : T
return f(...args);
>f(...args) : U
>f : (...args: T) => U
>...args : unknown
>args : T
}
function callr<T extends unknown[], U>(args: T, f: (...args: T) => U) {
>callr : <T extends unknown[], U>(args: T, f: (...args: T) => U) => U
>T : T
>U : U
>args : T
>T : T
>f : (...args: T) => U
>args : T
>T : T
>U : U
return f(...args);
>f(...args) : U
>f : (...args: T) => U
>...args : unknown
>args : T
}
declare function f15(a: string, b: number): string | number;
>f15 : (a: string, b: number) => string | number
>a : string
>b : number
declare function f16<A, B>(a: A, b: B): A | B;
>f16 : <A, B>(a: A, b: B) => A | B
>A : A
>B : B
>a : A
>A : A
>b : B
>B : B
>A : A
>B : B
let x20 = call((x, y) => x + y, 10, 20); // number
>x20 : number
>call((x, y) => x + y, 10, 20) : number
>call : <T extends unknown[], U>(f: (...args: T) => U, ...args: T) => U
>(x, y) => x + y : (x: number, y: number) => number
>x : number
>y : number
>x + y : number
>x : number
>y : number
>10 : 10
>20 : 20
let x21 = call((x, y) => x + y, 10, "hello"); // string
>x21 : string
>call((x, y) => x + y, 10, "hello") : string
>call : <T extends unknown[], U>(f: (...args: T) => U, ...args: T) => U
>(x, y) => x + y : (x: number, y: string) => string
>x : number
>y : string
>x + y : string
>x : number
>y : string
>10 : 10
>"hello" : "hello"
let x22 = call(f15, "hello", 42); // string | number
>x22 : string | number
>call(f15, "hello", 42) : string | number
>call : <T extends unknown[], U>(f: (...args: T) => U, ...args: T) => U
>f15 : (a: string, b: number) => string | number
>"hello" : "hello"
>42 : 42
let x23 = call(f16, "hello", 42); // unknown
>x23 : unknown
>call(f16, "hello", 42) : unknown
>call : <T extends unknown[], U>(f: (...args: T) => U, ...args: T) => U
>f16 : <A, B>(a: A, b: B) => A | B
>"hello" : "hello"
>42 : 42
let x24 = call<[string, number], string | number>(f16, "hello", 42); // string | number
>x24 : string | number
>call<[string, number], string | number>(f16, "hello", 42) : string | number
>call : <T extends unknown[], U>(f: (...args: T) => U, ...args: T) => U
>f16 : <A, B>(a: A, b: B) => A | B
>"hello" : "hello"
>42 : 42
let x30 = callr(sn, (x, y) => x + y); // string
>x30 : string
>callr(sn, (x, y) => x + y) : string
>callr : <T extends unknown[], U>(args: T, f: (...args: T) => U) => U
>sn : [string, number]
>(x, y) => x + y : (x: string, y: number) => string
>x : string
>y : number
>x + y : string
>x : string
>y : number
let x31 = callr(sn, f15); // string | number
>x31 : string | number
>callr(sn, f15) : string | number
>callr : <T extends unknown[], U>(args: T, f: (...args: T) => U) => U
>sn : [string, number]
>f15 : (a: string, b: number) => string | number
let x32 = callr(sn, f16); // string | number
>x32 : string | number
>callr(sn, f16) : string | number
>callr : <T extends unknown[], U>(args: T, f: (...args: T) => U) => U
>sn : [string, number]
>f16 : <A, B>(a: A, b: B) => A | B
function bind<T, U extends unknown[], V>(f: (x: T, ...rest: U) => V, x: T) {
>bind : <T, U extends unknown[], V>(f: (x: T, ...rest: U) => V, x: T) => (...rest: U) => V
>T : T
>U : U
>V : V
>f : (x: T, ...rest: U) => V
>x : T
>T : T
>rest : U
>U : U
>V : V
>x : T
>T : T
return (...rest: U) => f(x, ...rest);
>(...rest: U) => f(x, ...rest) : (...rest: U) => V
>rest : U
>U : U
>f(x, ...rest) : V
>f : (x: T, ...rest: U) => V
>x : T
>...rest : unknown
>rest : U
}
declare const f20: (x: number, y: string, z: boolean) => string[];
>f20 : (x: number, y: string, z: boolean) => string[]
>x : number
>y : string
>z : boolean
const f21 = bind(f20, 42); // (y: string, z: boolean) => string[]
>f21 : (y: string, z: boolean) => string[]
>bind(f20, 42) : (y: string, z: boolean) => string[]
>bind : <T, U extends unknown[], V>(f: (x: T, ...rest: U) => V, x: T) => (...rest: U) => V
>f20 : (x: number, y: string, z: boolean) => string[]
>42 : 42
const f22 = bind(f21, "hello"); // (z: boolean) => string[]
>f22 : (z: boolean) => string[]
>bind(f21, "hello") : (z: boolean) => string[]
>bind : <T, U extends unknown[], V>(f: (x: T, ...rest: U) => V, x: T) => (...rest: U) => V
>f21 : (y: string, z: boolean) => string[]
>"hello" : "hello"
const f23 = bind(f22, true); // () => string[]
>f23 : () => string[]
>bind(f22, true) : () => string[]
>bind : <T, U extends unknown[], V>(f: (x: T, ...rest: U) => V, x: T) => (...rest: U) => V
>f22 : (z: boolean) => string[]
>true : true
f20(42, "hello", true);
>f20(42, "hello", true) : string[]
>f20 : (x: number, y: string, z: boolean) => string[]
>42 : 42
>"hello" : "hello"
>true : true
f21("hello", true);
>f21("hello", true) : string[]
>f21 : (y: string, z: boolean) => string[]
>"hello" : "hello"
>true : true
f22(true);
>f22(true) : string[]
>f22 : (z: boolean) => string[]
>true : true
f23();
>f23() : string[]
>f23 : () => string[]
declare const g20: (x: number, y?: string, z?: boolean) => string[];
>g20 : (x: number, y?: string | undefined, z?: boolean | undefined) => string[]
>x : number
>y : string | undefined
>z : boolean | undefined
const g21 = bind(g20, 42); // (y: string, z: boolean) => string[]
>g21 : (y?: string | undefined, z?: boolean | undefined) => string[]
>bind(g20, 42) : (y?: string | undefined, z?: boolean | undefined) => string[]
>bind : <T, U extends unknown[], V>(f: (x: T, ...rest: U) => V, x: T) => (...rest: U) => V
>g20 : (x: number, y?: string | undefined, z?: boolean | undefined) => string[]
>42 : 42
const g22 = bind(g21, "hello"); // (z: boolean) => string[]
>g22 : (z?: boolean | undefined) => string[]
>bind(g21, "hello") : (z?: boolean | undefined) => string[]
>bind : <T, U extends unknown[], V>(f: (x: T, ...rest: U) => V, x: T) => (...rest: U) => V
>g21 : (y?: string | undefined, z?: boolean | undefined) => string[]
>"hello" : "hello"
const g23 = bind(g22, true); // () => string[]
>g23 : () => string[]
>bind(g22, true) : () => string[]
>bind : <T, U extends unknown[], V>(f: (x: T, ...rest: U) => V, x: T) => (...rest: U) => V
>g22 : (z?: boolean | undefined) => string[]
>true : true
g20(42, "hello", true);
>g20(42, "hello", true) : string[]
>g20 : (x: number, y?: string | undefined, z?: boolean | undefined) => string[]
>42 : 42
>"hello" : "hello"
>true : true
g20(42, "hello");
>g20(42, "hello") : string[]
>g20 : (x: number, y?: string | undefined, z?: boolean | undefined) => string[]
>42 : 42
>"hello" : "hello"
g20(42);
>g20(42) : string[]
>g20 : (x: number, y?: string | undefined, z?: boolean | undefined) => string[]
>42 : 42
g21("hello", true);
>g21("hello", true) : string[]
>g21 : (y?: string | undefined, z?: boolean | undefined) => string[]
>"hello" : "hello"
>true : true
g21("hello");
>g21("hello") : string[]
>g21 : (y?: string | undefined, z?: boolean | undefined) => string[]
>"hello" : "hello"
g21();
>g21() : string[]
>g21 : (y?: string | undefined, z?: boolean | undefined) => string[]
g22(true);
>g22(true) : string[]
>g22 : (z?: boolean | undefined) => string[]
>true : true
g22();
>g22() : string[]
>g22 : (z?: boolean | undefined) => string[]
g23();
>g23() : string[]
>g23 : () => string[]
declare function f30<T, U extends ((x: T) => any)[]>(x: T, ...args: U): U;
>f30 : <T, U extends ((x: T) => any)[]>(x: T, ...args: U) => U
>T : T
>U : U
>x : T
>T : T
>x : T
>T : T
>args : U
>U : U
>U : U
const c30 = f30(42, x => "" + x, x => x + 1); // [(x: number) => string, (x: number) => number]
>c30 : [(x: number) => string, (x: number) => number]
>f30(42, x => "" + x, x => x + 1) : [(x: number) => string, (x: number) => number]
>f30 : <T, U extends ((x: T) => any)[]>(x: T, ...args: U) => U
>42 : 42
>x => "" + x : (x: number) => string
>x : number
>"" + x : string
>"" : ""
>x : number
>x => x + 1 : (x: number) => number
>x : number
>x + 1 : number
>x : number
>1 : 1
type Parameters<T extends Function> = T extends ((...args: infer U) => any) | (new(...args: infer U) => any) ? U : any[];
>Parameters : Parameters<T>
>T : T
>Function : Function
>T : T
>args : U
>U : U
>args : U
>U : U
>U : U
type T01 = Parameters<(x: number, y: string, z: boolean) => void>;
>T01 : [number, string, boolean]
>Parameters : Parameters<T>
>x : number
>y : string
>z : boolean
type T02 = Parameters<(...args: [number, string, boolean]) => void>;
>T02 : [number, string, boolean]
>Parameters : Parameters<T>
>args : [number, string, boolean]
type T03 = Parameters<new (x: number, y: string, z: boolean) => void>;
>T03 : [number, string, boolean]
>Parameters : Parameters<T>
>x : number
>y : string
>z : boolean
type T04 = Parameters<new (...args: [number, string, boolean]) => void>;
>T04 : [number, string, boolean]
>Parameters : Parameters<T>
>args : [number, string, boolean]
type T05<T> = Parameters<(...args: T[]) => void>;
>T05 : T[]
>T : T
>Parameters : Parameters<T>
>args : T[]
>T : T
type T06<T> = Parameters<new (...args: []) => void>;
>T06 : []
>T : T
>Parameters : Parameters<T>
>args : []
type T07<T extends any[]> = Parameters<(...args: T) => void>;
>T07 : T
>T : T
>Parameters : Parameters<T>
>args : T
>T : T
type T08<T extends any[]> = Parameters<new (...args: T) => void>;
>T08 : T
>T : T
>Parameters : Parameters<T>
>args : T
>T : T
type T09 = Parameters<Function>;
>T09 : any[]
>Parameters : Parameters<T>
>Function : Function
type Record1 = {
>Record1 : Record1
move: [number, 'left' | 'right'];
>move : [number, "left" | "right"]
jump: [number, 'up' | 'down'];
>jump : [number, "up" | "down"]
stop: string;
>stop : string
done: [];
>done : []
}
type EventType<T> = {
>EventType : EventType<T>
>T : T
emit<K extends keyof T = keyof T>(e: K, ...payload: T[K] extends any[] ? T[K] : [T[K]]): void;
>emit : <K extends keyof T = keyof T>(e: K, ...payload: T[K] extends any[] ? T[K] : [T[K]]) => void
>K : K
>T : T
>T : T
>e : K
>K : K
>payload : T[K] extends any[] ? T[K] : [T[K]]
>T : T
>K : K
>T : T
>K : K
>T : T
>K : K
}
declare var events: EventType<Record1>;
>events : EventType<Record1>
>EventType : EventType<T>
>Record1 : Record1
events.emit('move', 10, 'left');
>events.emit('move', 10, 'left') : void
>events.emit : <K extends "move" | "jump" | "stop" | "done" = "move" | "jump" | "stop" | "done">(e: K, ...payload: Record1[K] extends any[] ? Record1[K] : [Record1[K]]) => void
>events : EventType<Record1>
>emit : <K extends "move" | "jump" | "stop" | "done" = "move" | "jump" | "stop" | "done">(e: K, ...payload: Record1[K] extends any[] ? Record1[K] : [Record1[K]]) => void
>'move' : "move"
>10 : 10
>'left' : "left"
events.emit('jump', 20, 'up');
>events.emit('jump', 20, 'up') : void
>events.emit : <K extends "move" | "jump" | "stop" | "done" = "move" | "jump" | "stop" | "done">(e: K, ...payload: Record1[K] extends any[] ? Record1[K] : [Record1[K]]) => void
>events : EventType<Record1>
>emit : <K extends "move" | "jump" | "stop" | "done" = "move" | "jump" | "stop" | "done">(e: K, ...payload: Record1[K] extends any[] ? Record1[K] : [Record1[K]]) => void
>'jump' : "jump"
>20 : 20
>'up' : "up"
events.emit('stop', 'Bye!');
>events.emit('stop', 'Bye!') : void
>events.emit : <K extends "move" | "jump" | "stop" | "done" = "move" | "jump" | "stop" | "done">(e: K, ...payload: Record1[K] extends any[] ? Record1[K] : [Record1[K]]) => void
>events : EventType<Record1>
>emit : <K extends "move" | "jump" | "stop" | "done" = "move" | "jump" | "stop" | "done">(e: K, ...payload: Record1[K] extends any[] ? Record1[K] : [Record1[K]]) => void
>'stop' : "stop"
>'Bye!' : "Bye!"
events.emit('done');
>events.emit('done') : void
>events.emit : <K extends "move" | "jump" | "stop" | "done" = "move" | "jump" | "stop" | "done">(e: K, ...payload: Record1[K] extends any[] ? Record1[K] : [Record1[K]]) => void
>events : EventType<Record1>
>emit : <K extends "move" | "jump" | "stop" | "done" = "move" | "jump" | "stop" | "done">(e: K, ...payload: Record1[K] extends any[] ? Record1[K] : [Record1[K]]) => void
>'done' : "done"
@@ -0,0 +1,158 @@
//// [genericRestParameters2.ts]
declare const t1: [number, string, ...boolean[]];
declare const t2: [string, ...boolean[]];
declare const t3: [...boolean[]];
declare const t4: [];
declare let f00: (...x: [number, string, boolean]) => void;
declare let f01: (a: number, ...x: [string, boolean]) => void;
declare let f02: (a: number, b: string, ...x: [boolean]) => void;
declare let f03: (a: number, b: string, c: boolean) => void;
declare let f04: (a: number, b: string, c: boolean, ...x: []) => void;
declare let f10: (...x: [number, string, ...boolean[]]) => void;
declare let f11: (a: number, ...x: [string, ...boolean[]]) => void;
declare let f12: (a: number, b: string, ...x: [...boolean[]]) => void;
declare let f13: (a: number, b: string, ...c: boolean[]) => void;
declare const ns: [number, string];
declare const sn: [string, number];
f10(42, "hello");
f10(42, "hello", true);
f10(42, "hello", true, false);
f10(t1[0], t1[1], t1[2], t1[3]);
f10(...t1);
f10(42, ...t2);
f10(42, "hello", ...t3);
f10(42, "hello", true, ...t4);
f10(42, "hello", true, ...t4, false, ...t3);
f11(42, "hello");
f11(42, "hello", true);
f11(42, "hello", true, false);
f11(t1[0], t1[1], t1[2], t1[3]);
f11(...t1);
f11(42, ...t2);
f11(42, "hello", ...t3);
f11(42, "hello", true, ...t4);
f11(42, "hello", true, ...t4, false, ...t3);
f12(42, "hello");
f12(42, "hello", true);
f12(42, "hello", true, false);
f12(t1[0], t1[1], t1[2], t1[3]);
f12(...t1);
f12(42, ...t2);
f12(42, "hello", ...t3);
f12(42, "hello", true, ...t4);
f12(42, "hello", true, ...t4, false, ...t3);
f13(42, "hello");
f13(42, "hello", true);
f13(42, "hello", true, false);
f13(t1[0], t1[1], t1[2], t1[3]);
f13(...t1);
f13(42, ...t2);
f13(42, "hello", ...t3);
f13(42, "hello", true, ...t4);
f13(42, "hello", true, ...t4, false, ...t3);
declare const f20: <T extends unknown[]>(...args: T) => T;
f20(...t1);
f20(42, ...t2);
f20(42, "hello", ...t3);
f20(42, "hello", ...t2, true);
type Parameters<T extends Function> = T extends ((...args: infer U) => any) | (new(...args: infer U) => any) ? U : any[];
type T01 = Parameters<(x: number, y: string, ...z: boolean[]) => void>;
type T02 = Parameters<(...args: [number, string, ...boolean[]]) => void>;
type T03 = Parameters<new (x: number, y: string, ...z: boolean[]) => void>;
type T04 = Parameters<new (...args: [number, string, ...boolean[]]) => void>;
type T05<T extends any[]> = Parameters<(x: string, ...args: T) => void>;
type T06 = T05<[number, ...boolean[]]>;
type P1<T extends Function> = T extends (head: infer A, ...tail: infer B) => any ? { head: A, tail: B } : any[];
type T10 = P1<(x: number, y: string, ...z: boolean[]) => void>;
type T11 = P1<(...z: number[]) => void>;
type T12 = P1<(x: number, y: number) => void>;
//// [genericRestParameters2.js]
"use strict";
f10(42, "hello");
f10(42, "hello", true);
f10(42, "hello", true, false);
f10(t1[0], t1[1], t1[2], t1[3]);
f10.apply(void 0, t1);
f10.apply(void 0, [42].concat(t2));
f10.apply(void 0, [42, "hello"].concat(t3));
f10.apply(void 0, [42, "hello", true].concat(t4));
f10.apply(void 0, [42, "hello", true].concat(t4, [false], t3));
f11(42, "hello");
f11(42, "hello", true);
f11(42, "hello", true, false);
f11(t1[0], t1[1], t1[2], t1[3]);
f11.apply(void 0, t1);
f11.apply(void 0, [42].concat(t2));
f11.apply(void 0, [42, "hello"].concat(t3));
f11.apply(void 0, [42, "hello", true].concat(t4));
f11.apply(void 0, [42, "hello", true].concat(t4, [false], t3));
f12(42, "hello");
f12(42, "hello", true);
f12(42, "hello", true, false);
f12(t1[0], t1[1], t1[2], t1[3]);
f12.apply(void 0, t1);
f12.apply(void 0, [42].concat(t2));
f12.apply(void 0, [42, "hello"].concat(t3));
f12.apply(void 0, [42, "hello", true].concat(t4));
f12.apply(void 0, [42, "hello", true].concat(t4, [false], t3));
f13(42, "hello");
f13(42, "hello", true);
f13(42, "hello", true, false);
f13(t1[0], t1[1], t1[2], t1[3]);
f13.apply(void 0, t1);
f13.apply(void 0, [42].concat(t2));
f13.apply(void 0, [42, "hello"].concat(t3));
f13.apply(void 0, [42, "hello", true].concat(t4));
f13.apply(void 0, [42, "hello", true].concat(t4, [false], t3));
f20.apply(void 0, t1);
f20.apply(void 0, [42].concat(t2));
f20.apply(void 0, [42, "hello"].concat(t3));
f20.apply(void 0, [42, "hello"].concat(t2, [true]));
//// [genericRestParameters2.d.ts]
declare const t1: [number, string, ...boolean[]];
declare const t2: [string, ...boolean[]];
declare const t3: [...boolean[]];
declare const t4: [];
declare let f00: (...x: [number, string, boolean]) => void;
declare let f01: (a: number, ...x: [string, boolean]) => void;
declare let f02: (a: number, b: string, ...x: [boolean]) => void;
declare let f03: (a: number, b: string, c: boolean) => void;
declare let f04: (a: number, b: string, c: boolean, ...x: []) => void;
declare let f10: (...x: [number, string, ...boolean[]]) => void;
declare let f11: (a: number, ...x: [string, ...boolean[]]) => void;
declare let f12: (a: number, b: string, ...x: [...boolean[]]) => void;
declare let f13: (a: number, b: string, ...c: boolean[]) => void;
declare const ns: [number, string];
declare const sn: [string, number];
declare const f20: <T extends unknown[]>(...args: T) => T;
declare type Parameters<T extends Function> = T extends ((...args: infer U) => any) | (new (...args: infer U) => any) ? U : any[];
declare type T01 = Parameters<(x: number, y: string, ...z: boolean[]) => void>;
declare type T02 = Parameters<(...args: [number, string, ...boolean[]]) => void>;
declare type T03 = Parameters<new (x: number, y: string, ...z: boolean[]) => void>;
declare type T04 = Parameters<new (...args: [number, string, ...boolean[]]) => void>;
declare type T05<T extends any[]> = Parameters<(x: string, ...args: T) => void>;
declare type T06 = T05<[number, ...boolean[]]>;
declare type P1<T extends Function> = T extends (head: infer A, ...tail: infer B) => any ? {
head: A;
tail: B;
} : any[];
declare type T10 = P1<(x: number, y: string, ...z: boolean[]) => void>;
declare type T11 = P1<(...z: number[]) => void>;
declare type T12 = P1<(x: number, y: number) => void>;
@@ -0,0 +1,326 @@
=== tests/cases/conformance/types/rest/genericRestParameters2.ts ===
declare const t1: [number, string, ...boolean[]];
>t1 : Symbol(t1, Decl(genericRestParameters2.ts, 0, 13))
declare const t2: [string, ...boolean[]];
>t2 : Symbol(t2, Decl(genericRestParameters2.ts, 1, 13))
declare const t3: [...boolean[]];
>t3 : Symbol(t3, Decl(genericRestParameters2.ts, 2, 13))
declare const t4: [];
>t4 : Symbol(t4, Decl(genericRestParameters2.ts, 3, 13))
declare let f00: (...x: [number, string, boolean]) => void;
>f00 : Symbol(f00, Decl(genericRestParameters2.ts, 5, 11))
>x : Symbol(x, Decl(genericRestParameters2.ts, 5, 18))
declare let f01: (a: number, ...x: [string, boolean]) => void;
>f01 : Symbol(f01, Decl(genericRestParameters2.ts, 6, 11))
>a : Symbol(a, Decl(genericRestParameters2.ts, 6, 18))
>x : Symbol(x, Decl(genericRestParameters2.ts, 6, 28))
declare let f02: (a: number, b: string, ...x: [boolean]) => void;
>f02 : Symbol(f02, Decl(genericRestParameters2.ts, 7, 11))
>a : Symbol(a, Decl(genericRestParameters2.ts, 7, 18))
>b : Symbol(b, Decl(genericRestParameters2.ts, 7, 28))
>x : Symbol(x, Decl(genericRestParameters2.ts, 7, 39))
declare let f03: (a: number, b: string, c: boolean) => void;
>f03 : Symbol(f03, Decl(genericRestParameters2.ts, 8, 11))
>a : Symbol(a, Decl(genericRestParameters2.ts, 8, 18))
>b : Symbol(b, Decl(genericRestParameters2.ts, 8, 28))
>c : Symbol(c, Decl(genericRestParameters2.ts, 8, 39))
declare let f04: (a: number, b: string, c: boolean, ...x: []) => void;
>f04 : Symbol(f04, Decl(genericRestParameters2.ts, 9, 11))
>a : Symbol(a, Decl(genericRestParameters2.ts, 9, 18))
>b : Symbol(b, Decl(genericRestParameters2.ts, 9, 28))
>c : Symbol(c, Decl(genericRestParameters2.ts, 9, 39))
>x : Symbol(x, Decl(genericRestParameters2.ts, 9, 51))
declare let f10: (...x: [number, string, ...boolean[]]) => void;
>f10 : Symbol(f10, Decl(genericRestParameters2.ts, 11, 11))
>x : Symbol(x, Decl(genericRestParameters2.ts, 11, 18))
declare let f11: (a: number, ...x: [string, ...boolean[]]) => void;
>f11 : Symbol(f11, Decl(genericRestParameters2.ts, 12, 11))
>a : Symbol(a, Decl(genericRestParameters2.ts, 12, 18))
>x : Symbol(x, Decl(genericRestParameters2.ts, 12, 28))
declare let f12: (a: number, b: string, ...x: [...boolean[]]) => void;
>f12 : Symbol(f12, Decl(genericRestParameters2.ts, 13, 11))
>a : Symbol(a, Decl(genericRestParameters2.ts, 13, 18))
>b : Symbol(b, Decl(genericRestParameters2.ts, 13, 28))
>x : Symbol(x, Decl(genericRestParameters2.ts, 13, 39))
declare let f13: (a: number, b: string, ...c: boolean[]) => void;
>f13 : Symbol(f13, Decl(genericRestParameters2.ts, 14, 11))
>a : Symbol(a, Decl(genericRestParameters2.ts, 14, 18))
>b : Symbol(b, Decl(genericRestParameters2.ts, 14, 28))
>c : Symbol(c, Decl(genericRestParameters2.ts, 14, 39))
declare const ns: [number, string];
>ns : Symbol(ns, Decl(genericRestParameters2.ts, 16, 13))
declare const sn: [string, number];
>sn : Symbol(sn, Decl(genericRestParameters2.ts, 17, 13))
f10(42, "hello");
>f10 : Symbol(f10, Decl(genericRestParameters2.ts, 11, 11))
f10(42, "hello", true);
>f10 : Symbol(f10, Decl(genericRestParameters2.ts, 11, 11))
f10(42, "hello", true, false);
>f10 : Symbol(f10, Decl(genericRestParameters2.ts, 11, 11))
f10(t1[0], t1[1], t1[2], t1[3]);
>f10 : Symbol(f10, Decl(genericRestParameters2.ts, 11, 11))
>t1 : Symbol(t1, Decl(genericRestParameters2.ts, 0, 13))
>0 : Symbol(0)
>t1 : Symbol(t1, Decl(genericRestParameters2.ts, 0, 13))
>1 : Symbol(1)
>t1 : Symbol(t1, Decl(genericRestParameters2.ts, 0, 13))
>t1 : Symbol(t1, Decl(genericRestParameters2.ts, 0, 13))
f10(...t1);
>f10 : Symbol(f10, Decl(genericRestParameters2.ts, 11, 11))
>t1 : Symbol(t1, Decl(genericRestParameters2.ts, 0, 13))
f10(42, ...t2);
>f10 : Symbol(f10, Decl(genericRestParameters2.ts, 11, 11))
>t2 : Symbol(t2, Decl(genericRestParameters2.ts, 1, 13))
f10(42, "hello", ...t3);
>f10 : Symbol(f10, Decl(genericRestParameters2.ts, 11, 11))
>t3 : Symbol(t3, Decl(genericRestParameters2.ts, 2, 13))
f10(42, "hello", true, ...t4);
>f10 : Symbol(f10, Decl(genericRestParameters2.ts, 11, 11))
>t4 : Symbol(t4, Decl(genericRestParameters2.ts, 3, 13))
f10(42, "hello", true, ...t4, false, ...t3);
>f10 : Symbol(f10, Decl(genericRestParameters2.ts, 11, 11))
>t4 : Symbol(t4, Decl(genericRestParameters2.ts, 3, 13))
>t3 : Symbol(t3, Decl(genericRestParameters2.ts, 2, 13))
f11(42, "hello");
>f11 : Symbol(f11, Decl(genericRestParameters2.ts, 12, 11))
f11(42, "hello", true);
>f11 : Symbol(f11, Decl(genericRestParameters2.ts, 12, 11))
f11(42, "hello", true, false);
>f11 : Symbol(f11, Decl(genericRestParameters2.ts, 12, 11))
f11(t1[0], t1[1], t1[2], t1[3]);
>f11 : Symbol(f11, Decl(genericRestParameters2.ts, 12, 11))
>t1 : Symbol(t1, Decl(genericRestParameters2.ts, 0, 13))
>0 : Symbol(0)
>t1 : Symbol(t1, Decl(genericRestParameters2.ts, 0, 13))
>1 : Symbol(1)
>t1 : Symbol(t1, Decl(genericRestParameters2.ts, 0, 13))
>t1 : Symbol(t1, Decl(genericRestParameters2.ts, 0, 13))
f11(...t1);
>f11 : Symbol(f11, Decl(genericRestParameters2.ts, 12, 11))
>t1 : Symbol(t1, Decl(genericRestParameters2.ts, 0, 13))
f11(42, ...t2);
>f11 : Symbol(f11, Decl(genericRestParameters2.ts, 12, 11))
>t2 : Symbol(t2, Decl(genericRestParameters2.ts, 1, 13))
f11(42, "hello", ...t3);
>f11 : Symbol(f11, Decl(genericRestParameters2.ts, 12, 11))
>t3 : Symbol(t3, Decl(genericRestParameters2.ts, 2, 13))
f11(42, "hello", true, ...t4);
>f11 : Symbol(f11, Decl(genericRestParameters2.ts, 12, 11))
>t4 : Symbol(t4, Decl(genericRestParameters2.ts, 3, 13))
f11(42, "hello", true, ...t4, false, ...t3);
>f11 : Symbol(f11, Decl(genericRestParameters2.ts, 12, 11))
>t4 : Symbol(t4, Decl(genericRestParameters2.ts, 3, 13))
>t3 : Symbol(t3, Decl(genericRestParameters2.ts, 2, 13))
f12(42, "hello");
>f12 : Symbol(f12, Decl(genericRestParameters2.ts, 13, 11))
f12(42, "hello", true);
>f12 : Symbol(f12, Decl(genericRestParameters2.ts, 13, 11))
f12(42, "hello", true, false);
>f12 : Symbol(f12, Decl(genericRestParameters2.ts, 13, 11))
f12(t1[0], t1[1], t1[2], t1[3]);
>f12 : Symbol(f12, Decl(genericRestParameters2.ts, 13, 11))
>t1 : Symbol(t1, Decl(genericRestParameters2.ts, 0, 13))
>0 : Symbol(0)
>t1 : Symbol(t1, Decl(genericRestParameters2.ts, 0, 13))
>1 : Symbol(1)
>t1 : Symbol(t1, Decl(genericRestParameters2.ts, 0, 13))
>t1 : Symbol(t1, Decl(genericRestParameters2.ts, 0, 13))
f12(...t1);
>f12 : Symbol(f12, Decl(genericRestParameters2.ts, 13, 11))
>t1 : Symbol(t1, Decl(genericRestParameters2.ts, 0, 13))
f12(42, ...t2);
>f12 : Symbol(f12, Decl(genericRestParameters2.ts, 13, 11))
>t2 : Symbol(t2, Decl(genericRestParameters2.ts, 1, 13))
f12(42, "hello", ...t3);
>f12 : Symbol(f12, Decl(genericRestParameters2.ts, 13, 11))
>t3 : Symbol(t3, Decl(genericRestParameters2.ts, 2, 13))
f12(42, "hello", true, ...t4);
>f12 : Symbol(f12, Decl(genericRestParameters2.ts, 13, 11))
>t4 : Symbol(t4, Decl(genericRestParameters2.ts, 3, 13))
f12(42, "hello", true, ...t4, false, ...t3);
>f12 : Symbol(f12, Decl(genericRestParameters2.ts, 13, 11))
>t4 : Symbol(t4, Decl(genericRestParameters2.ts, 3, 13))
>t3 : Symbol(t3, Decl(genericRestParameters2.ts, 2, 13))
f13(42, "hello");
>f13 : Symbol(f13, Decl(genericRestParameters2.ts, 14, 11))
f13(42, "hello", true);
>f13 : Symbol(f13, Decl(genericRestParameters2.ts, 14, 11))
f13(42, "hello", true, false);
>f13 : Symbol(f13, Decl(genericRestParameters2.ts, 14, 11))
f13(t1[0], t1[1], t1[2], t1[3]);
>f13 : Symbol(f13, Decl(genericRestParameters2.ts, 14, 11))
>t1 : Symbol(t1, Decl(genericRestParameters2.ts, 0, 13))
>0 : Symbol(0)
>t1 : Symbol(t1, Decl(genericRestParameters2.ts, 0, 13))
>1 : Symbol(1)
>t1 : Symbol(t1, Decl(genericRestParameters2.ts, 0, 13))
>t1 : Symbol(t1, Decl(genericRestParameters2.ts, 0, 13))
f13(...t1);
>f13 : Symbol(f13, Decl(genericRestParameters2.ts, 14, 11))
>t1 : Symbol(t1, Decl(genericRestParameters2.ts, 0, 13))
f13(42, ...t2);
>f13 : Symbol(f13, Decl(genericRestParameters2.ts, 14, 11))
>t2 : Symbol(t2, Decl(genericRestParameters2.ts, 1, 13))
f13(42, "hello", ...t3);
>f13 : Symbol(f13, Decl(genericRestParameters2.ts, 14, 11))
>t3 : Symbol(t3, Decl(genericRestParameters2.ts, 2, 13))
f13(42, "hello", true, ...t4);
>f13 : Symbol(f13, Decl(genericRestParameters2.ts, 14, 11))
>t4 : Symbol(t4, Decl(genericRestParameters2.ts, 3, 13))
f13(42, "hello", true, ...t4, false, ...t3);
>f13 : Symbol(f13, Decl(genericRestParameters2.ts, 14, 11))
>t4 : Symbol(t4, Decl(genericRestParameters2.ts, 3, 13))
>t3 : Symbol(t3, Decl(genericRestParameters2.ts, 2, 13))
declare const f20: <T extends unknown[]>(...args: T) => T;
>f20 : Symbol(f20, Decl(genericRestParameters2.ts, 59, 13))
>T : Symbol(T, Decl(genericRestParameters2.ts, 59, 20))
>args : Symbol(args, Decl(genericRestParameters2.ts, 59, 41))
>T : Symbol(T, Decl(genericRestParameters2.ts, 59, 20))
>T : Symbol(T, Decl(genericRestParameters2.ts, 59, 20))
f20(...t1);
>f20 : Symbol(f20, Decl(genericRestParameters2.ts, 59, 13))
>t1 : Symbol(t1, Decl(genericRestParameters2.ts, 0, 13))
f20(42, ...t2);
>f20 : Symbol(f20, Decl(genericRestParameters2.ts, 59, 13))
>t2 : Symbol(t2, Decl(genericRestParameters2.ts, 1, 13))
f20(42, "hello", ...t3);
>f20 : Symbol(f20, Decl(genericRestParameters2.ts, 59, 13))
>t3 : Symbol(t3, Decl(genericRestParameters2.ts, 2, 13))
f20(42, "hello", ...t2, true);
>f20 : Symbol(f20, Decl(genericRestParameters2.ts, 59, 13))
>t2 : Symbol(t2, Decl(genericRestParameters2.ts, 1, 13))
type Parameters<T extends Function> = T extends ((...args: infer U) => any) | (new(...args: infer U) => any) ? U : any[];
>Parameters : Symbol(Parameters, Decl(genericRestParameters2.ts, 64, 30))
>T : Symbol(T, Decl(genericRestParameters2.ts, 66, 16))
>Function : Symbol(Function, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --))
>T : Symbol(T, Decl(genericRestParameters2.ts, 66, 16))
>args : Symbol(args, Decl(genericRestParameters2.ts, 66, 50))
>U : Symbol(U, Decl(genericRestParameters2.ts, 66, 64), Decl(genericRestParameters2.ts, 66, 97))
>args : Symbol(args, Decl(genericRestParameters2.ts, 66, 83))
>U : Symbol(U, Decl(genericRestParameters2.ts, 66, 64), Decl(genericRestParameters2.ts, 66, 97))
>U : Symbol(U, Decl(genericRestParameters2.ts, 66, 64), Decl(genericRestParameters2.ts, 66, 97))
type T01 = Parameters<(x: number, y: string, ...z: boolean[]) => void>;
>T01 : Symbol(T01, Decl(genericRestParameters2.ts, 66, 121))
>Parameters : Symbol(Parameters, Decl(genericRestParameters2.ts, 64, 30))
>x : Symbol(x, Decl(genericRestParameters2.ts, 68, 23))
>y : Symbol(y, Decl(genericRestParameters2.ts, 68, 33))
>z : Symbol(z, Decl(genericRestParameters2.ts, 68, 44))
type T02 = Parameters<(...args: [number, string, ...boolean[]]) => void>;
>T02 : Symbol(T02, Decl(genericRestParameters2.ts, 68, 71))
>Parameters : Symbol(Parameters, Decl(genericRestParameters2.ts, 64, 30))
>args : Symbol(args, Decl(genericRestParameters2.ts, 69, 23))
type T03 = Parameters<new (x: number, y: string, ...z: boolean[]) => void>;
>T03 : Symbol(T03, Decl(genericRestParameters2.ts, 69, 73))
>Parameters : Symbol(Parameters, Decl(genericRestParameters2.ts, 64, 30))
>x : Symbol(x, Decl(genericRestParameters2.ts, 70, 27))
>y : Symbol(y, Decl(genericRestParameters2.ts, 70, 37))
>z : Symbol(z, Decl(genericRestParameters2.ts, 70, 48))
type T04 = Parameters<new (...args: [number, string, ...boolean[]]) => void>;
>T04 : Symbol(T04, Decl(genericRestParameters2.ts, 70, 75))
>Parameters : Symbol(Parameters, Decl(genericRestParameters2.ts, 64, 30))
>args : Symbol(args, Decl(genericRestParameters2.ts, 71, 27))
type T05<T extends any[]> = Parameters<(x: string, ...args: T) => void>;
>T05 : Symbol(T05, Decl(genericRestParameters2.ts, 71, 77))
>T : Symbol(T, Decl(genericRestParameters2.ts, 72, 9))
>Parameters : Symbol(Parameters, Decl(genericRestParameters2.ts, 64, 30))
>x : Symbol(x, Decl(genericRestParameters2.ts, 72, 40))
>args : Symbol(args, Decl(genericRestParameters2.ts, 72, 50))
>T : Symbol(T, Decl(genericRestParameters2.ts, 72, 9))
type T06 = T05<[number, ...boolean[]]>;
>T06 : Symbol(T06, Decl(genericRestParameters2.ts, 72, 72))
>T05 : Symbol(T05, Decl(genericRestParameters2.ts, 71, 77))
type P1<T extends Function> = T extends (head: infer A, ...tail: infer B) => any ? { head: A, tail: B } : any[];
>P1 : Symbol(P1, Decl(genericRestParameters2.ts, 73, 39))
>T : Symbol(T, Decl(genericRestParameters2.ts, 75, 8))
>Function : Symbol(Function, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --))
>T : Symbol(T, Decl(genericRestParameters2.ts, 75, 8))
>head : Symbol(head, Decl(genericRestParameters2.ts, 75, 41))
>A : Symbol(A, Decl(genericRestParameters2.ts, 75, 52))
>tail : Symbol(tail, Decl(genericRestParameters2.ts, 75, 55))
>B : Symbol(B, Decl(genericRestParameters2.ts, 75, 70))
>head : Symbol(head, Decl(genericRestParameters2.ts, 75, 84))
>A : Symbol(A, Decl(genericRestParameters2.ts, 75, 52))
>tail : Symbol(tail, Decl(genericRestParameters2.ts, 75, 93))
>B : Symbol(B, Decl(genericRestParameters2.ts, 75, 70))
type T10 = P1<(x: number, y: string, ...z: boolean[]) => void>;
>T10 : Symbol(T10, Decl(genericRestParameters2.ts, 75, 112))
>P1 : Symbol(P1, Decl(genericRestParameters2.ts, 73, 39))
>x : Symbol(x, Decl(genericRestParameters2.ts, 77, 15))
>y : Symbol(y, Decl(genericRestParameters2.ts, 77, 25))
>z : Symbol(z, Decl(genericRestParameters2.ts, 77, 36))
type T11 = P1<(...z: number[]) => void>;
>T11 : Symbol(T11, Decl(genericRestParameters2.ts, 77, 63))
>P1 : Symbol(P1, Decl(genericRestParameters2.ts, 73, 39))
>z : Symbol(z, Decl(genericRestParameters2.ts, 78, 15))
type T12 = P1<(x: number, y: number) => void>;
>T12 : Symbol(T12, Decl(genericRestParameters2.ts, 78, 40))
>P1 : Symbol(P1, Decl(genericRestParameters2.ts, 73, 39))
>x : Symbol(x, Decl(genericRestParameters2.ts, 79, 15))
>y : Symbol(y, Decl(genericRestParameters2.ts, 79, 25))
@@ -0,0 +1,500 @@
=== tests/cases/conformance/types/rest/genericRestParameters2.ts ===
declare const t1: [number, string, ...boolean[]];
>t1 : [number, string, ...boolean[]]
declare const t2: [string, ...boolean[]];
>t2 : [string, ...boolean[]]
declare const t3: [...boolean[]];
>t3 : boolean[]
declare const t4: [];
>t4 : []
declare let f00: (...x: [number, string, boolean]) => void;
>f00 : (x_0: number, x_1: string, x_2: boolean) => void
>x : [number, string, boolean]
declare let f01: (a: number, ...x: [string, boolean]) => void;
>f01 : (a: number, x_0: string, x_1: boolean) => void
>a : number
>x : [string, boolean]
declare let f02: (a: number, b: string, ...x: [boolean]) => void;
>f02 : (a: number, b: string, x_0: boolean) => void
>a : number
>b : string
>x : [boolean]
declare let f03: (a: number, b: string, c: boolean) => void;
>f03 : (a: number, b: string, c: boolean) => void
>a : number
>b : string
>c : boolean
declare let f04: (a: number, b: string, c: boolean, ...x: []) => void;
>f04 : (a: number, b: string, c: boolean) => void
>a : number
>b : string
>c : boolean
>x : []
declare let f10: (...x: [number, string, ...boolean[]]) => void;
>f10 : (x_0: number, x_1: string, ...x_2: boolean[]) => void
>x : [number, string, ...boolean[]]
declare let f11: (a: number, ...x: [string, ...boolean[]]) => void;
>f11 : (a: number, x_0: string, ...x_1: boolean[]) => void
>a : number
>x : [string, ...boolean[]]
declare let f12: (a: number, b: string, ...x: [...boolean[]]) => void;
>f12 : (a: number, b: string, ...x: boolean[]) => void
>a : number
>b : string
>x : boolean[]
declare let f13: (a: number, b: string, ...c: boolean[]) => void;
>f13 : (a: number, b: string, ...c: boolean[]) => void
>a : number
>b : string
>c : boolean[]
declare const ns: [number, string];
>ns : [number, string]
declare const sn: [string, number];
>sn : [string, number]
f10(42, "hello");
>f10(42, "hello") : void
>f10 : (x_0: number, x_1: string, ...x_2: boolean[]) => void
>42 : 42
>"hello" : "hello"
f10(42, "hello", true);
>f10(42, "hello", true) : void
>f10 : (x_0: number, x_1: string, ...x_2: boolean[]) => void
>42 : 42
>"hello" : "hello"
>true : true
f10(42, "hello", true, false);
>f10(42, "hello", true, false) : void
>f10 : (x_0: number, x_1: string, ...x_2: boolean[]) => void
>42 : 42
>"hello" : "hello"
>true : true
>false : false
f10(t1[0], t1[1], t1[2], t1[3]);
>f10(t1[0], t1[1], t1[2], t1[3]) : void
>f10 : (x_0: number, x_1: string, ...x_2: boolean[]) => void
>t1[0] : number
>t1 : [number, string, ...boolean[]]
>0 : 0
>t1[1] : string
>t1 : [number, string, ...boolean[]]
>1 : 1
>t1[2] : boolean
>t1 : [number, string, ...boolean[]]
>2 : 2
>t1[3] : boolean
>t1 : [number, string, ...boolean[]]
>3 : 3
f10(...t1);
>f10(...t1) : void
>f10 : (x_0: number, x_1: string, ...x_2: boolean[]) => void
>...t1 : string | number | boolean
>t1 : [number, string, ...boolean[]]
f10(42, ...t2);
>f10(42, ...t2) : void
>f10 : (x_0: number, x_1: string, ...x_2: boolean[]) => void
>42 : 42
>...t2 : string | boolean
>t2 : [string, ...boolean[]]
f10(42, "hello", ...t3);
>f10(42, "hello", ...t3) : void
>f10 : (x_0: number, x_1: string, ...x_2: boolean[]) => void
>42 : 42
>"hello" : "hello"
>...t3 : boolean
>t3 : boolean[]
f10(42, "hello", true, ...t4);
>f10(42, "hello", true, ...t4) : void
>f10 : (x_0: number, x_1: string, ...x_2: boolean[]) => void
>42 : 42
>"hello" : "hello"
>true : true
>...t4 : never
>t4 : []
f10(42, "hello", true, ...t4, false, ...t3);
>f10(42, "hello", true, ...t4, false, ...t3) : void
>f10 : (x_0: number, x_1: string, ...x_2: boolean[]) => void
>42 : 42
>"hello" : "hello"
>true : true
>...t4 : never
>t4 : []
>false : false
>...t3 : boolean
>t3 : boolean[]
f11(42, "hello");
>f11(42, "hello") : void
>f11 : (a: number, x_0: string, ...x_1: boolean[]) => void
>42 : 42
>"hello" : "hello"
f11(42, "hello", true);
>f11(42, "hello", true) : void
>f11 : (a: number, x_0: string, ...x_1: boolean[]) => void
>42 : 42
>"hello" : "hello"
>true : true
f11(42, "hello", true, false);
>f11(42, "hello", true, false) : void
>f11 : (a: number, x_0: string, ...x_1: boolean[]) => void
>42 : 42
>"hello" : "hello"
>true : true
>false : false
f11(t1[0], t1[1], t1[2], t1[3]);
>f11(t1[0], t1[1], t1[2], t1[3]) : void
>f11 : (a: number, x_0: string, ...x_1: boolean[]) => void
>t1[0] : number
>t1 : [number, string, ...boolean[]]
>0 : 0
>t1[1] : string
>t1 : [number, string, ...boolean[]]
>1 : 1
>t1[2] : boolean
>t1 : [number, string, ...boolean[]]
>2 : 2
>t1[3] : boolean
>t1 : [number, string, ...boolean[]]
>3 : 3
f11(...t1);
>f11(...t1) : void
>f11 : (a: number, x_0: string, ...x_1: boolean[]) => void
>...t1 : string | number | boolean
>t1 : [number, string, ...boolean[]]
f11(42, ...t2);
>f11(42, ...t2) : void
>f11 : (a: number, x_0: string, ...x_1: boolean[]) => void
>42 : 42
>...t2 : string | boolean
>t2 : [string, ...boolean[]]
f11(42, "hello", ...t3);
>f11(42, "hello", ...t3) : void
>f11 : (a: number, x_0: string, ...x_1: boolean[]) => void
>42 : 42
>"hello" : "hello"
>...t3 : boolean
>t3 : boolean[]
f11(42, "hello", true, ...t4);
>f11(42, "hello", true, ...t4) : void
>f11 : (a: number, x_0: string, ...x_1: boolean[]) => void
>42 : 42
>"hello" : "hello"
>true : true
>...t4 : never
>t4 : []
f11(42, "hello", true, ...t4, false, ...t3);
>f11(42, "hello", true, ...t4, false, ...t3) : void
>f11 : (a: number, x_0: string, ...x_1: boolean[]) => void
>42 : 42
>"hello" : "hello"
>true : true
>...t4 : never
>t4 : []
>false : false
>...t3 : boolean
>t3 : boolean[]
f12(42, "hello");
>f12(42, "hello") : void
>f12 : (a: number, b: string, ...x: boolean[]) => void
>42 : 42
>"hello" : "hello"
f12(42, "hello", true);
>f12(42, "hello", true) : void
>f12 : (a: number, b: string, ...x: boolean[]) => void
>42 : 42
>"hello" : "hello"
>true : true
f12(42, "hello", true, false);
>f12(42, "hello", true, false) : void
>f12 : (a: number, b: string, ...x: boolean[]) => void
>42 : 42
>"hello" : "hello"
>true : true
>false : false
f12(t1[0], t1[1], t1[2], t1[3]);
>f12(t1[0], t1[1], t1[2], t1[3]) : void
>f12 : (a: number, b: string, ...x: boolean[]) => void
>t1[0] : number
>t1 : [number, string, ...boolean[]]
>0 : 0
>t1[1] : string
>t1 : [number, string, ...boolean[]]
>1 : 1
>t1[2] : boolean
>t1 : [number, string, ...boolean[]]
>2 : 2
>t1[3] : boolean
>t1 : [number, string, ...boolean[]]
>3 : 3
f12(...t1);
>f12(...t1) : void
>f12 : (a: number, b: string, ...x: boolean[]) => void
>...t1 : string | number | boolean
>t1 : [number, string, ...boolean[]]
f12(42, ...t2);
>f12(42, ...t2) : void
>f12 : (a: number, b: string, ...x: boolean[]) => void
>42 : 42
>...t2 : string | boolean
>t2 : [string, ...boolean[]]
f12(42, "hello", ...t3);
>f12(42, "hello", ...t3) : void
>f12 : (a: number, b: string, ...x: boolean[]) => void
>42 : 42
>"hello" : "hello"
>...t3 : boolean
>t3 : boolean[]
f12(42, "hello", true, ...t4);
>f12(42, "hello", true, ...t4) : void
>f12 : (a: number, b: string, ...x: boolean[]) => void
>42 : 42
>"hello" : "hello"
>true : true
>...t4 : never
>t4 : []
f12(42, "hello", true, ...t4, false, ...t3);
>f12(42, "hello", true, ...t4, false, ...t3) : void
>f12 : (a: number, b: string, ...x: boolean[]) => void
>42 : 42
>"hello" : "hello"
>true : true
>...t4 : never
>t4 : []
>false : false
>...t3 : boolean
>t3 : boolean[]
f13(42, "hello");
>f13(42, "hello") : void
>f13 : (a: number, b: string, ...c: boolean[]) => void
>42 : 42
>"hello" : "hello"
f13(42, "hello", true);
>f13(42, "hello", true) : void
>f13 : (a: number, b: string, ...c: boolean[]) => void
>42 : 42
>"hello" : "hello"
>true : true
f13(42, "hello", true, false);
>f13(42, "hello", true, false) : void
>f13 : (a: number, b: string, ...c: boolean[]) => void
>42 : 42
>"hello" : "hello"
>true : true
>false : false
f13(t1[0], t1[1], t1[2], t1[3]);
>f13(t1[0], t1[1], t1[2], t1[3]) : void
>f13 : (a: number, b: string, ...c: boolean[]) => void
>t1[0] : number
>t1 : [number, string, ...boolean[]]
>0 : 0
>t1[1] : string
>t1 : [number, string, ...boolean[]]
>1 : 1
>t1[2] : boolean
>t1 : [number, string, ...boolean[]]
>2 : 2
>t1[3] : boolean
>t1 : [number, string, ...boolean[]]
>3 : 3
f13(...t1);
>f13(...t1) : void
>f13 : (a: number, b: string, ...c: boolean[]) => void
>...t1 : string | number | boolean
>t1 : [number, string, ...boolean[]]
f13(42, ...t2);
>f13(42, ...t2) : void
>f13 : (a: number, b: string, ...c: boolean[]) => void
>42 : 42
>...t2 : string | boolean
>t2 : [string, ...boolean[]]
f13(42, "hello", ...t3);
>f13(42, "hello", ...t3) : void
>f13 : (a: number, b: string, ...c: boolean[]) => void
>42 : 42
>"hello" : "hello"
>...t3 : boolean
>t3 : boolean[]
f13(42, "hello", true, ...t4);
>f13(42, "hello", true, ...t4) : void
>f13 : (a: number, b: string, ...c: boolean[]) => void
>42 : 42
>"hello" : "hello"
>true : true
>...t4 : never
>t4 : []
f13(42, "hello", true, ...t4, false, ...t3);
>f13(42, "hello", true, ...t4, false, ...t3) : void
>f13 : (a: number, b: string, ...c: boolean[]) => void
>42 : 42
>"hello" : "hello"
>true : true
>...t4 : never
>t4 : []
>false : false
>...t3 : boolean
>t3 : boolean[]
declare const f20: <T extends unknown[]>(...args: T) => T;
>f20 : <T extends unknown[]>(...args: T) => T
>T : T
>args : T
>T : T
>T : T
f20(...t1);
>f20(...t1) : [number, string, ...boolean[]]
>f20 : <T extends unknown[]>(...args: T) => T
>...t1 : string | number | boolean
>t1 : [number, string, ...boolean[]]
f20(42, ...t2);
>f20(42, ...t2) : [number, string, ...boolean[]]
>f20 : <T extends unknown[]>(...args: T) => T
>42 : 42
>...t2 : string | boolean
>t2 : [string, ...boolean[]]
f20(42, "hello", ...t3);
>f20(42, "hello", ...t3) : [number, string, ...boolean[]]
>f20 : <T extends unknown[]>(...args: T) => T
>42 : 42
>"hello" : "hello"
>...t3 : boolean
>t3 : boolean[]
f20(42, "hello", ...t2, true);
>f20(42, "hello", ...t2, true) : [number, string, ...(string | boolean)[]]
>f20 : <T extends unknown[]>(...args: T) => T
>42 : 42
>"hello" : "hello"
>...t2 : string | boolean
>t2 : [string, ...boolean[]]
>true : true
type Parameters<T extends Function> = T extends ((...args: infer U) => any) | (new(...args: infer U) => any) ? U : any[];
>Parameters : Parameters<T>
>T : T
>Function : Function
>T : T
>args : U
>U : U
>args : U
>U : U
>U : U
type T01 = Parameters<(x: number, y: string, ...z: boolean[]) => void>;
>T01 : [number, string, ...boolean[]]
>Parameters : Parameters<T>
>x : number
>y : string
>z : boolean[]
type T02 = Parameters<(...args: [number, string, ...boolean[]]) => void>;
>T02 : [number, string, ...boolean[]]
>Parameters : Parameters<T>
>args : [number, string, ...boolean[]]
type T03 = Parameters<new (x: number, y: string, ...z: boolean[]) => void>;
>T03 : [number, string, ...boolean[]]
>Parameters : Parameters<T>
>x : number
>y : string
>z : boolean[]
type T04 = Parameters<new (...args: [number, string, ...boolean[]]) => void>;
>T04 : [number, string, ...boolean[]]
>Parameters : Parameters<T>
>args : [number, string, ...boolean[]]
type T05<T extends any[]> = Parameters<(x: string, ...args: T) => void>;
>T05 : Parameters<(x: string, ...args: T) => void>
>T : T
>Parameters : Parameters<T>
>x : string
>args : T
>T : T
type T06 = T05<[number, ...boolean[]]>;
>T06 : [string, number, ...boolean[]]
>T05 : Parameters<(x: string, ...args: T) => void>
type P1<T extends Function> = T extends (head: infer A, ...tail: infer B) => any ? { head: A, tail: B } : any[];
>P1 : P1<T>
>T : T
>Function : Function
>T : T
>head : A
>A : A
>tail : B
>B : B
>head : A
>A : A
>tail : B
>B : B
type T10 = P1<(x: number, y: string, ...z: boolean[]) => void>;
>T10 : { head: number; tail: [string, ...boolean[]]; }
>P1 : P1<T>
>x : number
>y : string
>z : boolean[]
type T11 = P1<(...z: number[]) => void>;
>T11 : { head: number; tail: number[]; }
>P1 : P1<T>
>z : number[]
type T12 = P1<(x: number, y: number) => void>;
>T12 : { head: number; tail: [number]; }
>P1 : P1<T>
>x : number
>y : number
@@ -3,13 +3,13 @@ const [, a = ''] = ''.match('') || [];
> : undefined
>a : string
>'' : ""
>''.match('') || [] : RegExpMatchArray | [undefined, ""]
>''.match('') || [] : RegExpMatchArray
>''.match('') : RegExpMatchArray
>''.match : (regexp: string | RegExp) => RegExpMatchArray
>'' : ""
>match : (regexp: string | RegExp) => RegExpMatchArray
>'' : ""
>[] : [undefined, ""]
>[] : [undefined?, ""?]
a.toFixed()
>a.toFixed() : any
@@ -0,0 +1,25 @@
tests/cases/conformance/es6/destructuring/iterableArrayPattern13.ts(17,5): error TS2345: Argument of type 'FooIterator' is not assignable to parameter of type '[any, ...any[]]'.
Property '0' is missing in type 'FooIterator'.
==== tests/cases/conformance/es6/destructuring/iterableArrayPattern13.ts (1 errors) ====
class Bar { x }
class Foo extends Bar { y }
class FooIterator {
next() {
return {
value: new Foo,
done: false
};
}
[Symbol.iterator]() {
return this;
}
}
function fun([a, ...b]) { }
fun(new FooIterator);
~~~~~~~~~~~~~~~
!!! error TS2345: Argument of type 'FooIterator' is not assignable to parameter of type '[any, ...any[]]'.
!!! error TS2345: Property '0' is missing in type 'FooIterator'.
@@ -41,13 +41,13 @@ class FooIterator {
}
function fun([a, ...b]) { }
>fun : ([a, ...b]: Iterable<any>) => void
>fun : ([a, ...b]: [any, ...any[]]) => void
>a : any
>b : any[]
fun(new FooIterator);
>fun(new FooIterator) : void
>fun : ([a, ...b]: Iterable<any>) => void
>fun : ([a, ...b]: [any, ...any[]]) => void
>new FooIterator : FooIterator
>FooIterator : typeof FooIterator
@@ -41,13 +41,13 @@ class FooIterator {
}
function fun(...[a, ...b]) { }
>fun : (...[a, ...b]: Iterable<any>) => void
>fun : (__0_0: any, ...__0_1: any[]) => void
>a : any
>b : any[]
fun(new FooIterator);
>fun(new FooIterator) : void
>fun : (...[a, ...b]: Iterable<any>) => void
>fun : (__0_0: any, ...__0_1: any[]) => void
>new FooIterator : FooIterator
>FooIterator : typeof FooIterator
@@ -5,7 +5,7 @@ var a: string, b: boolean[];
[a, ...b] = { 0: "", 1: true };
>[a, ...b] = { 0: "", 1: true } : { 0: string; 1: true; }
>[a, ...b] : (string | boolean)[]
>[a, ...b] : [string, ...boolean[]]
>a : string
>...b : boolean
>b : boolean[]
@@ -1,8 +1,11 @@
tests/cases/conformance/es6/destructuring/iterableArrayPattern25.ts(1,33): error TS2501: A rest element cannot contain a binding pattern.
tests/cases/conformance/es6/destructuring/iterableArrayPattern25.ts(2,1): error TS2554: Expected 2 arguments, but got 1.
==== tests/cases/conformance/es6/destructuring/iterableArrayPattern25.ts (1 errors) ====
==== tests/cases/conformance/es6/destructuring/iterableArrayPattern25.ts (2 errors) ====
function takeFirstTwoEntries(...[[k1, v1], [k2, v2]]) { }
~~~~~~~~~~~~~~~~~~~~
!!! error TS2501: A rest element cannot contain a binding pattern.
takeFirstTwoEntries(new Map([["", 0], ["hello", 1]]));
takeFirstTwoEntries(new Map([["", 0], ["hello", 1]]));
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
!!! error TS2554: Expected 2 arguments, but got 1.
@@ -1,6 +1,6 @@
=== tests/cases/conformance/es6/destructuring/iterableArrayPattern25.ts ===
function takeFirstTwoEntries(...[[k1, v1], [k2, v2]]) { }
>takeFirstTwoEntries : (...[[k1, v1], [k2, v2]]: [[any, any], [any, any]]) => void
>takeFirstTwoEntries : (__0_0: [any, any], __0_1: [any, any]) => void
>k1 : any
>v1 : any
>k2 : any
@@ -8,7 +8,7 @@ function takeFirstTwoEntries(...[[k1, v1], [k2, v2]]) { }
takeFirstTwoEntries(new Map([["", 0], ["hello", 1]]));
>takeFirstTwoEntries(new Map([["", 0], ["hello", 1]])) : void
>takeFirstTwoEntries : (...[[k1, v1], [k2, v2]]: [[any, any], [any, any]]) => void
>takeFirstTwoEntries : (__0_0: [any, any], __0_1: [any, any]) => void
>new Map([["", 0], ["hello", 1]]) : Map<string, number>
>Map : MapConstructor
>[["", 0], ["hello", 1]] : [string, number][]
@@ -48,7 +48,7 @@ var a: Bar, b: Bar[];
[a, ...b] = new FooIterator
>[a, ...b] = new FooIterator : FooIterator
>[a, ...b] : Bar[]
>[a, ...b] : [Bar, ...Bar[]]
>a : Bar
>...b : Bar
>b : Bar[]
@@ -47,7 +47,7 @@ var a: Bar, b: string[];
[a, ...b] = new FooIterator;
>[a, ...b] = new FooIterator : FooIterator
>[a, ...b] : (string | Bar)[]
>[a, ...b] : [Bar, ...string[]]
>a : Bar
>...b : string
>b : string[]
@@ -47,7 +47,7 @@ var a: Bar, b: string;
[a, ...b] = new FooIterator;
>[a, ...b] = new FooIterator : FooIterator
>[a, ...b] : (string | Bar)[]
>[a, ...b] : [Bar, ...string[]]
>a : Bar
>...b : string
>b : string
@@ -15,7 +15,6 @@ tests/cases/conformance/types/keyof/keyofAndIndexedAccessErrors.ts(35,21): error
tests/cases/conformance/types/keyof/keyofAndIndexedAccessErrors.ts(36,21): error TS2538: Type 'boolean' cannot be used as an index type.
tests/cases/conformance/types/keyof/keyofAndIndexedAccessErrors.ts(41,31): error TS2538: Type 'boolean' cannot be used as an index type.
tests/cases/conformance/types/keyof/keyofAndIndexedAccessErrors.ts(46,16): error TS2538: Type 'boolean' cannot be used as an index type.
tests/cases/conformance/types/keyof/keyofAndIndexedAccessErrors.ts(49,12): error TS1122: A tuple type element list cannot be empty.
tests/cases/conformance/types/keyof/keyofAndIndexedAccessErrors.ts(63,33): error TS2345: Argument of type '"size"' is not assignable to parameter of type '"name" | "width" | "height" | "visible"'.
tests/cases/conformance/types/keyof/keyofAndIndexedAccessErrors.ts(64,33): error TS2345: Argument of type '"name" | "size"' is not assignable to parameter of type '"name" | "width" | "height" | "visible"'.
Type '"size"' is not assignable to type '"name" | "width" | "height" | "visible"'.
@@ -61,7 +60,7 @@ tests/cases/conformance/types/keyof/keyofAndIndexedAccessErrors.ts(117,5): error
Type 'T' is not assignable to type 'U'.
==== tests/cases/conformance/types/keyof/keyofAndIndexedAccessErrors.ts (34 errors) ====
==== tests/cases/conformance/types/keyof/keyofAndIndexedAccessErrors.ts (33 errors) ====
class Shape {
name: string;
width: number;
@@ -145,8 +144,6 @@ tests/cases/conformance/types/keyof/keyofAndIndexedAccessErrors.ts(117,5): error
type T60 = {}["toString"];
type T61 = []["toString"];
~~
!!! error TS1122: A tuple type element list cannot be empty.
declare let cond: boolean;
@@ -7,7 +7,7 @@ function f1([a], {b}, c, d) { // error
>d : any
}
function f2([a = undefined], {b = null}, c = undefined, d = null) { // error
>f2 : ([a]: [any], { b }: { b?: any; }, c?: any, d?: any) => void
>f2 : ([a]: [any?], { b }: { b?: any; }, c?: any, d?: any) => void
>a : any
>undefined : undefined
>b : any
@@ -44,5 +44,5 @@ var [a4] = [undefined], {b4} = { b4: null }, c4 = undefined, d4 = null; // error
var [a5 = undefined] = []; // error
>a5 : any
>undefined : undefined
>[] : [undefined]
>[] : [undefined?]
@@ -59,9 +59,9 @@ var { a: [{ ...nested2 }, ...y], b: { z, ...c }, ...rest2 } = overEmit;
({ a: [{ ...nested2 }, ...y], b: { z, ...c }, ...rest2 } = overEmit);
>({ a: [{ ...nested2 }, ...y], b: { z, ...c }, ...rest2 } = overEmit) : { a: { ka: string; x: string; }[]; b: { z: string; ki: string; ku: string; }; ke: string; ko: string; }
>{ a: [{ ...nested2 }, ...y], b: { z, ...c }, ...rest2 } = overEmit : { a: { ka: string; x: string; }[]; b: { z: string; ki: string; ku: string; }; ke: string; ko: string; }
>{ a: [{ ...nested2 }, ...y], b: { z, ...c }, ...rest2 } : { ke: string; ko: string; a: { ka: string; x: string; }[]; b: { ki: string; ku: string; z: string; }; }
>a : { ka: string; x: string; }[]
>[{ ...nested2 }, ...y] : { ka: string; x: string; }[]
>{ a: [{ ...nested2 }, ...y], b: { z, ...c }, ...rest2 } : { ke: string; ko: string; a: [{ ka: string; x: string; }, ...{ ka: string; x: string; }[]]; b: { ki: string; ku: string; z: string; }; }
>a : [{ ka: string; x: string; }, ...{ ka: string; x: string; }[]]
>[{ ...nested2 }, ...y] : [{ ka: string; x: string; }, ...{ ka: string; x: string; }[]]
>{ ...nested2 } : { ka: string; x: string; }
>nested2 : { ka: string; x: string; }
>...y : { ka: string; x: string; }
@@ -0,0 +1,105 @@
tests/cases/conformance/types/tuple/optionalTupleElements1.ts(11,29): error TS1257: A required element cannot follow an optional element.
tests/cases/conformance/types/tuple/optionalTupleElements1.ts(15,5): error TS2322: Type '[number, string, (boolean | undefined)?]' is not assignable to type '[number, string, boolean]'.
Types of property '2' are incompatible.
Type 'boolean | undefined' is not assignable to type 'boolean'.
Type 'undefined' is not assignable to type 'boolean'.
tests/cases/conformance/types/tuple/optionalTupleElements1.ts(16,5): error TS2322: Type '[number, (string | undefined)?, (boolean | undefined)?]' is not assignable to type '[number, string, boolean]'.
Types of property '1' are incompatible.
Type 'string | undefined' is not assignable to type 'string'.
Type 'undefined' is not assignable to type 'string'.
tests/cases/conformance/types/tuple/optionalTupleElements1.ts(17,5): error TS2322: Type '[(number | undefined)?, (string | undefined)?, (boolean | undefined)?]' is not assignable to type '[number, string, boolean]'.
Types of property '0' are incompatible.
Type 'number | undefined' is not assignable to type 'number'.
Type 'undefined' is not assignable to type 'number'.
tests/cases/conformance/types/tuple/optionalTupleElements1.ts(20,5): error TS2322: Type '[number, (string | undefined)?, (boolean | undefined)?]' is not assignable to type '[number, string, (boolean | undefined)?]'.
Types of property '1' are incompatible.
Type 'string | undefined' is not assignable to type 'string'.
Type 'undefined' is not assignable to type 'string'.
tests/cases/conformance/types/tuple/optionalTupleElements1.ts(21,5): error TS2322: Type '[(number | undefined)?, (string | undefined)?, (boolean | undefined)?]' is not assignable to type '[number, string, (boolean | undefined)?]'.
Types of property '0' are incompatible.
Type 'number | undefined' is not assignable to type 'number'.
Type 'undefined' is not assignable to type 'number'.
tests/cases/conformance/types/tuple/optionalTupleElements1.ts(25,5): error TS2322: Type '[(number | undefined)?, (string | undefined)?, (boolean | undefined)?]' is not assignable to type '[number, (string | undefined)?, (boolean | undefined)?]'.
Types of property '0' are incompatible.
Type 'number | undefined' is not assignable to type 'number'.
Type 'undefined' is not assignable to type 'number'.
==== tests/cases/conformance/types/tuple/optionalTupleElements1.ts (7 errors) ====
type T1 = [number, string, boolean];
type T2 = [number, string, boolean?];
type T3 = [number, string?, boolean?];
type T4 = [number?, string?, boolean?];
type L1 = T1["length"];
type L2 = T2["length"];
type L3 = T3["length"];
type L4 = T4["length"];
type T5 = [number, string?, boolean]; // Error
~~~~~~~
!!! error TS1257: A required element cannot follow an optional element.
function f1(t1: T1, t2: T2, t3: T3, t4: T4) {
t1 = t1;
t1 = t2; // Error
~~
!!! error TS2322: Type '[number, string, (boolean | undefined)?]' is not assignable to type '[number, string, boolean]'.
!!! error TS2322: Types of property '2' are incompatible.
!!! error TS2322: Type 'boolean | undefined' is not assignable to type 'boolean'.
!!! error TS2322: Type 'undefined' is not assignable to type 'boolean'.
t1 = t3; // Error
~~
!!! error TS2322: Type '[number, (string | undefined)?, (boolean | undefined)?]' is not assignable to type '[number, string, boolean]'.
!!! error TS2322: Types of property '1' are incompatible.
!!! error TS2322: Type 'string | undefined' is not assignable to type 'string'.
!!! error TS2322: Type 'undefined' is not assignable to type 'string'.
t1 = t4; // Error
~~
!!! error TS2322: Type '[(number | undefined)?, (string | undefined)?, (boolean | undefined)?]' is not assignable to type '[number, string, boolean]'.
!!! error TS2322: Types of property '0' are incompatible.
!!! error TS2322: Type 'number | undefined' is not assignable to type 'number'.
!!! error TS2322: Type 'undefined' is not assignable to type 'number'.
t2 = t1;
t2 = t2;
t2 = t3; // Error
~~
!!! error TS2322: Type '[number, (string | undefined)?, (boolean | undefined)?]' is not assignable to type '[number, string, (boolean | undefined)?]'.
!!! error TS2322: Types of property '1' are incompatible.
!!! error TS2322: Type 'string | undefined' is not assignable to type 'string'.
!!! error TS2322: Type 'undefined' is not assignable to type 'string'.
t2 = t4; // Error
~~
!!! error TS2322: Type '[(number | undefined)?, (string | undefined)?, (boolean | undefined)?]' is not assignable to type '[number, string, (boolean | undefined)?]'.
!!! error TS2322: Types of property '0' are incompatible.
!!! error TS2322: Type 'number | undefined' is not assignable to type 'number'.
!!! error TS2322: Type 'undefined' is not assignable to type 'number'.
t3 = t1;
t3 = t2;
t3 = t3;
t3 = t4; // Error
~~
!!! error TS2322: Type '[(number | undefined)?, (string | undefined)?, (boolean | undefined)?]' is not assignable to type '[number, (string | undefined)?, (boolean | undefined)?]'.
!!! error TS2322: Types of property '0' are incompatible.
!!! error TS2322: Type 'number | undefined' is not assignable to type 'number'.
!!! error TS2322: Type 'undefined' is not assignable to type 'number'.
t4 = t1;
t4 = t2;
t4 = t3;
t4 = t4;
}
let t2: T2;
let t3: T3;
let t4: T4;
t2 = [42, "hello"];
t3 = [42, "hello"];
t3 = [42,,true]
t3 = [42];
t4 = [42, "hello"];
t4 = [42,,true];
t4 = [,"hello", true];
t4 = [,,true];
t4 = [];
@@ -0,0 +1,95 @@
//// [optionalTupleElements1.ts]
type T1 = [number, string, boolean];
type T2 = [number, string, boolean?];
type T3 = [number, string?, boolean?];
type T4 = [number?, string?, boolean?];
type L1 = T1["length"];
type L2 = T2["length"];
type L3 = T3["length"];
type L4 = T4["length"];
type T5 = [number, string?, boolean]; // Error
function f1(t1: T1, t2: T2, t3: T3, t4: T4) {
t1 = t1;
t1 = t2; // Error
t1 = t3; // Error
t1 = t4; // Error
t2 = t1;
t2 = t2;
t2 = t3; // Error
t2 = t4; // Error
t3 = t1;
t3 = t2;
t3 = t3;
t3 = t4; // Error
t4 = t1;
t4 = t2;
t4 = t3;
t4 = t4;
}
let t2: T2;
let t3: T3;
let t4: T4;
t2 = [42, "hello"];
t3 = [42, "hello"];
t3 = [42,,true]
t3 = [42];
t4 = [42, "hello"];
t4 = [42,,true];
t4 = [,"hello", true];
t4 = [,,true];
t4 = [];
//// [optionalTupleElements1.js]
"use strict";
function f1(t1, t2, t3, t4) {
t1 = t1;
t1 = t2; // Error
t1 = t3; // Error
t1 = t4; // Error
t2 = t1;
t2 = t2;
t2 = t3; // Error
t2 = t4; // Error
t3 = t1;
t3 = t2;
t3 = t3;
t3 = t4; // Error
t4 = t1;
t4 = t2;
t4 = t3;
t4 = t4;
}
var t2;
var t3;
var t4;
t2 = [42, "hello"];
t3 = [42, "hello"];
t3 = [42, , true];
t3 = [42];
t4 = [42, "hello"];
t4 = [42, , true];
t4 = [, "hello", true];
t4 = [, , true];
t4 = [];
//// [optionalTupleElements1.d.ts]
declare type T1 = [number, string, boolean];
declare type T2 = [number, string, boolean?];
declare type T3 = [number, string?, boolean?];
declare type T4 = [number?, string?, boolean?];
declare type L1 = T1["length"];
declare type L2 = T2["length"];
declare type L3 = T3["length"];
declare type L4 = T4["length"];
declare type T5 = [number, string?, boolean];
declare function f1(t1: T1, t2: T2, t3: T3, t4: T4): void;
declare let t2: T2;
declare let t3: T3;
declare let t4: T4;
@@ -0,0 +1,147 @@
=== tests/cases/conformance/types/tuple/optionalTupleElements1.ts ===
type T1 = [number, string, boolean];
>T1 : Symbol(T1, Decl(optionalTupleElements1.ts, 0, 0))
type T2 = [number, string, boolean?];
>T2 : Symbol(T2, Decl(optionalTupleElements1.ts, 0, 36))
type T3 = [number, string?, boolean?];
>T3 : Symbol(T3, Decl(optionalTupleElements1.ts, 1, 37))
type T4 = [number?, string?, boolean?];
>T4 : Symbol(T4, Decl(optionalTupleElements1.ts, 2, 38))
type L1 = T1["length"];
>L1 : Symbol(L1, Decl(optionalTupleElements1.ts, 3, 39))
>T1 : Symbol(T1, Decl(optionalTupleElements1.ts, 0, 0))
type L2 = T2["length"];
>L2 : Symbol(L2, Decl(optionalTupleElements1.ts, 5, 23))
>T2 : Symbol(T2, Decl(optionalTupleElements1.ts, 0, 36))
type L3 = T3["length"];
>L3 : Symbol(L3, Decl(optionalTupleElements1.ts, 6, 23))
>T3 : Symbol(T3, Decl(optionalTupleElements1.ts, 1, 37))
type L4 = T4["length"];
>L4 : Symbol(L4, Decl(optionalTupleElements1.ts, 7, 23))
>T4 : Symbol(T4, Decl(optionalTupleElements1.ts, 2, 38))
type T5 = [number, string?, boolean]; // Error
>T5 : Symbol(T5, Decl(optionalTupleElements1.ts, 8, 23))
function f1(t1: T1, t2: T2, t3: T3, t4: T4) {
>f1 : Symbol(f1, Decl(optionalTupleElements1.ts, 10, 37))
>t1 : Symbol(t1, Decl(optionalTupleElements1.ts, 12, 12))
>T1 : Symbol(T1, Decl(optionalTupleElements1.ts, 0, 0))
>t2 : Symbol(t2, Decl(optionalTupleElements1.ts, 12, 19))
>T2 : Symbol(T2, Decl(optionalTupleElements1.ts, 0, 36))
>t3 : Symbol(t3, Decl(optionalTupleElements1.ts, 12, 27))
>T3 : Symbol(T3, Decl(optionalTupleElements1.ts, 1, 37))
>t4 : Symbol(t4, Decl(optionalTupleElements1.ts, 12, 35))
>T4 : Symbol(T4, Decl(optionalTupleElements1.ts, 2, 38))
t1 = t1;
>t1 : Symbol(t1, Decl(optionalTupleElements1.ts, 12, 12))
>t1 : Symbol(t1, Decl(optionalTupleElements1.ts, 12, 12))
t1 = t2; // Error
>t1 : Symbol(t1, Decl(optionalTupleElements1.ts, 12, 12))
>t2 : Symbol(t2, Decl(optionalTupleElements1.ts, 12, 19))
t1 = t3; // Error
>t1 : Symbol(t1, Decl(optionalTupleElements1.ts, 12, 12))
>t3 : Symbol(t3, Decl(optionalTupleElements1.ts, 12, 27))
t1 = t4; // Error
>t1 : Symbol(t1, Decl(optionalTupleElements1.ts, 12, 12))
>t4 : Symbol(t4, Decl(optionalTupleElements1.ts, 12, 35))
t2 = t1;
>t2 : Symbol(t2, Decl(optionalTupleElements1.ts, 12, 19))
>t1 : Symbol(t1, Decl(optionalTupleElements1.ts, 12, 12))
t2 = t2;
>t2 : Symbol(t2, Decl(optionalTupleElements1.ts, 12, 19))
>t2 : Symbol(t2, Decl(optionalTupleElements1.ts, 12, 19))
t2 = t3; // Error
>t2 : Symbol(t2, Decl(optionalTupleElements1.ts, 12, 19))
>t3 : Symbol(t3, Decl(optionalTupleElements1.ts, 12, 27))
t2 = t4; // Error
>t2 : Symbol(t2, Decl(optionalTupleElements1.ts, 12, 19))
>t4 : Symbol(t4, Decl(optionalTupleElements1.ts, 12, 35))
t3 = t1;
>t3 : Symbol(t3, Decl(optionalTupleElements1.ts, 12, 27))
>t1 : Symbol(t1, Decl(optionalTupleElements1.ts, 12, 12))
t3 = t2;
>t3 : Symbol(t3, Decl(optionalTupleElements1.ts, 12, 27))
>t2 : Symbol(t2, Decl(optionalTupleElements1.ts, 12, 19))
t3 = t3;
>t3 : Symbol(t3, Decl(optionalTupleElements1.ts, 12, 27))
>t3 : Symbol(t3, Decl(optionalTupleElements1.ts, 12, 27))
t3 = t4; // Error
>t3 : Symbol(t3, Decl(optionalTupleElements1.ts, 12, 27))
>t4 : Symbol(t4, Decl(optionalTupleElements1.ts, 12, 35))
t4 = t1;
>t4 : Symbol(t4, Decl(optionalTupleElements1.ts, 12, 35))
>t1 : Symbol(t1, Decl(optionalTupleElements1.ts, 12, 12))
t4 = t2;
>t4 : Symbol(t4, Decl(optionalTupleElements1.ts, 12, 35))
>t2 : Symbol(t2, Decl(optionalTupleElements1.ts, 12, 19))
t4 = t3;
>t4 : Symbol(t4, Decl(optionalTupleElements1.ts, 12, 35))
>t3 : Symbol(t3, Decl(optionalTupleElements1.ts, 12, 27))
t4 = t4;
>t4 : Symbol(t4, Decl(optionalTupleElements1.ts, 12, 35))
>t4 : Symbol(t4, Decl(optionalTupleElements1.ts, 12, 35))
}
let t2: T2;
>t2 : Symbol(t2, Decl(optionalTupleElements1.ts, 31, 3))
>T2 : Symbol(T2, Decl(optionalTupleElements1.ts, 0, 36))
let t3: T3;
>t3 : Symbol(t3, Decl(optionalTupleElements1.ts, 32, 3))
>T3 : Symbol(T3, Decl(optionalTupleElements1.ts, 1, 37))
let t4: T4;
>t4 : Symbol(t4, Decl(optionalTupleElements1.ts, 33, 3))
>T4 : Symbol(T4, Decl(optionalTupleElements1.ts, 2, 38))
t2 = [42, "hello"];
>t2 : Symbol(t2, Decl(optionalTupleElements1.ts, 31, 3))
t3 = [42, "hello"];
>t3 : Symbol(t3, Decl(optionalTupleElements1.ts, 32, 3))
t3 = [42,,true]
>t3 : Symbol(t3, Decl(optionalTupleElements1.ts, 32, 3))
t3 = [42];
>t3 : Symbol(t3, Decl(optionalTupleElements1.ts, 32, 3))
t4 = [42, "hello"];
>t4 : Symbol(t4, Decl(optionalTupleElements1.ts, 33, 3))
t4 = [42,,true];
>t4 : Symbol(t4, Decl(optionalTupleElements1.ts, 33, 3))
t4 = [,"hello", true];
>t4 : Symbol(t4, Decl(optionalTupleElements1.ts, 33, 3))
t4 = [,,true];
>t4 : Symbol(t4, Decl(optionalTupleElements1.ts, 33, 3))
t4 = [];
>t4 : Symbol(t4, Decl(optionalTupleElements1.ts, 33, 3))
@@ -0,0 +1,200 @@
=== tests/cases/conformance/types/tuple/optionalTupleElements1.ts ===
type T1 = [number, string, boolean];
>T1 : [number, string, boolean]
type T2 = [number, string, boolean?];
>T2 : [number, string, (boolean | undefined)?]
type T3 = [number, string?, boolean?];
>T3 : [number, (string | undefined)?, (boolean | undefined)?]
type T4 = [number?, string?, boolean?];
>T4 : [(number | undefined)?, (string | undefined)?, (boolean | undefined)?]
type L1 = T1["length"];
>L1 : 3
>T1 : [number, string, boolean]
type L2 = T2["length"];
>L2 : 3 | 2
>T2 : [number, string, (boolean | undefined)?]
type L3 = T3["length"];
>L3 : 3 | 2 | 1
>T3 : [number, (string | undefined)?, (boolean | undefined)?]
type L4 = T4["length"];
>L4 : 0 | 3 | 2 | 1
>T4 : [(number | undefined)?, (string | undefined)?, (boolean | undefined)?]
type T5 = [number, string?, boolean]; // Error
>T5 : [number, string | undefined, boolean]
function f1(t1: T1, t2: T2, t3: T3, t4: T4) {
>f1 : (t1: [number, string, boolean], t2: [number, string, (boolean | undefined)?], t3: [number, (string | undefined)?, (boolean | undefined)?], t4: [(number | undefined)?, (string | undefined)?, (boolean | undefined)?]) => void
>t1 : [number, string, boolean]
>T1 : [number, string, boolean]
>t2 : [number, string, (boolean | undefined)?]
>T2 : [number, string, (boolean | undefined)?]
>t3 : [number, (string | undefined)?, (boolean | undefined)?]
>T3 : [number, (string | undefined)?, (boolean | undefined)?]
>t4 : [(number | undefined)?, (string | undefined)?, (boolean | undefined)?]
>T4 : [(number | undefined)?, (string | undefined)?, (boolean | undefined)?]
t1 = t1;
>t1 = t1 : [number, string, boolean]
>t1 : [number, string, boolean]
>t1 : [number, string, boolean]
t1 = t2; // Error
>t1 = t2 : [number, string, (boolean | undefined)?]
>t1 : [number, string, boolean]
>t2 : [number, string, (boolean | undefined)?]
t1 = t3; // Error
>t1 = t3 : [number, (string | undefined)?, (boolean | undefined)?]
>t1 : [number, string, boolean]
>t3 : [number, (string | undefined)?, (boolean | undefined)?]
t1 = t4; // Error
>t1 = t4 : [(number | undefined)?, (string | undefined)?, (boolean | undefined)?]
>t1 : [number, string, boolean]
>t4 : [(number | undefined)?, (string | undefined)?, (boolean | undefined)?]
t2 = t1;
>t2 = t1 : [number, string, boolean]
>t2 : [number, string, (boolean | undefined)?]
>t1 : [number, string, boolean]
t2 = t2;
>t2 = t2 : [number, string, (boolean | undefined)?]
>t2 : [number, string, (boolean | undefined)?]
>t2 : [number, string, (boolean | undefined)?]
t2 = t3; // Error
>t2 = t3 : [number, (string | undefined)?, (boolean | undefined)?]
>t2 : [number, string, (boolean | undefined)?]
>t3 : [number, (string | undefined)?, (boolean | undefined)?]
t2 = t4; // Error
>t2 = t4 : [(number | undefined)?, (string | undefined)?, (boolean | undefined)?]
>t2 : [number, string, (boolean | undefined)?]
>t4 : [(number | undefined)?, (string | undefined)?, (boolean | undefined)?]
t3 = t1;
>t3 = t1 : [number, string, boolean]
>t3 : [number, (string | undefined)?, (boolean | undefined)?]
>t1 : [number, string, boolean]
t3 = t2;
>t3 = t2 : [number, string, (boolean | undefined)?]
>t3 : [number, (string | undefined)?, (boolean | undefined)?]
>t2 : [number, string, (boolean | undefined)?]
t3 = t3;
>t3 = t3 : [number, (string | undefined)?, (boolean | undefined)?]
>t3 : [number, (string | undefined)?, (boolean | undefined)?]
>t3 : [number, (string | undefined)?, (boolean | undefined)?]
t3 = t4; // Error
>t3 = t4 : [(number | undefined)?, (string | undefined)?, (boolean | undefined)?]
>t3 : [number, (string | undefined)?, (boolean | undefined)?]
>t4 : [(number | undefined)?, (string | undefined)?, (boolean | undefined)?]
t4 = t1;
>t4 = t1 : [number, string, boolean]
>t4 : [(number | undefined)?, (string | undefined)?, (boolean | undefined)?]
>t1 : [number, string, boolean]
t4 = t2;
>t4 = t2 : [number, string, (boolean | undefined)?]
>t4 : [(number | undefined)?, (string | undefined)?, (boolean | undefined)?]
>t2 : [number, string, (boolean | undefined)?]
t4 = t3;
>t4 = t3 : [number, (string | undefined)?, (boolean | undefined)?]
>t4 : [(number | undefined)?, (string | undefined)?, (boolean | undefined)?]
>t3 : [number, (string | undefined)?, (boolean | undefined)?]
t4 = t4;
>t4 = t4 : [(number | undefined)?, (string | undefined)?, (boolean | undefined)?]
>t4 : [(number | undefined)?, (string | undefined)?, (boolean | undefined)?]
>t4 : [(number | undefined)?, (string | undefined)?, (boolean | undefined)?]
}
let t2: T2;
>t2 : [number, string, (boolean | undefined)?]
>T2 : [number, string, (boolean | undefined)?]
let t3: T3;
>t3 : [number, (string | undefined)?, (boolean | undefined)?]
>T3 : [number, (string | undefined)?, (boolean | undefined)?]
let t4: T4;
>t4 : [(number | undefined)?, (string | undefined)?, (boolean | undefined)?]
>T4 : [(number | undefined)?, (string | undefined)?, (boolean | undefined)?]
t2 = [42, "hello"];
>t2 = [42, "hello"] : [number, string]
>t2 : [number, string, (boolean | undefined)?]
>[42, "hello"] : [number, string]
>42 : 42
>"hello" : "hello"
t3 = [42, "hello"];
>t3 = [42, "hello"] : [number, string]
>t3 : [number, (string | undefined)?, (boolean | undefined)?]
>[42, "hello"] : [number, string]
>42 : 42
>"hello" : "hello"
t3 = [42,,true]
>t3 = [42,,true] : [number, undefined, true]
>t3 : [number, (string | undefined)?, (boolean | undefined)?]
>[42,,true] : [number, undefined, true]
>42 : 42
> : undefined
>true : true
t3 = [42];
>t3 = [42] : [number]
>t3 : [number, (string | undefined)?, (boolean | undefined)?]
>[42] : [number]
>42 : 42
t4 = [42, "hello"];
>t4 = [42, "hello"] : [number, string]
>t4 : [(number | undefined)?, (string | undefined)?, (boolean | undefined)?]
>[42, "hello"] : [number, string]
>42 : 42
>"hello" : "hello"
t4 = [42,,true];
>t4 = [42,,true] : [number, undefined, true]
>t4 : [(number | undefined)?, (string | undefined)?, (boolean | undefined)?]
>[42,,true] : [number, undefined, true]
>42 : 42
> : undefined
>true : true
t4 = [,"hello", true];
>t4 = [,"hello", true] : [undefined, string, true]
>t4 : [(number | undefined)?, (string | undefined)?, (boolean | undefined)?]
>[,"hello", true] : [undefined, string, true]
> : undefined
>"hello" : "hello"
>true : true
t4 = [,,true];
>t4 = [,,true] : [undefined, undefined, true]
>t4 : [(number | undefined)?, (string | undefined)?, (boolean | undefined)?]
>[,,true] : [undefined, undefined, true]
> : undefined
> : undefined
>true : true
t4 = [];
>t4 = [] : []
>t4 : [(number | undefined)?, (string | undefined)?, (boolean | undefined)?]
>[] : []
@@ -1,13 +1,10 @@
tests/cases/compiler/promiseEmptyTupleNoException.ts(1,38): error TS1122: A tuple type element list cannot be empty.
tests/cases/compiler/promiseEmptyTupleNoException.ts(3,3): error TS2322: Type 'any[]' is not assignable to type '[]'.
Types of property 'length' are incompatible.
Type 'number' is not assignable to type '0'.
==== tests/cases/compiler/promiseEmptyTupleNoException.ts (2 errors) ====
==== tests/cases/compiler/promiseEmptyTupleNoException.ts (1 errors) ====
export async function get(): Promise<[]> {
~~
!!! error TS1122: A tuple type element list cannot be empty.
let emails = [];
return emails;
~~~~~~~~~~~~~~
@@ -49,7 +49,7 @@ for (let [v] of v) { }
let [x2 = x2] = []
>x2 : any
>x2 : any
>[] : [any]
>[] : [any?]
let z0 = () => z0;
>z0 : () => any
@@ -1,6 +1,6 @@
=== tests/cases/compiler/restParameterWithBindingPattern2.ts ===
function a(...[a, b]) { }
>a : (...[a, b]: [any, any]) => void
>a : (__0_0: any, __0_1: any) => void
>a : any
>b : any
@@ -0,0 +1,138 @@
tests/cases/conformance/types/tuple/restTupleElements1.ts(3,22): error TS1257: A required element cannot follow an optional element.
tests/cases/conformance/types/tuple/restTupleElements1.ts(8,13): error TS1256: A rest element must be last in a tuple type.
tests/cases/conformance/types/tuple/restTupleElements1.ts(9,13): error TS2574: A rest element type must be an array type.
tests/cases/conformance/types/tuple/restTupleElements1.ts(10,13): error TS2574: A rest element type must be an array type.
tests/cases/conformance/types/tuple/restTupleElements1.ts(10,16): error TS8020: JSDoc types can only be used inside documentation comments.
tests/cases/conformance/types/tuple/restTupleElements1.ts(23,31): error TS2344: Type 'number[]' does not satisfy the constraint '[number, ...number[]]'.
Property '0' is missing in type 'number[]'.
tests/cases/conformance/types/tuple/restTupleElements1.ts(24,31): error TS2344: Type '[]' does not satisfy the constraint '[number, ...number[]]'.
Property '0' is missing in type '[]'.
tests/cases/conformance/types/tuple/restTupleElements1.ts(29,18): error TS2344: Type 'number[]' does not satisfy the constraint '[number]'.
Property '0' is missing in type 'number[]'.
tests/cases/conformance/types/tuple/restTupleElements1.ts(30,18): error TS2344: Type '[number, ...number[]]' does not satisfy the constraint '[number]'.
Types of property 'length' are incompatible.
Type 'number' is not assignable to type '1'.
tests/cases/conformance/types/tuple/restTupleElements1.ts(32,31): error TS2344: Type '[number, ...string[]]' does not satisfy the constraint '[number, ...number[]]'.
Type 'string' is not assignable to type 'number'.
tests/cases/conformance/types/tuple/restTupleElements1.ts(33,31): error TS2344: Type '[string, ...number[]]' does not satisfy the constraint '[number, ...number[]]'.
Type 'string' is not assignable to type 'number'.
tests/cases/conformance/types/tuple/restTupleElements1.ts(34,31): error TS2344: Type '[number, number, string]' does not satisfy the constraint '[number, ...number[]]'.
Property '2' is incompatible with rest element type.
Type 'string' is not assignable to type 'number'.
tests/cases/conformance/types/tuple/restTupleElements1.ts(35,31): error TS2344: Type '[number, number, number, string]' does not satisfy the constraint '[number, ...number[]]'.
Property '3' is incompatible with rest element type.
Type 'string' is not assignable to type 'number'.
tests/cases/conformance/types/tuple/restTupleElements1.ts(59,4): error TS2345: Argument of type '[]' is not assignable to parameter of type '[{}, ...{}[]]'.
Property '0' is missing in type '[]'.
==== tests/cases/conformance/types/tuple/restTupleElements1.ts (14 errors) ====
type T00 = [string?];
type T01 = [string, string?];
type T02 = [string?, string]; // Error
~~~~~~
!!! error TS1257: A required element cannot follow an optional element.
type T03 = [...string[]];
type T04 = [...[...string[]]];
type T05 = [...[...[...string[]]]];
type T06 = [string, ...string[]];
type T07 = [...string[], string]; // Error
~~~~~~~~~~~
!!! error TS1256: A rest element must be last in a tuple type.
type T08 = [...string]; // Error
~~~~~~~~~
!!! error TS2574: A rest element type must be an array type.
type T09 = [...string?]; // Error
~~~~~~~~~~
!!! error TS2574: A rest element type must be an array type.
~~~~~~~
!!! error TS8020: JSDoc types can only be used inside documentation comments.
type T10 = [string, ...[...string[]]];
type T11 = [string, ...[...[...string[]]]];
type T15 = [boolean, number, ...string[]];
type L15 = T15["length"]; // number
declare function assign<T, S extends T>(): void;
assign<number[], [...number[]]>();
assign<number[], [number, ...number[]]>();
assign<[...number[]], number[]>();
assign<[number, ...number[]], number[]>(); // Error
~~~~~~~~
!!! error TS2344: Type 'number[]' does not satisfy the constraint '[number, ...number[]]'.
!!! error TS2344: Property '0' is missing in type 'number[]'.
assign<[number, ...number[]], []>(); // Error
~~
!!! error TS2344: Type '[]' does not satisfy the constraint '[number, ...number[]]'.
!!! error TS2344: Property '0' is missing in type '[]'.
assign<[number, ...number[]], [number]>();
assign<[number, ...number[]], [number, number]>();
assign<[number, ...number[]], [number, number, ...number[]]>();
assign<[number], [...number[]]>(); // Error
~~~~~~~~~~~~~
!!! error TS2344: Type 'number[]' does not satisfy the constraint '[number]'.
!!! error TS2344: Property '0' is missing in type 'number[]'.
assign<[number], [number, ...number[]]>(); // Error
~~~~~~~~~~~~~~~~~~~~~
!!! error TS2344: Type '[number, ...number[]]' does not satisfy the constraint '[number]'.
!!! error TS2344: Types of property 'length' are incompatible.
!!! error TS2344: Type 'number' is not assignable to type '1'.
assign<[number, ...number[]], [number, ...string[]]>(); // Error
~~~~~~~~~~~~~~~~~~~~~
!!! error TS2344: Type '[number, ...string[]]' does not satisfy the constraint '[number, ...number[]]'.
!!! error TS2344: Type 'string' is not assignable to type 'number'.
assign<[number, ...number[]], [string, ...number[]]>(); // Error
~~~~~~~~~~~~~~~~~~~~~
!!! error TS2344: Type '[string, ...number[]]' does not satisfy the constraint '[number, ...number[]]'.
!!! error TS2344: Type 'string' is not assignable to type 'number'.
assign<[number, ...number[]], [number, number, string]>(); // Error
~~~~~~~~~~~~~~~~~~~~~~~~
!!! error TS2344: Type '[number, number, string]' does not satisfy the constraint '[number, ...number[]]'.
!!! error TS2344: Property '2' is incompatible with rest element type.
!!! error TS2344: Type 'string' is not assignable to type 'number'.
assign<[number, ...number[]], [number, number, number, string]>(); // Error
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
!!! error TS2344: Type '[number, number, number, string]' does not satisfy the constraint '[number, ...number[]]'.
!!! error TS2344: Property '3' is incompatible with rest element type.
!!! error TS2344: Type 'string' is not assignable to type 'number'.
type T20 = [number, string, ...boolean[]];
type T21 = T20[0];
type T22 = T20[0 | 1];
type T23 = T20[0 | 1 | 2];
type T24 = T20[0 | 1 | 2 | 3];
type T25 = T20[1 | 2 | 3];
type T26 = T20[2 | 3];
type T27 = T20[3];
type T28 = T20[number];
declare const t: T20;
declare const x: number;
let e0 = t[0]; // number
let e1 = t[1]; // string
let e2 = t[2]; // boolean
let e3 = t[3]; // boolean
let ex = t[x]; // number | string | boolean
declare function f0<T, U>(x: [T, ...U[]]): [T, U];
f0([]); // Error
~~
!!! error TS2345: Argument of type '[]' is not assignable to parameter of type '[{}, ...{}[]]'.
!!! error TS2345: Property '0' is missing in type '[]'.
f0([1]);
f0([1, 2, 3]);
f0([1, "hello", true]);
declare function f1(a: [(x: number) => number, ...((x: string) => number)[]]): void;
declare function f2(...a: [(x: number) => number, ...((x: string) => number)[]]): void;
f1([x => x * 2, x => x.length, x => x.charCodeAt(0)]);
f2(x => x * 2, x => x.length, x => x.charCodeAt(0));
@@ -0,0 +1,135 @@
//// [restTupleElements1.ts]
type T00 = [string?];
type T01 = [string, string?];
type T02 = [string?, string]; // Error
type T03 = [...string[]];
type T04 = [...[...string[]]];
type T05 = [...[...[...string[]]]];
type T06 = [string, ...string[]];
type T07 = [...string[], string]; // Error
type T08 = [...string]; // Error
type T09 = [...string?]; // Error
type T10 = [string, ...[...string[]]];
type T11 = [string, ...[...[...string[]]]];
type T15 = [boolean, number, ...string[]];
type L15 = T15["length"]; // number
declare function assign<T, S extends T>(): void;
assign<number[], [...number[]]>();
assign<number[], [number, ...number[]]>();
assign<[...number[]], number[]>();
assign<[number, ...number[]], number[]>(); // Error
assign<[number, ...number[]], []>(); // Error
assign<[number, ...number[]], [number]>();
assign<[number, ...number[]], [number, number]>();
assign<[number, ...number[]], [number, number, ...number[]]>();
assign<[number], [...number[]]>(); // Error
assign<[number], [number, ...number[]]>(); // Error
assign<[number, ...number[]], [number, ...string[]]>(); // Error
assign<[number, ...number[]], [string, ...number[]]>(); // Error
assign<[number, ...number[]], [number, number, string]>(); // Error
assign<[number, ...number[]], [number, number, number, string]>(); // Error
type T20 = [number, string, ...boolean[]];
type T21 = T20[0];
type T22 = T20[0 | 1];
type T23 = T20[0 | 1 | 2];
type T24 = T20[0 | 1 | 2 | 3];
type T25 = T20[1 | 2 | 3];
type T26 = T20[2 | 3];
type T27 = T20[3];
type T28 = T20[number];
declare const t: T20;
declare const x: number;
let e0 = t[0]; // number
let e1 = t[1]; // string
let e2 = t[2]; // boolean
let e3 = t[3]; // boolean
let ex = t[x]; // number | string | boolean
declare function f0<T, U>(x: [T, ...U[]]): [T, U];
f0([]); // Error
f0([1]);
f0([1, 2, 3]);
f0([1, "hello", true]);
declare function f1(a: [(x: number) => number, ...((x: string) => number)[]]): void;
declare function f2(...a: [(x: number) => number, ...((x: string) => number)[]]): void;
f1([x => x * 2, x => x.length, x => x.charCodeAt(0)]);
f2(x => x * 2, x => x.length, x => x.charCodeAt(0));
//// [restTupleElements1.js]
"use strict";
assign();
assign();
assign();
assign(); // Error
assign(); // Error
assign();
assign();
assign();
assign(); // Error
assign(); // Error
assign(); // Error
assign(); // Error
assign(); // Error
assign(); // Error
var e0 = t[0]; // number
var e1 = t[1]; // string
var e2 = t[2]; // boolean
var e3 = t[3]; // boolean
var ex = t[x]; // number | string | boolean
f0([]); // Error
f0([1]);
f0([1, 2, 3]);
f0([1, "hello", true]);
f1([function (x) { return x * 2; }, function (x) { return x.length; }, function (x) { return x.charCodeAt(0); }]);
f2(function (x) { return x * 2; }, function (x) { return x.length; }, function (x) { return x.charCodeAt(0); });
//// [restTupleElements1.d.ts]
declare type T00 = [string?];
declare type T01 = [string, string?];
declare type T02 = [string?, string];
declare type T03 = [...string[]];
declare type T04 = [...[...string[]]];
declare type T05 = [...[...[...string[]]]];
declare type T06 = [string, ...string[]];
declare type T07 = [...string[], string];
declare type T08 = [...string];
declare type T09 = [...?string];
declare type T10 = [string, ...[...string[]]];
declare type T11 = [string, ...[...[...string[]]]];
declare type T15 = [boolean, number, ...string[]];
declare type L15 = T15["length"];
declare function assign<T, S extends T>(): void;
declare type T20 = [number, string, ...boolean[]];
declare type T21 = T20[0];
declare type T22 = T20[0 | 1];
declare type T23 = T20[0 | 1 | 2];
declare type T24 = T20[0 | 1 | 2 | 3];
declare type T25 = T20[1 | 2 | 3];
declare type T26 = T20[2 | 3];
declare type T27 = T20[3];
declare type T28 = T20[number];
declare const t: T20;
declare const x: number;
declare let e0: number;
declare let e1: string;
declare let e2: boolean;
declare let e3: boolean;
declare let ex: string | number | boolean;
declare function f0<T, U>(x: [T, ...U[]]): [T, U];
declare function f1(a: [(x: number) => number, ...((x: string) => number)[]]): void;
declare function f2(...a: [(x: number) => number, ...((x: string) => number)[]]): void;
@@ -0,0 +1,217 @@
=== tests/cases/conformance/types/tuple/restTupleElements1.ts ===
type T00 = [string?];
>T00 : Symbol(T00, Decl(restTupleElements1.ts, 0, 0))
type T01 = [string, string?];
>T01 : Symbol(T01, Decl(restTupleElements1.ts, 0, 21))
type T02 = [string?, string]; // Error
>T02 : Symbol(T02, Decl(restTupleElements1.ts, 1, 29))
type T03 = [...string[]];
>T03 : Symbol(T03, Decl(restTupleElements1.ts, 2, 29))
type T04 = [...[...string[]]];
>T04 : Symbol(T04, Decl(restTupleElements1.ts, 3, 25))
type T05 = [...[...[...string[]]]];
>T05 : Symbol(T05, Decl(restTupleElements1.ts, 4, 30))
type T06 = [string, ...string[]];
>T06 : Symbol(T06, Decl(restTupleElements1.ts, 5, 35))
type T07 = [...string[], string]; // Error
>T07 : Symbol(T07, Decl(restTupleElements1.ts, 6, 33))
type T08 = [...string]; // Error
>T08 : Symbol(T08, Decl(restTupleElements1.ts, 7, 33))
type T09 = [...string?]; // Error
>T09 : Symbol(T09, Decl(restTupleElements1.ts, 8, 23))
type T10 = [string, ...[...string[]]];
>T10 : Symbol(T10, Decl(restTupleElements1.ts, 9, 24))
type T11 = [string, ...[...[...string[]]]];
>T11 : Symbol(T11, Decl(restTupleElements1.ts, 10, 38))
type T15 = [boolean, number, ...string[]];
>T15 : Symbol(T15, Decl(restTupleElements1.ts, 11, 43))
type L15 = T15["length"]; // number
>L15 : Symbol(L15, Decl(restTupleElements1.ts, 13, 42))
>T15 : Symbol(T15, Decl(restTupleElements1.ts, 11, 43))
declare function assign<T, S extends T>(): void;
>assign : Symbol(assign, Decl(restTupleElements1.ts, 14, 25))
>T : Symbol(T, Decl(restTupleElements1.ts, 16, 24))
>S : Symbol(S, Decl(restTupleElements1.ts, 16, 26))
>T : Symbol(T, Decl(restTupleElements1.ts, 16, 24))
assign<number[], [...number[]]>();
>assign : Symbol(assign, Decl(restTupleElements1.ts, 14, 25))
assign<number[], [number, ...number[]]>();
>assign : Symbol(assign, Decl(restTupleElements1.ts, 14, 25))
assign<[...number[]], number[]>();
>assign : Symbol(assign, Decl(restTupleElements1.ts, 14, 25))
assign<[number, ...number[]], number[]>(); // Error
>assign : Symbol(assign, Decl(restTupleElements1.ts, 14, 25))
assign<[number, ...number[]], []>(); // Error
>assign : Symbol(assign, Decl(restTupleElements1.ts, 14, 25))
assign<[number, ...number[]], [number]>();
>assign : Symbol(assign, Decl(restTupleElements1.ts, 14, 25))
assign<[number, ...number[]], [number, number]>();
>assign : Symbol(assign, Decl(restTupleElements1.ts, 14, 25))
assign<[number, ...number[]], [number, number, ...number[]]>();
>assign : Symbol(assign, Decl(restTupleElements1.ts, 14, 25))
assign<[number], [...number[]]>(); // Error
>assign : Symbol(assign, Decl(restTupleElements1.ts, 14, 25))
assign<[number], [number, ...number[]]>(); // Error
>assign : Symbol(assign, Decl(restTupleElements1.ts, 14, 25))
assign<[number, ...number[]], [number, ...string[]]>(); // Error
>assign : Symbol(assign, Decl(restTupleElements1.ts, 14, 25))
assign<[number, ...number[]], [string, ...number[]]>(); // Error
>assign : Symbol(assign, Decl(restTupleElements1.ts, 14, 25))
assign<[number, ...number[]], [number, number, string]>(); // Error
>assign : Symbol(assign, Decl(restTupleElements1.ts, 14, 25))
assign<[number, ...number[]], [number, number, number, string]>(); // Error
>assign : Symbol(assign, Decl(restTupleElements1.ts, 14, 25))
type T20 = [number, string, ...boolean[]];
>T20 : Symbol(T20, Decl(restTupleElements1.ts, 34, 66))
type T21 = T20[0];
>T21 : Symbol(T21, Decl(restTupleElements1.ts, 36, 42))
>T20 : Symbol(T20, Decl(restTupleElements1.ts, 34, 66))
type T22 = T20[0 | 1];
>T22 : Symbol(T22, Decl(restTupleElements1.ts, 38, 18))
>T20 : Symbol(T20, Decl(restTupleElements1.ts, 34, 66))
type T23 = T20[0 | 1 | 2];
>T23 : Symbol(T23, Decl(restTupleElements1.ts, 39, 22))
>T20 : Symbol(T20, Decl(restTupleElements1.ts, 34, 66))
type T24 = T20[0 | 1 | 2 | 3];
>T24 : Symbol(T24, Decl(restTupleElements1.ts, 40, 26))
>T20 : Symbol(T20, Decl(restTupleElements1.ts, 34, 66))
type T25 = T20[1 | 2 | 3];
>T25 : Symbol(T25, Decl(restTupleElements1.ts, 41, 30))
>T20 : Symbol(T20, Decl(restTupleElements1.ts, 34, 66))
type T26 = T20[2 | 3];
>T26 : Symbol(T26, Decl(restTupleElements1.ts, 42, 26))
>T20 : Symbol(T20, Decl(restTupleElements1.ts, 34, 66))
type T27 = T20[3];
>T27 : Symbol(T27, Decl(restTupleElements1.ts, 43, 22))
>T20 : Symbol(T20, Decl(restTupleElements1.ts, 34, 66))
type T28 = T20[number];
>T28 : Symbol(T28, Decl(restTupleElements1.ts, 44, 18))
>T20 : Symbol(T20, Decl(restTupleElements1.ts, 34, 66))
declare const t: T20;
>t : Symbol(t, Decl(restTupleElements1.ts, 47, 13))
>T20 : Symbol(T20, Decl(restTupleElements1.ts, 34, 66))
declare const x: number;
>x : Symbol(x, Decl(restTupleElements1.ts, 48, 13))
let e0 = t[0]; // number
>e0 : Symbol(e0, Decl(restTupleElements1.ts, 50, 3))
>t : Symbol(t, Decl(restTupleElements1.ts, 47, 13))
>0 : Symbol(0)
let e1 = t[1]; // string
>e1 : Symbol(e1, Decl(restTupleElements1.ts, 51, 3))
>t : Symbol(t, Decl(restTupleElements1.ts, 47, 13))
>1 : Symbol(1)
let e2 = t[2]; // boolean
>e2 : Symbol(e2, Decl(restTupleElements1.ts, 52, 3))
>t : Symbol(t, Decl(restTupleElements1.ts, 47, 13))
let e3 = t[3]; // boolean
>e3 : Symbol(e3, Decl(restTupleElements1.ts, 53, 3))
>t : Symbol(t, Decl(restTupleElements1.ts, 47, 13))
let ex = t[x]; // number | string | boolean
>ex : Symbol(ex, Decl(restTupleElements1.ts, 54, 3))
>t : Symbol(t, Decl(restTupleElements1.ts, 47, 13))
>x : Symbol(x, Decl(restTupleElements1.ts, 48, 13))
declare function f0<T, U>(x: [T, ...U[]]): [T, U];
>f0 : Symbol(f0, Decl(restTupleElements1.ts, 54, 14))
>T : Symbol(T, Decl(restTupleElements1.ts, 56, 20))
>U : Symbol(U, Decl(restTupleElements1.ts, 56, 22))
>x : Symbol(x, Decl(restTupleElements1.ts, 56, 26))
>T : Symbol(T, Decl(restTupleElements1.ts, 56, 20))
>U : Symbol(U, Decl(restTupleElements1.ts, 56, 22))
>T : Symbol(T, Decl(restTupleElements1.ts, 56, 20))
>U : Symbol(U, Decl(restTupleElements1.ts, 56, 22))
f0([]); // Error
>f0 : Symbol(f0, Decl(restTupleElements1.ts, 54, 14))
f0([1]);
>f0 : Symbol(f0, Decl(restTupleElements1.ts, 54, 14))
f0([1, 2, 3]);
>f0 : Symbol(f0, Decl(restTupleElements1.ts, 54, 14))
f0([1, "hello", true]);
>f0 : Symbol(f0, Decl(restTupleElements1.ts, 54, 14))
declare function f1(a: [(x: number) => number, ...((x: string) => number)[]]): void;
>f1 : Symbol(f1, Decl(restTupleElements1.ts, 61, 23))
>a : Symbol(a, Decl(restTupleElements1.ts, 63, 20))
>x : Symbol(x, Decl(restTupleElements1.ts, 63, 25))
>x : Symbol(x, Decl(restTupleElements1.ts, 63, 52))
declare function f2(...a: [(x: number) => number, ...((x: string) => number)[]]): void;
>f2 : Symbol(f2, Decl(restTupleElements1.ts, 63, 84))
>a : Symbol(a, Decl(restTupleElements1.ts, 64, 20))
>x : Symbol(x, Decl(restTupleElements1.ts, 64, 28))
>x : Symbol(x, Decl(restTupleElements1.ts, 64, 55))
f1([x => x * 2, x => x.length, x => x.charCodeAt(0)]);
>f1 : Symbol(f1, Decl(restTupleElements1.ts, 61, 23))
>x : Symbol(x, Decl(restTupleElements1.ts, 66, 4))
>x : Symbol(x, Decl(restTupleElements1.ts, 66, 4))
>x : Symbol(x, Decl(restTupleElements1.ts, 66, 15))
>x.length : Symbol(String.length, Decl(lib.es5.d.ts, --, --))
>x : Symbol(x, Decl(restTupleElements1.ts, 66, 15))
>length : Symbol(String.length, Decl(lib.es5.d.ts, --, --))
>x : Symbol(x, Decl(restTupleElements1.ts, 66, 30))
>x.charCodeAt : Symbol(String.charCodeAt, Decl(lib.es5.d.ts, --, --))
>x : Symbol(x, Decl(restTupleElements1.ts, 66, 30))
>charCodeAt : Symbol(String.charCodeAt, Decl(lib.es5.d.ts, --, --))
f2(x => x * 2, x => x.length, x => x.charCodeAt(0));
>f2 : Symbol(f2, Decl(restTupleElements1.ts, 63, 84))
>x : Symbol(x, Decl(restTupleElements1.ts, 67, 3))
>x : Symbol(x, Decl(restTupleElements1.ts, 67, 3))
>x : Symbol(x, Decl(restTupleElements1.ts, 67, 14))
>x.length : Symbol(String.length, Decl(lib.es5.d.ts, --, --))
>x : Symbol(x, Decl(restTupleElements1.ts, 67, 14))
>length : Symbol(String.length, Decl(lib.es5.d.ts, --, --))
>x : Symbol(x, Decl(restTupleElements1.ts, 67, 29))
>x.charCodeAt : Symbol(String.charCodeAt, Decl(lib.es5.d.ts, --, --))
>x : Symbol(x, Decl(restTupleElements1.ts, 67, 29))
>charCodeAt : Symbol(String.charCodeAt, Decl(lib.es5.d.ts, --, --))
@@ -0,0 +1,270 @@
=== tests/cases/conformance/types/tuple/restTupleElements1.ts ===
type T00 = [string?];
>T00 : [(string | undefined)?]
type T01 = [string, string?];
>T01 : [string, (string | undefined)?]
type T02 = [string?, string]; // Error
>T02 : [string | undefined, string]
type T03 = [...string[]];
>T03 : string[]
type T04 = [...[...string[]]];
>T04 : string[]
type T05 = [...[...[...string[]]]];
>T05 : string[]
type T06 = [string, ...string[]];
>T06 : [string, ...string[]]
type T07 = [...string[], string]; // Error
>T07 : [string[], string]
type T08 = [...string]; // Error
>T08 : string[]
type T09 = [...string?]; // Error
>T09 : (string | null)[]
type T10 = [string, ...[...string[]]];
>T10 : [string, ...string[]]
type T11 = [string, ...[...[...string[]]]];
>T11 : [string, ...string[]]
type T15 = [boolean, number, ...string[]];
>T15 : [boolean, number, ...string[]]
type L15 = T15["length"]; // number
>L15 : number
>T15 : [boolean, number, ...string[]]
declare function assign<T, S extends T>(): void;
>assign : <T, S extends T>() => void
>T : T
>S : S
>T : T
assign<number[], [...number[]]>();
>assign<number[], [...number[]]>() : void
>assign : <T, S extends T>() => void
assign<number[], [number, ...number[]]>();
>assign<number[], [number, ...number[]]>() : void
>assign : <T, S extends T>() => void
assign<[...number[]], number[]>();
>assign<[...number[]], number[]>() : void
>assign : <T, S extends T>() => void
assign<[number, ...number[]], number[]>(); // Error
>assign<[number, ...number[]], number[]>() : any
>assign : <T, S extends T>() => void
assign<[number, ...number[]], []>(); // Error
>assign<[number, ...number[]], []>() : any
>assign : <T, S extends T>() => void
assign<[number, ...number[]], [number]>();
>assign<[number, ...number[]], [number]>() : void
>assign : <T, S extends T>() => void
assign<[number, ...number[]], [number, number]>();
>assign<[number, ...number[]], [number, number]>() : void
>assign : <T, S extends T>() => void
assign<[number, ...number[]], [number, number, ...number[]]>();
>assign<[number, ...number[]], [number, number, ...number[]]>() : void
>assign : <T, S extends T>() => void
assign<[number], [...number[]]>(); // Error
>assign<[number], [...number[]]>() : any
>assign : <T, S extends T>() => void
assign<[number], [number, ...number[]]>(); // Error
>assign<[number], [number, ...number[]]>() : any
>assign : <T, S extends T>() => void
assign<[number, ...number[]], [number, ...string[]]>(); // Error
>assign<[number, ...number[]], [number, ...string[]]>() : any
>assign : <T, S extends T>() => void
assign<[number, ...number[]], [string, ...number[]]>(); // Error
>assign<[number, ...number[]], [string, ...number[]]>() : any
>assign : <T, S extends T>() => void
assign<[number, ...number[]], [number, number, string]>(); // Error
>assign<[number, ...number[]], [number, number, string]>() : any
>assign : <T, S extends T>() => void
assign<[number, ...number[]], [number, number, number, string]>(); // Error
>assign<[number, ...number[]], [number, number, number, string]>() : any
>assign : <T, S extends T>() => void
type T20 = [number, string, ...boolean[]];
>T20 : [number, string, ...boolean[]]
type T21 = T20[0];
>T21 : number
>T20 : [number, string, ...boolean[]]
type T22 = T20[0 | 1];
>T22 : string | number
>T20 : [number, string, ...boolean[]]
type T23 = T20[0 | 1 | 2];
>T23 : string | number | boolean
>T20 : [number, string, ...boolean[]]
type T24 = T20[0 | 1 | 2 | 3];
>T24 : string | number | boolean
>T20 : [number, string, ...boolean[]]
type T25 = T20[1 | 2 | 3];
>T25 : string | boolean
>T20 : [number, string, ...boolean[]]
type T26 = T20[2 | 3];
>T26 : boolean
>T20 : [number, string, ...boolean[]]
type T27 = T20[3];
>T27 : boolean
>T20 : [number, string, ...boolean[]]
type T28 = T20[number];
>T28 : string | number | boolean
>T20 : [number, string, ...boolean[]]
declare const t: T20;
>t : [number, string, ...boolean[]]
>T20 : [number, string, ...boolean[]]
declare const x: number;
>x : number
let e0 = t[0]; // number
>e0 : number
>t[0] : number
>t : [number, string, ...boolean[]]
>0 : 0
let e1 = t[1]; // string
>e1 : string
>t[1] : string
>t : [number, string, ...boolean[]]
>1 : 1
let e2 = t[2]; // boolean
>e2 : boolean
>t[2] : boolean
>t : [number, string, ...boolean[]]
>2 : 2
let e3 = t[3]; // boolean
>e3 : boolean
>t[3] : boolean
>t : [number, string, ...boolean[]]
>3 : 3
let ex = t[x]; // number | string | boolean
>ex : string | number | boolean
>t[x] : string | number | boolean
>t : [number, string, ...boolean[]]
>x : number
declare function f0<T, U>(x: [T, ...U[]]): [T, U];
>f0 : <T, U>(x: [T, ...U[]]) => [T, U]
>T : T
>U : U
>x : [T, ...U[]]
>T : T
>U : U
>T : T
>U : U
f0([]); // Error
>f0([]) : any
>f0 : <T, U>(x: [T, ...U[]]) => [T, U]
>[] : never[]
f0([1]);
>f0([1]) : [number, {}]
>f0 : <T, U>(x: [T, ...U[]]) => [T, U]
>[1] : [number]
>1 : 1
f0([1, 2, 3]);
>f0([1, 2, 3]) : [number, number]
>f0 : <T, U>(x: [T, ...U[]]) => [T, U]
>[1, 2, 3] : [number, number, number]
>1 : 1
>2 : 2
>3 : 3
f0([1, "hello", true]);
>f0([1, "hello", true]) : [number, string | boolean]
>f0 : <T, U>(x: [T, ...U[]]) => [T, U]
>[1, "hello", true] : [number, string, true]
>1 : 1
>"hello" : "hello"
>true : true
declare function f1(a: [(x: number) => number, ...((x: string) => number)[]]): void;
>f1 : (a: [(x: number) => number, ...((x: string) => number)[]]) => void
>a : [(x: number) => number, ...((x: string) => number)[]]
>x : number
>x : string
declare function f2(...a: [(x: number) => number, ...((x: string) => number)[]]): void;
>f2 : (a_0: (x: number) => number, ...a_1: ((x: string) => number)[]) => void
>a : [(x: number) => number, ...((x: string) => number)[]]
>x : number
>x : string
f1([x => x * 2, x => x.length, x => x.charCodeAt(0)]);
>f1([x => x * 2, x => x.length, x => x.charCodeAt(0)]) : void
>f1 : (a: [(x: number) => number, ...((x: string) => number)[]]) => void
>[x => x * 2, x => x.length, x => x.charCodeAt(0)] : [(x: number) => number, (x: string) => number, (x: string) => number]
>x => x * 2 : (x: number) => number
>x : number
>x * 2 : number
>x : number
>2 : 2
>x => x.length : (x: string) => number
>x : string
>x.length : number
>x : string
>length : number
>x => x.charCodeAt(0) : (x: string) => number
>x : string
>x.charCodeAt(0) : number
>x.charCodeAt : (index: number) => number
>x : string
>charCodeAt : (index: number) => number
>0 : 0
f2(x => x * 2, x => x.length, x => x.charCodeAt(0));
>f2(x => x * 2, x => x.length, x => x.charCodeAt(0)) : void
>f2 : (a_0: (x: number) => number, ...a_1: ((x: string) => number)[]) => void
>x => x * 2 : (x: number) => number
>x : number
>x * 2 : number
>x : number
>2 : 2
>x => x.length : (x: string) => number
>x : string
>x.length : number
>x : string
>length : number
>x => x.charCodeAt(0) : (x: string) => number
>x : string
>x.charCodeAt(0) : number
>x.charCodeAt : (index: number) => number
>x : string
>charCodeAt : (index: number) => number
>0 : 0

Some files were not shown because too many files have changed in this diff Show More