@@ -24,6 +24,7 @@ import {
24
24
arrayToMultiMap,
25
25
ArrayTypeNode,
26
26
ArrowFunction,
27
+ AsExpression,
27
28
AssertionExpression,
28
29
AssignmentDeclarationKind,
29
30
AssignmentKind,
@@ -758,6 +759,7 @@ import {
758
759
JSDocSatisfiesTag,
759
760
JSDocSignature,
760
761
JSDocTemplateTag,
762
+ JSDocTypeAssertion,
761
763
JSDocTypedefTag,
762
764
JSDocTypeExpression,
763
765
JSDocTypeLiteral,
@@ -1033,7 +1035,6 @@ import {
1033
1035
TypeReferenceSerializationKind,
1034
1036
TypeReferenceType,
1035
1037
TypeVariable,
1036
- UnaryExpression,
1037
1038
unescapeLeadingUnderscores,
1038
1039
UnionOrIntersectionType,
1039
1040
UnionOrIntersectionTypeNode,
@@ -34210,7 +34211,8 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
34210
34211
grammarErrorOnNode(node, Diagnostics.This_syntax_is_reserved_in_files_with_the_mts_or_cts_extension_Use_an_as_expression_instead);
34211
34212
}
34212
34213
}
34213
- return checkAssertionWorker(node, node.type, node.expression);
34214
+ // return checkAssertionWorker(node, node.type, node.expression);
34215
+ return checkAssertionWorker(node);
34214
34216
}
34215
34217
34216
34218
function isValidConstAssertionArgument(node: Node): boolean {
@@ -34241,27 +34243,74 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
34241
34243
return false;
34242
34244
}
34243
34245
34244
- function checkAssertionWorker(errNode: Node, type: TypeNode, expression: UnaryExpression | Expression, checkMode?: CheckMode) {
34245
- let exprType = checkExpression(expression, checkMode);
34246
+ function checkAssertionWorker(node: JSDocTypeAssertion | AssertionExpression) {
34247
+ // TODO: maybe we don't need this? maybe can be helper?
34248
+ let type: TypeNode;
34249
+ let expression: Expression;
34250
+ switch (node.kind) {
34251
+ case SyntaxKind.AsExpression:
34252
+ case SyntaxKind.TypeAssertionExpression:
34253
+ type = node.type;
34254
+ expression = node.expression;
34255
+ break;
34256
+ case SyntaxKind.ParenthesizedExpression:
34257
+ type = getJSDocTypeAssertionType(node);
34258
+ expression = node.expression;
34259
+ break;
34260
+ }
34261
+
34262
+ // function checkAssertionWorker(errNode: Node, type: TypeNode, expression: UnaryExpression | Expression, checkMode?: CheckMode) {
34263
+ // let exprType = checkExpression(expression, checkMode);
34246
34264
if (isConstTypeReference(type)) {
34247
34265
if (!isValidConstAssertionArgument(expression)) {
34248
34266
error(expression, Diagnostics.A_const_assertions_can_only_be_applied_to_references_to_enum_members_or_string_number_boolean_array_or_object_literals);
34249
34267
}
34250
- return getRegularTypeOfLiteralType(exprType);
34268
+ // return getRegularTypeOfLiteralType(exprType);
34269
+ return getRegularTypeOfLiteralType(checkExpression(expression));
34251
34270
}
34252
34271
checkSourceElement(type);
34253
- exprType = getRegularTypeOfObjectLiteral(getBaseTypeOfLiteralType(exprType));
34272
+ checkNodeDeferred(node); // >> TODO: get node
34273
+ // exprType = getRegularTypeOfObjectLiteral(getBaseTypeOfLiteralType(exprType));
34274
+ // const targetType = getTypeFromTypeNode(type);
34275
+ // if (!isErrorType(targetType)) {
34276
+ // addLazyDiagnostic(() => { // TODO: defer this check
34277
+ // const widenedType = getWidenedType(exprType);
34278
+ // if (!isTypeComparableTo(targetType, widenedType)) {
34279
+ // checkTypeComparableTo(exprType, targetType, errNode,
34280
+ // Diagnostics.Conversion_of_type_0_to_type_1_may_be_a_mistake_because_neither_type_sufficiently_overlaps_with_the_other_If_this_was_intentional_convert_the_expression_to_unknown_first);
34281
+ // }
34282
+ // });
34283
+ // }
34284
+ // return targetType;
34285
+ return getTypeFromTypeNode(type);
34286
+ }
34287
+
34288
+ function checkAssertionDeferred(node: JSDocTypeAssertion | AssertionExpression) {
34289
+ let type: TypeNode;
34290
+ let expression: Expression;
34291
+ let errNode: Node;
34292
+ switch (node.kind) {
34293
+ case SyntaxKind.AsExpression:
34294
+ case SyntaxKind.TypeAssertionExpression:
34295
+ type = (node as TypeAssertion | AsExpression).type;
34296
+ expression = (node as TypeAssertion | AsExpression).expression;
34297
+ errNode = node;
34298
+ break;
34299
+ case SyntaxKind.ParenthesizedExpression:
34300
+ type = getJSDocTypeAssertionType(node);
34301
+ expression = node.expression;
34302
+ errNode = type;
34303
+ break;
34304
+ }
34305
+ const exprType = getRegularTypeOfObjectLiteral(getBaseTypeOfLiteralType(checkExpression(expression)));
34254
34306
const targetType = getTypeFromTypeNode(type);
34255
34307
if (!isErrorType(targetType)) {
34256
- addLazyDiagnostic(() => {
34257
- const widenedType = getWidenedType(exprType);
34258
- if (!isTypeComparableTo(targetType, widenedType)) {
34259
- checkTypeComparableTo(exprType, targetType, errNode,
34260
- Diagnostics.Conversion_of_type_0_to_type_1_may_be_a_mistake_because_neither_type_sufficiently_overlaps_with_the_other_If_this_was_intentional_convert_the_expression_to_unknown_first);
34261
- }
34262
- });
34308
+ const widenedType = getWidenedType(exprType);
34309
+ if (!isTypeComparableTo(targetType, widenedType)) {
34310
+ checkTypeComparableTo(exprType, targetType, errNode,
34311
+ Diagnostics.Conversion_of_type_0_to_type_1_may_be_a_mistake_because_neither_type_sufficiently_overlaps_with_the_other_If_this_was_intentional_convert_the_expression_to_unknown_first);
34312
+ }
34263
34313
}
34264
- return targetType;
34265
34314
}
34266
34315
34267
34316
function checkNonNullChain(node: NonNullChain) {
@@ -37483,8 +37532,9 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
37483
37532
return checkSatisfiesExpressionWorker(node.expression, getJSDocSatisfiesExpressionType(node), checkMode);
37484
37533
}
37485
37534
if (isJSDocTypeAssertion(node)) {
37486
- const type = getJSDocTypeAssertionType(node);
37487
- return checkAssertionWorker(type, type, node.expression, checkMode);
37535
+ // const type = getJSDocTypeAssertionType(node);
37536
+ // return checkAssertionWorker(type, type, node.expression);
37537
+ return checkAssertionWorker(node);
37488
37538
}
37489
37539
}
37490
37540
return checkExpression(node.expression, checkMode);
@@ -44606,7 +44656,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
44606
44656
// Here, performing a full type check of the body of the function expression whilst in the process of
44607
44657
// determining the type of foo would cause foo to be given type any because of the recursive reference.
44608
44658
// Delaying the type check of the body ensures foo has been assigned a type.
44609
- function checkNodeDeferred(node: Node) {
44659
+ function checkNodeDeferred(node: Node) { // >>
44610
44660
const enclosingFile = getSourceFileOfNode(node);
44611
44661
const links = getNodeLinks(enclosingFile);
44612
44662
if (!(links.flags & NodeCheckFlags.TypeChecked)) {
@@ -44626,7 +44676,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
44626
44676
links.deferredNodes = undefined;
44627
44677
}
44628
44678
44629
- function checkDeferredNode(node: Node) {
44679
+ function checkDeferredNode(node: Node) { // >>
44630
44680
tracing?.push(tracing.Phase.Check, "checkDeferredNode", { kind: node.kind, pos: node.pos, end: node.end, path: (node as TracingNode).tracingPath });
44631
44681
const saveCurrentNode = currentNode;
44632
44682
currentNode = node;
@@ -44664,6 +44714,10 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
44664
44714
case SyntaxKind.JsxElement:
44665
44715
checkJsxElementDeferred(node as JsxElement);
44666
44716
break;
44717
+ case SyntaxKind.TypeAssertionExpression:
44718
+ case SyntaxKind.AsExpression:
44719
+ case SyntaxKind.ParenthesizedExpression:
44720
+ checkAssertionDeferred(node as AssertionExpression | JSDocTypeAssertion);
44667
44721
}
44668
44722
currentNode = saveCurrentNode;
44669
44723
tracing?.pop();
0 commit comments