@@ -274,6 +274,7 @@ import {
274
274
getJSDocHost,
275
275
getJSDocParameterTags,
276
276
getJSDocRoot,
277
+ getJSDocSatisfiesExpressionType,
277
278
getJSDocTags,
278
279
getJSDocThisTag,
279
280
getJSDocType,
@@ -338,8 +339,8 @@ import {
338
339
hasAccessorModifier,
339
340
hasAmbientModifier,
340
341
hasContextSensitiveParameters,
341
- HasDecorators,
342
342
hasDecorators,
343
+ HasDecorators,
343
344
hasDynamicName,
344
345
hasEffectiveModifier,
345
346
hasEffectiveModifiers,
@@ -348,8 +349,8 @@ import {
348
349
hasExtension,
349
350
HasIllegalDecorators,
350
351
HasIllegalModifiers,
351
- HasInitializer,
352
352
hasInitializer,
353
+ HasInitializer,
353
354
hasJSDocNodes,
354
355
hasJSDocParameterTags,
355
356
hasJsonModuleEmitEnabled,
@@ -539,6 +540,7 @@ import {
539
540
isJSDocParameterTag,
540
541
isJSDocPropertyLikeTag,
541
542
isJSDocReturnTag,
543
+ isJSDocSatisfiesExpression,
542
544
isJSDocSignature,
543
545
isJSDocTemplateTag,
544
546
isJSDocTypeAlias,
@@ -713,6 +715,7 @@ import {
713
715
JSDocPropertyTag,
714
716
JSDocProtectedTag,
715
717
JSDocPublicTag,
718
+ JSDocSatisfiesTag,
716
719
JSDocSignature,
717
720
JSDocTemplateTag,
718
721
JSDocTypedefTag,
@@ -28682,6 +28685,9 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
28682
28685
Debug.assert(parent.parent.kind === SyntaxKind.TemplateExpression);
28683
28686
return getContextualTypeForSubstitutionExpression(parent.parent as TemplateExpression, node);
28684
28687
case SyntaxKind.ParenthesizedExpression: {
28688
+ if (isJSDocSatisfiesExpression(parent)) {
28689
+ return getTypeFromTypeNode(getJSDocSatisfiesExpressionType(parent));
28690
+ }
28685
28691
// Like in `checkParenthesizedExpression`, an `/** @type {xyz} */` comment before a parenthesized expression acts as a type cast.
28686
28692
const tag = isInJSFile(parent) ? getJSDocTypeTag(parent) : undefined;
28687
28693
return !tag ? getContextualType(parent as ParenthesizedExpression, contextFlags) :
@@ -33674,15 +33680,16 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
33674
33680
33675
33681
function checkSatisfiesExpression(node: SatisfiesExpression) {
33676
33682
checkSourceElement(node.type);
33677
- const exprType = checkExpression(node.expression);
33683
+ return checkSatisfiesExpressionWorker(node.expression, node.type);
33684
+ }
33678
33685
33679
- const targetType = getTypeFromTypeNode(node.type);
33686
+ function checkSatisfiesExpressionWorker(expression: Expression, target: TypeNode, checkMode?: CheckMode) {
33687
+ const exprType = checkExpression(expression, checkMode);
33688
+ const targetType = getTypeFromTypeNode(target);
33680
33689
if (isErrorType(targetType)) {
33681
33690
return targetType;
33682
33691
}
33683
-
33684
- checkTypeAssignableToAndOptionallyElaborate(exprType, targetType, node.type, node.expression, Diagnostics.Type_0_does_not_satisfy_the_expected_type_1);
33685
-
33692
+ checkTypeAssignableToAndOptionallyElaborate(exprType, targetType, target, expression, Diagnostics.Type_0_does_not_satisfy_the_expected_type_1);
33686
33693
return exprType;
33687
33694
}
33688
33695
@@ -36406,9 +36413,14 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
36406
36413
}
36407
36414
36408
36415
function checkParenthesizedExpression(node: ParenthesizedExpression, checkMode?: CheckMode): Type {
36409
- if (hasJSDocNodes(node) && isJSDocTypeAssertion(node)) {
36410
- const type = getJSDocTypeAssertionType(node);
36411
- return checkAssertionWorker(type, type, node.expression, checkMode);
36416
+ if (hasJSDocNodes(node)) {
36417
+ if (isJSDocSatisfiesExpression(node)) {
36418
+ return checkSatisfiesExpressionWorker(node.expression, getJSDocSatisfiesExpressionType(node), checkMode);
36419
+ }
36420
+ if (isJSDocTypeAssertion(node)) {
36421
+ const type = getJSDocTypeAssertionType(node);
36422
+ return checkAssertionWorker(type, type, node.expression, checkMode);
36423
+ }
36412
36424
}
36413
36425
return checkExpression(node.expression, checkMode);
36414
36426
}
@@ -38632,6 +38644,10 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
38632
38644
checkSourceElement(node.typeExpression);
38633
38645
}
38634
38646
38647
+ function checkJSDocSatisfiesTag(node: JSDocSatisfiesTag) {
38648
+ checkSourceElement(node.typeExpression);
38649
+ }
38650
+
38635
38651
function checkJSDocLinkLikeTag(node: JSDocLink | JSDocLinkCode | JSDocLinkPlain) {
38636
38652
if (node.name) {
38637
38653
resolveJSDocMemberName(node.name, /*ignoreErrors*/ true);
@@ -43138,6 +43154,8 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
43138
43154
case SyntaxKind.JSDocProtectedTag:
43139
43155
case SyntaxKind.JSDocPrivateTag:
43140
43156
return checkJSDocAccessibilityModifiers(node as JSDocPublicTag | JSDocProtectedTag | JSDocPrivateTag);
43157
+ case SyntaxKind.JSDocSatisfiesTag:
43158
+ return checkJSDocSatisfiesTag(node as JSDocSatisfiesTag);
43141
43159
case SyntaxKind.IndexedAccessType:
43142
43160
return checkIndexedAccessType(node as IndexedAccessTypeNode);
43143
43161
case SyntaxKind.MappedType:
0 commit comments