Skip to content

Commit 4385444

Browse files
committed
Add TupleBase with unusable mutating Array methods
1 parent a980d61 commit 4385444

File tree

2 files changed

+20
-5
lines changed

2 files changed

+20
-5
lines changed

src/compiler/checker.ts

+8-5
Original file line numberDiff line numberDiff line change
@@ -327,6 +327,7 @@ namespace ts {
327327
let globalFunctionType: ObjectType;
328328
let globalArrayType: GenericType;
329329
let globalReadonlyArrayType: GenericType;
330+
let globalTupleBaseType: GenericType;
330331
let globalStringType: ObjectType;
331332
let globalNumberType: ObjectType;
332333
let globalBooleanType: ObjectType;
@@ -775,7 +776,7 @@ namespace ts {
775776
* @param parameterName a name of the parameter to get the symbols for.
776777
* @return a tuple of two symbols
777778
*/
778-
function getSymbolsOfParameterPropertyDeclaration(parameter: ParameterDeclaration, parameterName: __String): [Symbol, Symbol] {
779+
function getSymbolsOfParameterPropertyDeclaration(parameter: ParameterDeclaration, parameterName: __String): Symbol[] {
779780
const constructorDeclaration = parameter.parent;
780781
const classDeclaration = parameter.parent.parent;
781782

@@ -4996,7 +4997,7 @@ namespace ts {
49964997
function getBaseTypes(type: InterfaceType): BaseType[] {
49974998
if (!type.resolvedBaseTypes) {
49984999
if (type.objectFlags & ObjectFlags.Tuple) {
4999-
type.resolvedBaseTypes = [createArrayType(getUnionType(type.typeParameters))];
5000+
type.resolvedBaseTypes = [createTypeFromGenericGlobalType(globalTupleBaseType, [getUnionType(type.typeParameters)])];
50005001
}
50015002
else if (type.symbol.flags & (SymbolFlags.Class | SymbolFlags.Interface)) {
50025003
if (type.symbol.flags & SymbolFlags.Class) {
@@ -9992,7 +9993,7 @@ namespace ts {
99929993
const typeParameters = type.typeParameters || emptyArray;
99939994
let variances = type.variances;
99949995
if (!variances) {
9995-
if (type === globalArrayType || type === globalReadonlyArrayType) {
9996+
if (type === globalArrayType || type === globalReadonlyArrayType || type === globalTupleBaseType) {
99969997
// Arrays are known to be covariant, no need to spend time computing this
99979998
variances = [Variance.Covariant];
99989999
}
@@ -10321,7 +10322,7 @@ namespace ts {
1032110322
function isArrayLikeType(type: Type): boolean {
1032210323
// A type is array-like if it is a reference to the global Array or global ReadonlyArray type,
1032310324
// or if it is not the undefined or null type and if it is assignable to ReadonlyArray<any>
10324-
return getObjectFlags(type) & ObjectFlags.Reference && ((<TypeReference>type).target === globalArrayType || (<TypeReference>type).target === globalReadonlyArrayType) ||
10325+
return getObjectFlags(type) & ObjectFlags.Reference && ((<TypeReference>type).target === globalArrayType || (<TypeReference>type).target === globalReadonlyArrayType || (type as TypeReference).target === globalTupleBaseType) ||
1032510326
!(type.flags & TypeFlags.Nullable) && isTypeAssignableTo(type, anyReadonlyArrayType);
1032610327
}
1032710328

@@ -24509,7 +24510,9 @@ namespace ts {
2450924510
anyArrayType = createArrayType(anyType);
2451024511
autoArrayType = createArrayType(autoType);
2451124512

24512-
globalReadonlyArrayType = <GenericType>getGlobalTypeOrUndefined("ReadonlyArray" as __String, /*arity*/ 1);
24513+
// TODO: ReadonlyArray and TupleBase should always be available, but haven't been required previously
24514+
globalReadonlyArrayType = <GenericType>getGlobalType("ReadonlyArray" as __String, /*arity*/ 1, /*reportErrors*/ true);
24515+
globalTupleBaseType = <GenericType>getGlobalType("TupleBase" as __String, /*arity*/ 1, /*reportErrors*/ true);
2451324516
anyReadonlyArrayType = globalReadonlyArrayType ? createTypeFromGenericGlobalType(globalReadonlyArrayType, [anyType]) : anyArrayType;
2451424517
globalThisType = <GenericType>getGlobalTypeOrUndefined("ThisType" as __String, /*arity*/ 1);
2451524518
}

src/lib/es5.d.ts

+12
Original file line numberDiff line numberDiff line change
@@ -1240,6 +1240,18 @@ interface ArrayConstructor {
12401240

12411241
declare const Array: ArrayConstructor;
12421242

1243+
interface TupleBase<T> extends Array<T> {
1244+
// TODO: Add jsdoc here warning not to call this
1245+
push(...items: never[]): never;
1246+
pop(): never | undefined;
1247+
reverse(): never[];
1248+
sort(compareFn?: (a: never, b: never) => number): never;
1249+
shift(): never | undefined;
1250+
unshift(...items: never[]): never;
1251+
splice(start: number, deleteCount?: number): never[];
1252+
splice(start: number, deleteCount: number, ...items: never[]): never[];
1253+
}
1254+
12431255
interface TypedPropertyDescriptor<T> {
12441256
enumerable?: boolean;
12451257
configurable?: boolean;

0 commit comments

Comments
 (0)