Skip to content

Commit 7410cfd

Browse files
authored
Deprecate .hasRestElement in favor of combinedFlags (#58864)
1 parent a71841c commit 7410cfd

File tree

3 files changed

+21
-13
lines changed

3 files changed

+21
-13
lines changed

src/compiler/checker.ts

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -18567,7 +18567,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
1856718567
}
1856818568
if (everyType(objectType, isTupleType) && isNumericLiteralName(propName)) {
1856918569
const index = +propName;
18570-
if (accessNode && everyType(objectType, t => !(t as TupleTypeReference).target.hasRestElement) && !(accessFlags & AccessFlags.NoTupleBoundsCheck)) {
18570+
if (accessNode && everyType(objectType, t => !((t as TupleTypeReference).target.combinedFlags & ElementFlags.Variable)) && !(accessFlags & AccessFlags.NoTupleBoundsCheck)) {
1857118571
const indexNode = getIndexNodeForAccessExpression(accessNode);
1857218572
if (isTupleType(objectType)) {
1857318573
if (index < 0) {
@@ -25755,7 +25755,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
2575525755

2575625756
function tupleTypesDefinitelyUnrelated(source: TupleTypeReference, target: TupleTypeReference) {
2575725757
return !(target.target.combinedFlags & ElementFlags.Variadic) && target.target.minLength > source.target.minLength ||
25758-
!target.target.hasRestElement && (source.target.hasRestElement || target.target.fixedLength < source.target.fixedLength);
25758+
!(target.target.combinedFlags & ElementFlags.Variable) && (!!(source.target.combinedFlags & ElementFlags.Variable) || target.target.fixedLength < source.target.fixedLength);
2575925759
}
2576025760

2576125761
function typesDefinitelyUnrelated(source: Type, target: Type) {
@@ -26586,7 +26586,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
2658626586
return;
2658726587
}
2658826588
const startLength = isTupleType(source) ? Math.min(source.target.fixedLength, target.target.fixedLength) : 0;
26589-
const endLength = Math.min(isTupleType(source) ? getEndElementCount(source.target, ElementFlags.Fixed) : 0, target.target.hasRestElement ? getEndElementCount(target.target, ElementFlags.Fixed) : 0);
26589+
const endLength = Math.min(isTupleType(source) ? getEndElementCount(source.target, ElementFlags.Fixed) : 0, target.target.combinedFlags & ElementFlags.Variable ? getEndElementCount(target.target, ElementFlags.Fixed) : 0);
2659026590
// Infer between starting fixed elements.
2659126591
for (let i = 0; i < startLength; i++) {
2659226592
inferFromTypes(getTypeArguments(source)[i], elementTypes[i]);
@@ -26615,7 +26615,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
2661526615
// if T is constrained by a fixed-size tuple we might be able to use its arity to infer T
2661626616
const param = getInferenceInfoForType(elementTypes[startLength])?.typeParameter;
2661726617
const constraint = param && getBaseConstraintOfType(param);
26618-
if (constraint && isTupleType(constraint) && !constraint.target.hasRestElement) {
26618+
if (constraint && isTupleType(constraint) && !(constraint.target.combinedFlags & ElementFlags.Variable)) {
2661926619
const impliedArity = constraint.target.fixedLength;
2662026620
inferFromTypes(sliceTupleType(source, startLength, sourceArity - (startLength + impliedArity)), elementTypes[startLength]);
2662126621
inferFromTypes(getElementTypeOfSliceOfTupleType(source, startLength + impliedArity, endLength)!, elementTypes[startLength + 1]);
@@ -26626,7 +26626,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
2662626626
// if T is constrained by a fixed-size tuple we might be able to use its arity to infer T
2662726627
const param = getInferenceInfoForType(elementTypes[startLength + 1])?.typeParameter;
2662826628
const constraint = param && getBaseConstraintOfType(param);
26629-
if (constraint && isTupleType(constraint) && !constraint.target.hasRestElement) {
26629+
if (constraint && isTupleType(constraint) && !(constraint.target.combinedFlags & ElementFlags.Variable)) {
2663026630
const impliedArity = constraint.target.fixedLength;
2663126631
const endIndex = sourceArity - getEndElementCount(target.target, ElementFlags.Fixed);
2663226632
const startIndex = endIndex - impliedArity;
@@ -31583,7 +31583,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
3158331583
// When the length is known and the index is after all spread elements we compute the offset from the element
3158431584
// to the end and the number of ending fixed elements in the contextual tuple type.
3158531585
const offset = length !== undefined && (lastSpreadIndex === undefined || index > lastSpreadIndex) ? length - index : 0;
31586-
const fixedEndLength = offset > 0 && t.target.hasRestElement ? getEndElementCount(t.target, ElementFlags.Fixed) : 0;
31586+
const fixedEndLength = offset > 0 && (t.target.combinedFlags & ElementFlags.Variable) ? getEndElementCount(t.target, ElementFlags.Fixed) : 0;
3158731587
// If the offset is within the ending fixed part of the contextual tuple type, return the type of the contextual
3158831588
// tuple element.
3158931589
if (offset > 0 && offset <= fixedEndLength) {
@@ -37367,7 +37367,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
3736737367
// otherwise would return the type 'undefined').
3736837368
const restType = getTypeOfSymbol(signature.parameters[paramCount]);
3736937369
const index = pos - paramCount;
37370-
if (!isTupleType(restType) || restType.target.hasRestElement || index < restType.target.fixedLength) {
37370+
if (!isTupleType(restType) || restType.target.combinedFlags & ElementFlags.Variable || index < restType.target.fixedLength) {
3737137371
return getIndexedAccessType(restType, getNumberLiteralType(index));
3737237372
}
3737337373
}
@@ -37416,7 +37416,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
3741637416
if (signatureHasRestParameter(signature)) {
3741737417
const restType = getTypeOfSymbol(signature.parameters[length - 1]);
3741837418
if (isTupleType(restType)) {
37419-
return length + restType.target.fixedLength - (restType.target.hasRestElement ? 0 : 1);
37419+
return length + restType.target.fixedLength - (restType.target.combinedFlags & ElementFlags.Variable ? 0 : 1);
3742037420
}
3742137421
}
3742237422
return length;
@@ -37461,7 +37461,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
3746137461
function hasEffectiveRestParameter(signature: Signature) {
3746237462
if (signatureHasRestParameter(signature)) {
3746337463
const restType = getTypeOfSymbol(signature.parameters[signature.parameters.length - 1]);
37464-
return !isTupleType(restType) || restType.target.hasRestElement;
37464+
return !isTupleType(restType) || !!(restType.target.combinedFlags & ElementFlags.Variable);
3746537465
}
3746637466
return false;
3746737467
}
@@ -37472,7 +37472,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
3747237472
if (!isTupleType(restType)) {
3747337473
return isTypeAny(restType) ? anyArrayType : restType;
3747437474
}
37475-
if (restType.target.hasRestElement) {
37475+
if (restType.target.combinedFlags & ElementFlags.Variable) {
3747637476
return sliceTupleType(restType, restType.target.fixedLength);
3747737477
}
3747837478
}
@@ -40147,7 +40147,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
4014740147
checkExpressionWithContextualType(initializer, contextualType, /*inferenceContext*/ undefined, checkMode || CheckMode.Normal)
4014840148
: checkExpressionCached(initializer, checkMode));
4014940149
return isParameter(declaration) && declaration.name.kind === SyntaxKind.ArrayBindingPattern &&
40150-
isTupleType(type) && !type.target.hasRestElement && getTypeReferenceArity(type) < declaration.name.elements.length ?
40150+
isTupleType(type) && !(type.target.combinedFlags & ElementFlags.Variable) && getTypeReferenceArity(type) < declaration.name.elements.length ?
4015140151
padTupleType(type, declaration.name) : type;
4015240152
}
4015340153

src/compiler/types.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6511,7 +6511,11 @@ export interface TupleType extends GenericType {
65116511
minLength: number;
65126512
/** Number of initial required or optional elements */
65136513
fixedLength: number;
6514-
/** True if tuple has any rest or variadic elements */
6514+
/**
6515+
* True if tuple has any rest or variadic elements
6516+
*
6517+
* @deprecated Use `.combinedFlags & ElementFlags.Variable` instead
6518+
*/
65156519
hasRestElement: boolean;
65166520
combinedFlags: ElementFlags;
65176521
readonly: boolean;

tests/baselines/reference/api/typescript.d.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6666,7 +6666,11 @@ declare namespace ts {
66666666
minLength: number;
66676667
/** Number of initial required or optional elements */
66686668
fixedLength: number;
6669-
/** True if tuple has any rest or variadic elements */
6669+
/**
6670+
* True if tuple has any rest or variadic elements
6671+
*
6672+
* @deprecated Use `.combinedFlags & ElementFlags.Variable` instead
6673+
*/
66706674
hasRestElement: boolean;
66716675
combinedFlags: ElementFlags;
66726676
readonly: boolean;

0 commit comments

Comments
 (0)