@@ -767,7 +767,6 @@ import {
767
767
JSDocSatisfiesTag,
768
768
JSDocSignature,
769
769
JSDocTemplateTag,
770
- JSDocTypeAssertion,
771
770
JSDocTypedefTag,
772
771
JSDocTypeExpression,
773
772
JSDocTypeLiteral,
@@ -1045,6 +1044,7 @@ import {
1045
1044
TypeReferenceSerializationKind,
1046
1045
TypeReferenceType,
1047
1046
TypeVariable,
1047
+ UnaryExpression,
1048
1048
unescapeLeadingUnderscores,
1049
1049
UnionOrIntersectionType,
1050
1050
UnionOrIntersectionTypeNode,
@@ -34434,14 +34434,14 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
34434
34434
return getReturnTypeOfSignature(signature);
34435
34435
}
34436
34436
34437
- function checkAssertion(node: AssertionExpression, checkMode: CheckMode | undefined ) {
34437
+ function checkAssertion(node: AssertionExpression) {
34438
34438
if (node.kind === SyntaxKind.TypeAssertionExpression) {
34439
34439
const file = getSourceFileOfNode(node);
34440
34440
if (file && fileExtensionIsOneOf(file.fileName, [Extension.Cts, Extension.Mts])) {
34441
34441
grammarErrorOnNode(node, Diagnostics.This_syntax_is_reserved_in_files_with_the_mts_or_cts_extension_Use_an_as_expression_instead);
34442
34442
}
34443
34443
}
34444
- return checkAssertionWorker(node, checkMode );
34444
+ return checkAssertionWorker(node, node.type, node.expression );
34445
34445
}
34446
34446
34447
34447
function isValidConstAssertionArgument(node: Node): boolean {
@@ -34472,42 +34472,16 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
34472
34472
return false;
34473
34473
}
34474
34474
34475
- function checkAssertionWorker(node: JSDocTypeAssertion | AssertionExpression, checkMode: CheckMode | undefined) {
34476
- const { type, expression } = getAssertionTypeAndExpression(node);
34477
- const exprType = checkExpression(expression, checkMode);
34475
+ function checkAssertionWorker(errNode: Node, type: TypeNode, expression: UnaryExpression | Expression, checkMode?: CheckMode) {
34476
+ let exprType = checkExpression(expression, checkMode);
34478
34477
if (isConstTypeReference(type)) {
34479
34478
if (!isValidConstAssertionArgument(expression)) {
34480
34479
error(expression, Diagnostics.A_const_assertions_can_only_be_applied_to_references_to_enum_members_or_string_number_boolean_array_or_object_literals);
34481
34480
}
34482
34481
return getRegularTypeOfLiteralType(exprType);
34483
34482
}
34484
34483
checkSourceElement(type);
34485
- checkNodeDeferred(node);
34486
- return getTypeFromTypeNode(type);
34487
- }
34488
-
34489
- function getAssertionTypeAndExpression(node: JSDocTypeAssertion | AssertionExpression) {
34490
- let type: TypeNode;
34491
- let expression: Expression;
34492
- switch (node.kind) {
34493
- case SyntaxKind.AsExpression:
34494
- case SyntaxKind.TypeAssertionExpression:
34495
- type = node.type;
34496
- expression = node.expression;
34497
- break;
34498
- case SyntaxKind.ParenthesizedExpression:
34499
- type = getJSDocTypeAssertionType(node);
34500
- expression = node.expression;
34501
- break;
34502
- }
34503
-
34504
- return { type, expression };
34505
- }
34506
-
34507
- function checkAssertionDeferred(node: JSDocTypeAssertion | AssertionExpression) {
34508
- const { type, expression } = getAssertionTypeAndExpression(node);
34509
- const errNode = isParenthesizedExpression(node) ? type : node;
34510
- const exprType = getRegularTypeOfObjectLiteral(getBaseTypeOfLiteralType(checkExpression(expression)));
34484
+ exprType = getRegularTypeOfObjectLiteral(getBaseTypeOfLiteralType(exprType));
34511
34485
const targetType = getTypeFromTypeNode(type);
34512
34486
if (!isErrorType(targetType)) {
34513
34487
addLazyDiagnostic(() => {
@@ -34518,6 +34492,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
34518
34492
}
34519
34493
});
34520
34494
}
34495
+ return targetType;
34521
34496
}
34522
34497
34523
34498
function checkNonNullChain(node: NonNullChain) {
@@ -37756,7 +37731,8 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
37756
37731
return checkSatisfiesExpressionWorker(node.expression, getJSDocSatisfiesExpressionType(node), checkMode);
37757
37732
}
37758
37733
if (isJSDocTypeAssertion(node)) {
37759
- return checkAssertionWorker(node, checkMode);
37734
+ const type = getJSDocTypeAssertionType(node);
37735
+ return checkAssertionWorker(type, type, node.expression, checkMode);
37760
37736
}
37761
37737
}
37762
37738
return checkExpression(node.expression, checkMode);
@@ -37837,7 +37813,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
37837
37813
return checkTypeOfExpression(node as TypeOfExpression);
37838
37814
case SyntaxKind.TypeAssertionExpression:
37839
37815
case SyntaxKind.AsExpression:
37840
- return checkAssertion(node as AssertionExpression, checkMode );
37816
+ return checkAssertion(node as AssertionExpression);
37841
37817
case SyntaxKind.NonNullExpression:
37842
37818
return checkNonNullAssertion(node as NonNullExpression);
37843
37819
case SyntaxKind.ExpressionWithTypeArguments:
@@ -44951,10 +44927,6 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
44951
44927
case SyntaxKind.JsxElement:
44952
44928
checkJsxElementDeferred(node as JsxElement);
44953
44929
break;
44954
- case SyntaxKind.TypeAssertionExpression:
44955
- case SyntaxKind.AsExpression:
44956
- case SyntaxKind.ParenthesizedExpression:
44957
- checkAssertionDeferred(node as AssertionExpression | JSDocTypeAssertion);
44958
44930
}
44959
44931
currentNode = saveCurrentNode;
44960
44932
tracing?.pop();
0 commit comments