Skip to content

Commit 0263027

Browse files
author
Andy
authored
codeFixInferFromUsage: Assume that using x[0] means that x is an array (#26739)
* codeFixInferFromUsage: Assume that using `x[0]` means that `x` is an array * Remove unnecessary '||' with non-falsy LHS If only there were some kind of type-checker for JavaScript that could detect this sort of thing
1 parent f7e45c5 commit 0263027

File tree

2 files changed

+12
-10
lines changed

2 files changed

+12
-10
lines changed

src/services/codefixes/inferFromUsage.ts

+11-9
Original file line numberDiff line numberDiff line change
@@ -534,17 +534,19 @@ namespace ts.codefix {
534534
else if (usageContext.properties && hasCallContext(usageContext.properties.get("push" as __String))) {
535535
return checker.createArrayType(getParameterTypeFromCallContexts(0, usageContext.properties.get("push" as __String)!.callContexts!, /*isRestParameter*/ false, checker)!);
536536
}
537-
else if (usageContext.properties || usageContext.callContexts || usageContext.constructContexts || usageContext.numberIndexContext || usageContext.stringIndexContext) {
537+
else if (usageContext.numberIndexContext) {
538+
return checker.createArrayType(recur(usageContext.numberIndexContext));
539+
}
540+
else if (usageContext.properties || usageContext.callContexts || usageContext.constructContexts || usageContext.stringIndexContext) {
538541
const members = createUnderscoreEscapedMap<Symbol>();
539542
const callSignatures: Signature[] = [];
540543
const constructSignatures: Signature[] = [];
541544
let stringIndexInfo: IndexInfo | undefined;
542-
let numberIndexInfo: IndexInfo | undefined;
543545

544546
if (usageContext.properties) {
545547
usageContext.properties.forEach((context, name) => {
546548
const symbol = checker.createSymbol(SymbolFlags.Property, name);
547-
symbol.type = getTypeFromUsageContext(context, checker) || checker.getAnyType();
549+
symbol.type = recur(context);
548550
members.set(name, symbol);
549551
});
550552
}
@@ -561,19 +563,19 @@ namespace ts.codefix {
561563
}
562564
}
563565

564-
if (usageContext.numberIndexContext) {
565-
numberIndexInfo = checker.createIndexInfo(getTypeFromUsageContext(usageContext.numberIndexContext, checker) || checker.getAnyType(), /*isReadonly*/ false);
566-
}
567-
568566
if (usageContext.stringIndexContext) {
569-
stringIndexInfo = checker.createIndexInfo(getTypeFromUsageContext(usageContext.stringIndexContext, checker) || checker.getAnyType(), /*isReadonly*/ false);
567+
stringIndexInfo = checker.createIndexInfo(recur(usageContext.stringIndexContext), /*isReadonly*/ false);
570568
}
571569

572-
return checker.createAnonymousType(/*symbol*/ undefined!, members, callSignatures, constructSignatures, stringIndexInfo, numberIndexInfo); // TODO: GH#18217
570+
return checker.createAnonymousType(/*symbol*/ undefined!, members, callSignatures, constructSignatures, stringIndexInfo, /*numberIndexInfo*/ undefined); // TODO: GH#18217
573571
}
574572
else {
575573
return undefined;
576574
}
575+
576+
function recur(innerContext: UsageContext): Type {
577+
return getTypeFromUsageContext(innerContext, checker) || checker.getAnyType();
578+
}
577579
}
578580

579581
function getParameterTypeFromCallContexts(parameterIndex: number, callContexts: CallContext[], isRestParameter: boolean, checker: TypeChecker) {

tests/cases/fourslash/codeFixInferFromUsageNumberIndexSignature.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,4 @@
55
//// return a[0] + 1;
66
////}
77

8-
verify.rangeAfterCodeFix("a: { [x: number]: number; }",/*includeWhiteSpace*/ undefined, /*errorCode*/ undefined, 0);
8+
verify.rangeAfterCodeFix("a: number[]",/*includeWhiteSpace*/ undefined, /*errorCode*/ undefined, 0);

0 commit comments

Comments
 (0)