Skip to content

Commit a5e55ad

Browse files
committed
Infer readonly array/tuple for const T only when T's constraint permits
1 parent fb32b83 commit a5e55ad

File tree

1 file changed

+2
-2
lines changed

1 file changed

+2
-2
lines changed

src/compiler/checker.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30045,7 +30045,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
3004530045
return createTupleType(elementTypes, elementFlags);
3004630046
}
3004730047
if (forceTuple || inConstContext || inTupleContext) {
30048-
return createArrayLiteralType(createTupleType(elementTypes, elementFlags, /*readonly*/ inConstContext));
30048+
return createArrayLiteralType(createTupleType(elementTypes, elementFlags, /*readonly*/ inConstContext && !(contextualType && isMutableArrayOrTuple(contextualType))));
3004930049
}
3005030050
return createArrayLiteralType(createArrayType(elementTypes.length ?
3005130051
getUnionType(sameMap(elementTypes, (t, i) => elementFlags[i] & ElementFlags.Variadic ? getIndexedAccessTypeOrUndefined(t, numberType) || anyType : t), UnionReduction.Subtype) :
@@ -32623,7 +32623,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
3262332623
names.push((arg as SyntheticExpression).tupleNameSource!);
3262432624
}
3262532625
}
32626-
return createTupleType(types, flags, inConstContext, length(names) === length(types) ? names : undefined);
32626+
return createTupleType(types, flags, inConstContext && !isMutableArrayOrTuple(getBaseConstraintOrType(restType)), length(names) === length(types) ? names : undefined);
3262732627
}
3262832628

3262932629
function checkTypeArguments(signature: Signature, typeArgumentNodes: readonly TypeNode[], reportErrors: boolean, headMessage?: DiagnosticMessage): Type[] | undefined {

0 commit comments

Comments
 (0)