Skip to content

Commit 17d8ea3

Browse files
committed
feat: impl for tuple type
1 parent 2b2428c commit 17d8ea3

File tree

2 files changed

+23
-8
lines changed

2 files changed

+23
-8
lines changed

src/compiler/checker.ts

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -20210,6 +20210,12 @@ namespace ts {
2021020210
return mappedTypes && getUnionType(mappedTypes, noReductions ? UnionReduction.None : UnionReduction.Literal);
2021120211
}
2021220212

20213+
function mapTupleType(tuple: TupleTypeReference, mapper: (t: Type) => Type): TupleTypeReference {
20214+
const target = tuple.target;
20215+
const newType = map(getTypeArguments(tuple), mapper);
20216+
return <TupleTypeReference>(createTupleType(newType, target.minLength, target.hasRestElement, target.readonly, target.labeledElementDeclarations));
20217+
}
20218+
2021320219
function extractTypesOfKind(type: Type, kind: TypeFlags) {
2021420220
return filterType(type, t => (t.flags & kind) !== 0);
2021520221
}
@@ -28320,28 +28326,33 @@ namespace ts {
2832028326
}
2832128327
return awaitedType;
2832228328
}
28329+
checkPromiseOperationExists(node.operation);
2832328330
const iterated = getIteratedTypeOrElementType(IterationUse.AllowsSyncIterablesFlag, operandType, undefinedType, /*errorNode*/undefined, /*checkAssignability*/ false);
2832428331
if (!iterated) {
2832528332
error(node.expression, Diagnostics.The_expression_after_the_await_0_operator_must_be_iterable, node.operation);
2832628333
return anyType;
2832728334
}
28328-
const awaitedType = checkAwaitedType(iterated, node, Diagnostics.Type_of_await_operand_must_either_be_a_valid_promise_or_must_not_contain_a_callable_then_member);
28329-
checkPromiseOperationExists(node.operation);
28335+
const awaited = (T: Type) => checkAwaitedType(T, node, Diagnostics.Type_of_await_operand_must_either_be_a_valid_promise_or_must_not_contain_a_callable_then_member);
2833028336
switch (node.operation) {
28331-
case "all":
28332-
return createArrayType(awaitedType);
28337+
case "all": {
28338+
if (isTupleLikeType(operandType)) return mapTupleType(<TupleTypeReference>operandType, awaited);
28339+
return createArrayType(awaited(iterated));
28340+
}
2833328341
case "any":
2833428342
case "race":
28335-
return awaitedType;
28343+
return awaited(iterated);
2833628344
case "allSettled":
2833728345
const PromiseSettledResult = getGlobalPromiseSettledResultType(true);
28346+
const promiseSettled = (T: Type) => instantiateType(
28347+
PromiseSettledResult,
28348+
createTypeMapper(PromiseSettledResult.aliasTypeArguments!, /*targets*/[T])
28349+
)!;
2833828350
if (PromiseSettledResult === (emptyGenericType as any)) {
2833928351
error(node, Diagnostics.Cannot_find_name_0_Do_you_need_to_change_your_target_library_Try_changing_the_lib_compiler_option_to_1_or_later, "PromiseSettledResult", "es2020");
2834028352
return anyType;
2834128353
}
28342-
const mapper = createTypeMapper(PromiseSettledResult.aliasTypeArguments!, /*targets*/[awaitedType]);
28343-
const result = instantiateType(PromiseSettledResult, mapper)!;
28344-
return createArrayType(result);
28354+
if (isTupleLikeType(operandType)) return mapTupleType(<TupleTypeReference>operandType, T => promiseSettled(awaited(T)));
28355+
return createArrayType(promiseSettled(awaited(iterated)));
2834528356
default:
2834628357
Debug.fail()
2834728358
}

src/compiler/parser.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4497,6 +4497,10 @@ namespace ts {
44974497
* 7) ~ UnaryExpression[?yield]
44984498
* 8) ! UnaryExpression[?yield]
44994499
* 9) [+Await] await UnaryExpression[?yield]
4500+
* 10) [+Await] await.all UnaryExpression[?yield]
4501+
* 11) [+Await] await.race UnaryExpression[?yield]
4502+
* 12) [+Await] await.allSettled UnaryExpression[?yield]
4503+
* 13) [+Await] await.any UnaryExpression[?yield]
45004504
*/
45014505
function parseSimpleUnaryExpression(): UnaryExpression {
45024506
switch (token()) {

0 commit comments

Comments
 (0)