@@ -23265,6 +23265,12 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
23265
23265
return isArrayType(type) || !(type.flags & TypeFlags.Nullable) && isTypeAssignableTo(type, anyReadonlyArrayType);
23266
23266
}
23267
23267
23268
+ function isMutableArrayLikeType(type: Type): boolean {
23269
+ // A type is array-like if it is a reference to the global Array or global ReadonlyArray type,
23270
+ // or if it is not the undefined or null type and if it is assignable to ReadonlyArray<any>
23271
+ return isMutableArrayOrTuple(type) || !(type.flags & TypeFlags.Nullable) && isTypeAssignableTo(type, anyArrayType);
23272
+ }
23273
+
23268
23274
function getSingleBaseForNonAugmentingSubtype(type: Type) {
23269
23275
if (!(getObjectFlags(type) & ObjectFlags.Reference) || !(getObjectFlags((type as TypeReference).target) & ObjectFlags.ClassOrInterface)) {
23270
23276
return undefined;
@@ -23925,7 +23931,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
23925
23931
callback(getTypeAtPosition(source, i), getTypeAtPosition(target, i));
23926
23932
}
23927
23933
if (targetRestType) {
23928
- callback(getRestTypeAtPosition(source, paramCount, /*readonly*/ isConstTypeVariable(targetRestType) && !isMutableArrayOrTuple(getBaseConstraintOrType( targetRestType) )), targetRestType);
23934
+ callback(getRestTypeAtPosition(source, paramCount, /*readonly*/ isConstTypeVariable(targetRestType) && !isMutableArrayLikeType( targetRestType)), targetRestType);
23929
23935
}
23930
23936
}
23931
23937
@@ -30045,7 +30051,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
30045
30051
return createTupleType(elementTypes, elementFlags);
30046
30052
}
30047
30053
if (forceTuple || inConstContext || inTupleContext) {
30048
- return createArrayLiteralType(createTupleType(elementTypes, elementFlags, /*readonly*/ inConstContext && !(contextualType && isMutableArrayOrTuple (contextualType))));
30054
+ return createArrayLiteralType(createTupleType(elementTypes, elementFlags, /*readonly*/ inConstContext && !(contextualType && isMutableArrayLikeType (contextualType))));
30049
30055
}
30050
30056
return createArrayLiteralType(createArrayType(elementTypes.length ?
30051
30057
getUnionType(sameMap(elementTypes, (t, i) => elementFlags[i] & ElementFlags.Variadic ? getIndexedAccessTypeOrUndefined(t, numberType) || anyType : t), UnionReduction.Subtype) :
@@ -32623,7 +32629,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
32623
32629
names.push((arg as SyntheticExpression).tupleNameSource!);
32624
32630
}
32625
32631
}
32626
- return createTupleType(types, flags, inConstContext && !isMutableArrayOrTuple(getBaseConstraintOrType( restType) ), length(names) === length(types) ? names : undefined);
32632
+ return createTupleType(types, flags, inConstContext && !isMutableArrayLikeType( restType), length(names) === length(types) ? names : undefined);
32627
32633
}
32628
32634
32629
32635
function checkTypeArguments(signature: Signature, typeArgumentNodes: readonly TypeNode[], reportErrors: boolean, headMessage?: DiagnosticMessage): Type[] | undefined {
0 commit comments