@@ -106,7 +106,7 @@ namespace ts {
106
106
isOptionalParameter
107
107
};
108
108
109
- const tupleTypes: TupleType [] = [];
109
+ const tupleTypes: GenericType [] = [];
110
110
const unionTypes = createMap<UnionType>();
111
111
const intersectionTypes = createMap<IntersectionType>();
112
112
const stringLiteralTypes = createMap<LiteralType>();
@@ -2213,7 +2213,7 @@ namespace ts {
2213
2213
}
2214
2214
else if (type.target.flags & TypeFlags.Tuple) {
2215
2215
writePunctuation(writer, SyntaxKind.OpenBracketToken);
2216
- writeTypeList(type.typeArguments.slice(0, type.target.typeParameters.length ), SyntaxKind.CommaToken);
2216
+ writeTypeList(type.typeArguments.slice(0, getTypeReferenceArity( type) ), SyntaxKind.CommaToken);
2217
2217
writePunctuation(writer, SyntaxKind.CloseBracketToken);
2218
2218
}
2219
2219
else {
@@ -4978,6 +4978,10 @@ namespace ts {
4978
4978
return type;
4979
4979
}
4980
4980
4981
+ function getTypeReferenceArity(type: TypeReference): number {
4982
+ return type.target.typeParameters.length;
4983
+ }
4984
+
4981
4985
// Get type from reference to class or interface
4982
4986
function getTypeFromClassOrInterfaceReference(node: TypeReferenceNode | ExpressionWithTypeArguments | JSDocTypeReference, symbol: Symbol): Type {
4983
4987
const type = <InterfaceType>getDeclaredTypeOfSymbol(getMergedSymbol(symbol));
@@ -5220,7 +5224,14 @@ namespace ts {
5220
5224
return links.resolvedType;
5221
5225
}
5222
5226
5223
- function createTupleTypeOfArity(arity: number): TupleType {
5227
+ // We represent tuple types as type references to synthesized generic interface types created by
5228
+ // this function. The types are of the form:
5229
+ //
5230
+ // interface Tuple<T0, T1, T2, ...> extends Array<T0 | T1 | T2 | ...> { 0: T0, 1: T1, 2: T2, ... }
5231
+ //
5232
+ // Note that the generic type created by this function has no symbol associated with it. The same
5233
+ // is true for each of the synthesized type parameters.
5234
+ function createTupleTypeOfArity(arity: number): GenericType {
5224
5235
const typeParameters: TypeParameter[] = [];
5225
5236
const properties: Symbol[] = [];
5226
5237
for (let i = 0; i < arity; i++) {
@@ -5230,7 +5241,7 @@ namespace ts {
5230
5241
property.type = typeParameter;
5231
5242
properties.push(property);
5232
5243
}
5233
- const type = <TupleType & InterfaceTypeWithDeclaredMembers>createObjectType(TypeFlags.Tuple | TypeFlags.Reference);
5244
+ const type = <GenericType & InterfaceTypeWithDeclaredMembers>createObjectType(TypeFlags.Tuple | TypeFlags.Reference);
5234
5245
type.typeParameters = typeParameters;
5235
5246
type.outerTypeParameters = undefined;
5236
5247
type.localTypeParameters = typeParameters;
@@ -5248,14 +5259,10 @@ namespace ts {
5248
5259
return type;
5249
5260
}
5250
5261
5251
- function getTupleTypeOfArity(arity: number): TupleType {
5262
+ function getTupleTypeOfArity(arity: number): GenericType {
5252
5263
return tupleTypes[arity] || (tupleTypes[arity] = createTupleTypeOfArity(arity));
5253
5264
}
5254
5265
5255
- function getTypeReferenceArity(type: TypeReference): number {
5256
- return type.target.typeParameters.length;
5257
- }
5258
-
5259
5266
function createTupleType(elementTypes: Type[]) {
5260
5267
return createTypeReference(getTupleTypeOfArity(elementTypes.length), elementTypes);
5261
5268
}
0 commit comments