From c555d4df899e8d953b8bdb1d9fe13a66fb00b39c Mon Sep 17 00:00:00 2001 From: Daniel Rosenwasser Date: Wed, 14 Aug 2019 16:02:35 -0700 Subject: [PATCH] Report on base primitives for certain operations. --- src/compiler/checker.ts | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 74bf936d5c8..65722fa6d52 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -24744,18 +24744,23 @@ namespace ts { return false; } - function reportOperatorError(awaitedTypesAreCompatible?: (left: Type, right: Type) => boolean) { + function reportOperatorError(isRelated?: (left: Type, right: Type) => boolean) { let wouldWorkWithAwait = false; const errNode = errorNode || operatorToken; - const [leftStr, rightStr] = getTypeNamesForErrorDisplay(leftType, rightType); - if (awaitedTypesAreCompatible) { + if (isRelated) { const awaitedLeftType = getAwaitedType(leftType); const awaitedRightType = getAwaitedType(rightType); wouldWorkWithAwait = !(awaitedLeftType === leftType && awaitedRightType === rightType) && !!(awaitedLeftType && awaitedRightType) - && awaitedTypesAreCompatible(awaitedLeftType, awaitedRightType); + && isRelated(awaitedLeftType, awaitedRightType); } + let effectiveLeft = leftType; + let effectiveRight = rightType; + if (!wouldWorkWithAwait && isRelated) { + [effectiveLeft, effectiveRight] = getBaseTypesIfUnrelated(leftType, rightType, isRelated); + } + let [leftStr, rightStr] = getTypeNamesForErrorDisplay(effectiveLeft, effectiveRight); if (!tryGiveBetterPrimaryError(errNode, wouldWorkWithAwait, leftStr, rightStr)) { errorAndMaybeSuggestAwait( errNode, @@ -24792,6 +24797,18 @@ namespace ts { } } + function getBaseTypesIfUnrelated(leftType: Type, rightType: Type, isRelated: (left: Type, right: Type) => boolean): [Type, Type] { + let effectiveLeft = leftType; + let effectiveRight = rightType; + const leftBase = getBaseTypeOfLiteralType(leftType); + const rightBase = getBaseTypeOfLiteralType(rightType); + if (!isRelated(leftBase, rightBase)) { + effectiveLeft = leftBase; + effectiveRight = rightBase; + } + return [ effectiveLeft, effectiveRight ]; + } + function isYieldExpressionInClass(node: YieldExpression): boolean { let current: Node = node; let parent = node.parent;