From d0b3a6cfede336445c3c9032c6d19bae6a8c7f47 Mon Sep 17 00:00:00 2001 From: kingwl Date: Mon, 29 Jun 2020 17:04:13 +0800 Subject: [PATCH] Avoid check for union keys --- src/compiler/checker.ts | 6 +-- .../fourslash/jsdocDeprecated_suggestion4.ts | 50 +++++++++++++++++++ 2 files changed, 53 insertions(+), 3 deletions(-) create mode 100644 tests/cases/fourslash/jsdocDeprecated_suggestion4.ts diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index aa0091f99523a..b9f8169eba998 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -13274,13 +13274,13 @@ namespace ts { undefined; } - 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.flags & SymbolFlags.Deprecated) { + if (reportDeprecated && accessNode && prop.flags & SymbolFlags.Deprecated) { const deprecatedNode = accessExpression?.argumentExpression ?? (isIndexedAccessTypeNode(accessNode) ? accessNode.indexType : accessNode); errorOrSuggestion(/* isError */ false, deprecatedNode, Diagnostics._0_is_deprecated, propName as string); } @@ -13650,7 +13650,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, + } +])