Skip to content

Commit c555d4d

Browse files
Report on base primitives for certain operations.
1 parent 8f30c09 commit c555d4d

File tree

1 file changed

+21
-4
lines changed

1 file changed

+21
-4
lines changed

src/compiler/checker.ts

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24744,18 +24744,23 @@ namespace ts {
2474424744
return false;
2474524745
}
2474624746

24747-
function reportOperatorError(awaitedTypesAreCompatible?: (left: Type, right: Type) => boolean) {
24747+
function reportOperatorError(isRelated?: (left: Type, right: Type) => boolean) {
2474824748
let wouldWorkWithAwait = false;
2474924749
const errNode = errorNode || operatorToken;
24750-
const [leftStr, rightStr] = getTypeNamesForErrorDisplay(leftType, rightType);
24751-
if (awaitedTypesAreCompatible) {
24750+
if (isRelated) {
2475224751
const awaitedLeftType = getAwaitedType(leftType);
2475324752
const awaitedRightType = getAwaitedType(rightType);
2475424753
wouldWorkWithAwait = !(awaitedLeftType === leftType && awaitedRightType === rightType)
2475524754
&& !!(awaitedLeftType && awaitedRightType)
24756-
&& awaitedTypesAreCompatible(awaitedLeftType, awaitedRightType);
24755+
&& isRelated(awaitedLeftType, awaitedRightType);
2475724756
}
2475824757

24758+
let effectiveLeft = leftType;
24759+
let effectiveRight = rightType;
24760+
if (!wouldWorkWithAwait && isRelated) {
24761+
[effectiveLeft, effectiveRight] = getBaseTypesIfUnrelated(leftType, rightType, isRelated);
24762+
}
24763+
let [leftStr, rightStr] = getTypeNamesForErrorDisplay(effectiveLeft, effectiveRight);
2475924764
if (!tryGiveBetterPrimaryError(errNode, wouldWorkWithAwait, leftStr, rightStr)) {
2476024765
errorAndMaybeSuggestAwait(
2476124766
errNode,
@@ -24792,6 +24797,18 @@ namespace ts {
2479224797
}
2479324798
}
2479424799

24800+
function getBaseTypesIfUnrelated(leftType: Type, rightType: Type, isRelated: (left: Type, right: Type) => boolean): [Type, Type] {
24801+
let effectiveLeft = leftType;
24802+
let effectiveRight = rightType;
24803+
const leftBase = getBaseTypeOfLiteralType(leftType);
24804+
const rightBase = getBaseTypeOfLiteralType(rightType);
24805+
if (!isRelated(leftBase, rightBase)) {
24806+
effectiveLeft = leftBase;
24807+
effectiveRight = rightBase;
24808+
}
24809+
return [ effectiveLeft, effectiveRight ];
24810+
}
24811+
2479524812
function isYieldExpressionInClass(node: YieldExpression): boolean {
2479624813
let current: Node = node;
2479724814
let parent = node.parent;

0 commit comments

Comments
 (0)