Skip to content

Commit 9a0a838

Browse files
committed
Use getIndexedAccess to compute type for contextual rest parameters
1 parent bbf559b commit 9a0a838

File tree

1 file changed

+10
-11
lines changed

1 file changed

+10
-11
lines changed

src/compiler/checker.ts

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -21550,32 +21550,31 @@ namespace ts {
2155021550
}
2155121551
if (signature.hasRestParameter) {
2155221552
const restType = getTypeOfSymbol(signature.parameters[paramCount]);
21553-
if (isTupleType(restType)) {
21554-
if (pos - paramCount < getLengthOfTupleType(restType)) {
21555-
return restType.typeArguments![pos - paramCount];
21556-
}
21557-
return getRestTypeOfTupleType(restType);
21558-
}
21559-
return getIndexTypeOfType(restType, IndexKind.Number);
21553+
const indexType = getLiteralType(pos - paramCount);
21554+
return getIndexedAccessType(restType, indexType);
2156021555
}
2156121556
return undefined;
2156221557
}
2156321558

2156421559
function getRestTypeAtPosition(source: Signature, pos: number): Type {
2156521560
const paramCount = getParameterCount(source);
2156621561
const restType = getEffectiveRestType(source);
21567-
if (restType && pos === paramCount - 1) {
21562+
const nonRestCount = paramCount - (restType ? 1 : 0);
21563+
if (restType && pos === nonRestCount) {
2156821564
return restType;
2156921565
}
21570-
const start = restType ? Math.min(pos, paramCount - 1) : pos;
2157121566
const types = [];
2157221567
const names = [];
21573-
for (let i = start; i < paramCount; i++) {
21568+
for (let i = pos; i < nonRestCount; i++) {
2157421569
types.push(getTypeAtPosition(source, i));
2157521570
names.push(getParameterNameAtPosition(source, i));
2157621571
}
21572+
if (restType) {
21573+
types.push(getIndexedAccessType(restType, numberType));
21574+
names.push(getParameterNameAtPosition(source, nonRestCount));
21575+
}
2157721576
const minArgumentCount = getMinArgumentCount(source);
21578-
const minLength = minArgumentCount < start ? 0 : minArgumentCount - start;
21577+
const minLength = minArgumentCount < pos ? 0 : minArgumentCount - pos;
2157921578
return createTupleType(types, minLength, !!restType, /*readonly*/ false, names);
2158021579
}
2158121580

0 commit comments

Comments
 (0)