Avoid check for union keys (#39314)

This commit is contained in:
Wenlu Wang 2020-07-07 06:01:05 +08:00 committed by GitHub
parent 0d84f210b7
commit 453365284c
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 53 additions and 3 deletions

View file

@ -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) {

View file

@ -0,0 +1,50 @@
///<reference path="fourslash.ts" />
//// 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,
}
])