diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 7c8a38f62125e..f576e68661f16 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -13290,13 +13290,13 @@ namespace ts { && every(symbol.declarations, d => !isFunctionLike(d) || !!(d.flags & NodeFlags.Deprecated)); } - function getPropertyTypeForIndexType(originalObjectType: Type, objectType: Type, indexType: Type, fullIndexType: Type, suppressNoImplicitAnyError: boolean, accessNode: ElementAccessExpression | IndexedAccessTypeNode | PropertyName | BindingName | SyntheticExpression | undefined, accessFlags: AccessFlags) { + function getPropertyTypeForIndexType(originalObjectType: Type, objectType: Type, indexType: Type, fullIndexType: Type, suppressNoImplicitAnyError: boolean, accessNode: ElementAccessExpression | IndexedAccessTypeNode | PropertyName | BindingName | SyntheticExpression | undefined, accessFlags: AccessFlags, reportDeprecated?: boolean) { const accessExpression = accessNode && accessNode.kind === SyntaxKind.ElementAccessExpression ? accessNode : undefined; const propName = accessNode && isPrivateIdentifier(accessNode) ? undefined : getPropertyNameFromIndex(indexType, accessNode); if (propName !== undefined) { const prop = getPropertyOfType(objectType, propName); if (prop) { - if (accessNode && prop.valueDeclaration?.flags & NodeFlags.Deprecated && isUncalledFunctionReference(accessNode, prop)) { + if (reportDeprecated && accessNode && prop.valueDeclaration?.flags & NodeFlags.Deprecated && isUncalledFunctionReference(accessNode, prop)) { const deprecatedNode = accessExpression?.argumentExpression ?? (isIndexedAccessTypeNode(accessNode) ? accessNode.indexType : accessNode); errorOrSuggestion(/* isError */ false, deprecatedNode, Diagnostics._0_is_deprecated, propName as string); } @@ -13666,7 +13666,7 @@ namespace ts { } return accessFlags & AccessFlags.Writing ? getIntersectionType(propTypes, aliasSymbol, aliasTypeArguments) : getUnionType(propTypes, UnionReduction.Literal, aliasSymbol, aliasTypeArguments); } - return getPropertyTypeForIndexType(objectType, apparentObjectType, indexType, indexType, /* supressNoImplicitAnyError */ false, accessNode, accessFlags | AccessFlags.CacheSymbol); + return getPropertyTypeForIndexType(objectType, apparentObjectType, indexType, indexType, /* supressNoImplicitAnyError */ false, accessNode, accessFlags | AccessFlags.CacheSymbol, /* reportDeprecated */ true); } function getTypeFromIndexedAccessTypeNode(node: IndexedAccessTypeNode) { diff --git a/tests/cases/fourslash/jsdocDeprecated_suggestion4.ts b/tests/cases/fourslash/jsdocDeprecated_suggestion4.ts new file mode 100644 index 0000000000000..9bcdf0de5e2b7 --- /dev/null +++ b/tests/cases/fourslash/jsdocDeprecated_suggestion4.ts @@ -0,0 +1,50 @@ +/// + +//// interface Foo { +//// /** @deprecated */ +//// f: number +//// b: number +//// /** @deprecated */ +//// baz: number +//// } + +//// declare const f: Foo +//// f.[|f|]; +//// f.b; +//// f.[|baz|]; + +//// const kf = 'f' +//// const kb = 'b' +//// declare const k: 'f' | 'b' | 'baz' +//// declare const kfb: 'f' | 'b' +//// declare const kfz: 'f' | 'baz' +//// declare const keys: keyof Foo +//// f[[|kf|]] +//// f[kb] +//// f[k] +//// f[kfb] +//// f[kfz] +//// f[keys] + + +const ranges = test.ranges(); +verify.getSuggestionDiagnostics([ + { + message: "'f' is deprecated", + code: 6385, + range: ranges[0], + reportsDeprecated: true, + }, + { + message: "'baz' is deprecated", + code: 6385, + range: ranges[1], + reportsDeprecated: true, + }, + { + message: "'f' is deprecated", + code: 6385, + range: ranges[2], + reportsDeprecated: true, + } +])