@@ -222,6 +222,7 @@ import {
222
222
GetAccessorDeclaration,
223
223
getAliasDeclarationFromName,
224
224
getAllAccessorDeclarations,
225
+ getAllJSDocTags,
225
226
getAllowSyntheticDefaultImports,
226
227
getAncestor,
227
228
getAssignedExpandoInitializer,
@@ -283,7 +284,6 @@ import {
283
284
getJSDocParameterTags,
284
285
getJSDocRoot,
285
286
getJSDocSatisfiesExpressionType,
286
- getJSDocSatisfiesTypeNode,
287
287
getJSDocTags,
288
288
getJSDocThisTag,
289
289
getJSDocType,
@@ -558,6 +558,7 @@ import {
558
558
isJSDocPropertyTag,
559
559
isJSDocReturnTag,
560
560
isJSDocSatisfiesExpression,
561
+ isJSDocSatisfiesTag,
561
562
isJSDocSignature,
562
563
isJSDocTemplateTag,
563
564
isJSDocTypeAlias,
@@ -971,6 +972,7 @@ import {
971
972
tryExtractTSExtension,
972
973
tryGetClassImplementingOrExtendingExpressionWithTypeArguments,
973
974
tryGetExtensionFromPath,
975
+ tryGetJSDocSatisfiesTypeNode,
974
976
tryGetModuleSpecifierFromDeclaration,
975
977
tryGetPropertyAccessOrIdentifierToString,
976
978
TryStatement,
@@ -10230,19 +10232,10 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
10230
10232
// Use the type of the initializer expression if one is present and the declaration is
10231
10233
// not a parameter of a contextually typed function
10232
10234
if (hasOnlyExpressionInitializer(declaration) && !!declaration.initializer) {
10233
- if (isInJSFile(declaration)) {
10234
- const initializer = declaration.initializer;
10235
- if (!isJSDocSatisfiesExpression(initializer)) {
10236
- const typeNode = getJSDocSatisfiesTypeNode(declaration);
10237
- if (typeNode) {
10238
- return checkSatisfiesExpressionWorker(initializer, typeNode, checkMode);
10239
- }
10240
- }
10241
- if (!isParameter(declaration)) {
10242
- const containerObjectType = getJSContainerObjectType(declaration, getSymbolOfDeclaration(declaration), getDeclaredExpandoInitializer(declaration));
10243
- if (containerObjectType) {
10244
- return containerObjectType;
10245
- }
10235
+ if (isInJSFile(declaration) && !isParameter(declaration)) {
10236
+ const containerObjectType = getJSContainerObjectType(declaration, getSymbolOfDeclaration(declaration), getDeclaredExpandoInitializer(declaration));
10237
+ if (containerObjectType) {
10238
+ return containerObjectType;
10246
10239
}
10247
10240
}
10248
10241
const type = widenTypeInferredFromInitializer(declaration, checkDeclarationInitializer(declaration, checkMode));
@@ -28169,7 +28162,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
28169
28162
}
28170
28163
28171
28164
function getContextualTypeForVariableLikeDeclaration(declaration: VariableLikeDeclaration, contextFlags: ContextFlags | undefined): Type | undefined {
28172
- const typeNode = getEffectiveTypeAnnotationNode(declaration) || (isInJSFile(declaration) ? getJSDocSatisfiesTypeNode (declaration) : undefined);
28165
+ const typeNode = getEffectiveTypeAnnotationNode(declaration) || (isInJSFile(declaration) ? tryGetJSDocSatisfiesTypeNode (declaration) : undefined);
28173
28166
if (typeNode) {
28174
28167
return getTypeFromTypeNode(typeNode);
28175
28168
}
@@ -36228,6 +36221,13 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
36228
36221
contextualType?: Type | undefined
36229
36222
) {
36230
36223
const initializer = getEffectiveInitializer(declaration)!;
36224
+ if (isInJSFile(declaration)) {
36225
+ const typeNode = tryGetJSDocSatisfiesTypeNode(declaration);
36226
+ if (typeNode) {
36227
+ // const tags = getAllJSDocTags
36228
+ return checkSatisfiesExpressionWorker(initializer, typeNode, checkMode);
36229
+ }
36230
+ }
36231
36231
const type = getQuickTypeOfExpression(initializer) ||
36232
36232
(contextualType ?
36233
36233
checkExpressionWithContextualType(initializer, contextualType, /*inferenceContext*/ undefined, checkMode || CheckMode.Normal)
@@ -38850,6 +38850,16 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
38850
38850
38851
38851
function checkJSDocSatisfiesTag(node: JSDocSatisfiesTag) {
38852
38852
checkSourceElement(node.typeExpression);
38853
+ const host = getEffectiveJSDocHost(node);
38854
+ if (host) {
38855
+ const tags = getAllJSDocTags(host, isJSDocSatisfiesTag);
38856
+ if (length(tags) > 1) {
38857
+ for (let i = 1; i < length(tags); i++) {
38858
+ const tagName = tags[i].tagName;
38859
+ error(tagName, Diagnostics._0_tag_already_specified, idText(tagName));
38860
+ }
38861
+ }
38862
+ }
38853
38863
}
38854
38864
38855
38865
function checkJSDocLinkLikeTag(node: JSDocLink | JSDocLinkCode | JSDocLinkPlain) {
0 commit comments