@@ -21997,23 +21997,29 @@ namespace ts {
21997
21997
readonly side: "left" | "right";
21998
21998
readonly conversionFunctionName: string;
21999
21999
}
22000
+
22000
22001
function getExplicitConversion(left: Type, right: Type): ExplicitConversion | undefined {
22001
- const convertLeft = getFunctionNameToConvertToType(right);
22002
+ const convertLeft = getFunctionNameToConvertToType(right, left );
22002
22003
if (convertLeft) return { side: "left", conversionFunctionName: convertLeft };
22003
- const convertRight = getFunctionNameToConvertToType(left);
22004
+ const convertRight = getFunctionNameToConvertToType(left, right );
22004
22005
if (convertRight) return { side: "right", conversionFunctionName: convertRight };
22005
22006
return undefined;
22006
22007
}
22007
- function getFunctionNameToConvertToType(type: Type): string | undefined {
22008
- return type.flags & TypeFlags.String
22008
+
22009
+ function getFunctionNameToConvertToType(to: Type, from: Type): string | undefined {
22010
+ return typeOrTypesHaveFlags(to, TypeFlags.StringLike) && !typeOrTypesHaveFlags(from, TypeFlags.StringLike)
22009
22011
? "String"
22010
- : type.flags & TypeFlags.Number
22012
+ : typeOrTypesHaveFlags(to, TypeFlags.NumberLike) && !typeOrTypesHaveFlags(from, TypeFlags.NumberLike)
22011
22013
? "Number"
22012
- : type.flags & TypeFlags.Boolean
22014
+ : typeOrTypesHaveFlags(to, TypeFlags.BooleanLike) && !typeOrTypesHaveFlags(from, TypeFlags.BooleanLike)
22013
22015
? "Boolean"
22014
22016
: undefined;
22015
22017
}
22016
22018
22019
+ function typeOrTypesHaveFlags(type: Type, flags: TypeFlags): boolean {
22020
+ return (type.flags & TypeFlags.Union ? (type as UnionType).types : [type]).every(t => !!(t.flags & flags));
22021
+ }
22022
+
22017
22023
function isYieldExpressionInClass(node: YieldExpression): boolean {
22018
22024
let current: Node = node;
22019
22025
let parent = node.parent;
0 commit comments