@@ -767,7 +767,6 @@ import {
767767 JSDocSatisfiesTag,
768768 JSDocSignature,
769769 JSDocTemplateTag,
770- JSDocTypeAssertion,
771770 JSDocTypedefTag,
772771 JSDocTypeExpression,
773772 JSDocTypeLiteral,
@@ -1045,6 +1044,7 @@ import {
10451044 TypeReferenceSerializationKind,
10461045 TypeReferenceType,
10471046 TypeVariable,
1047+ UnaryExpression,
10481048 unescapeLeadingUnderscores,
10491049 UnionOrIntersectionType,
10501050 UnionOrIntersectionTypeNode,
@@ -34434,14 +34434,14 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
3443434434 return getReturnTypeOfSignature(signature);
3443534435 }
3443634436
34437- function checkAssertion(node: AssertionExpression, checkMode: CheckMode | undefined ) {
34437+ function checkAssertion(node: AssertionExpression) {
3443834438 if (node.kind === SyntaxKind.TypeAssertionExpression) {
3443934439 const file = getSourceFileOfNode(node);
3444034440 if (file && fileExtensionIsOneOf(file.fileName, [Extension.Cts, Extension.Mts])) {
3444134441 grammarErrorOnNode(node, Diagnostics.This_syntax_is_reserved_in_files_with_the_mts_or_cts_extension_Use_an_as_expression_instead);
3444234442 }
3444334443 }
34444- return checkAssertionWorker(node, checkMode );
34444+ return checkAssertionWorker(node, node.type, node.expression );
3444534445 }
3444634446
3444734447 function isValidConstAssertionArgument(node: Node): boolean {
@@ -34472,42 +34472,16 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
3447234472 return false;
3447334473 }
3447434474
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);
3447834477 if (isConstTypeReference(type)) {
3447934478 if (!isValidConstAssertionArgument(expression)) {
3448034479 error(expression, Diagnostics.A_const_assertions_can_only_be_applied_to_references_to_enum_members_or_string_number_boolean_array_or_object_literals);
3448134480 }
3448234481 return getRegularTypeOfLiteralType(exprType);
3448334482 }
3448434483 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));
3451134485 const targetType = getTypeFromTypeNode(type);
3451234486 if (!isErrorType(targetType)) {
3451334487 addLazyDiagnostic(() => {
@@ -34518,6 +34492,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
3451834492 }
3451934493 });
3452034494 }
34495+ return targetType;
3452134496 }
3452234497
3452334498 function checkNonNullChain(node: NonNullChain) {
@@ -37756,7 +37731,8 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
3775637731 return checkSatisfiesExpressionWorker(node.expression, getJSDocSatisfiesExpressionType(node), checkMode);
3775737732 }
3775837733 if (isJSDocTypeAssertion(node)) {
37759- return checkAssertionWorker(node, checkMode);
37734+ const type = getJSDocTypeAssertionType(node);
37735+ return checkAssertionWorker(type, type, node.expression, checkMode);
3776037736 }
3776137737 }
3776237738 return checkExpression(node.expression, checkMode);
@@ -37837,7 +37813,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
3783737813 return checkTypeOfExpression(node as TypeOfExpression);
3783837814 case SyntaxKind.TypeAssertionExpression:
3783937815 case SyntaxKind.AsExpression:
37840- return checkAssertion(node as AssertionExpression, checkMode );
37816+ return checkAssertion(node as AssertionExpression);
3784137817 case SyntaxKind.NonNullExpression:
3784237818 return checkNonNullAssertion(node as NonNullExpression);
3784337819 case SyntaxKind.ExpressionWithTypeArguments:
@@ -44951,10 +44927,6 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
4495144927 case SyntaxKind.JsxElement:
4495244928 checkJsxElementDeferred(node as JsxElement);
4495344929 break;
44954- case SyntaxKind.TypeAssertionExpression:
44955- case SyntaxKind.AsExpression:
44956- case SyntaxKind.ParenthesizedExpression:
44957- checkAssertionDeferred(node as AssertionExpression | JSDocTypeAssertion);
4495844930 }
4495944931 currentNode = saveCurrentNode;
4496044932 tracing?.pop();
0 commit comments