Skip to content

Commit 107cb98

Browse files
author
Andy Hanson
committed
Handle literals and literal unions
1 parent b36e5de commit 107cb98

File tree

3 files changed

+48
-42
lines changed

3 files changed

+48
-42
lines changed

src/compiler/checker.ts

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21997,23 +21997,29 @@ namespace ts {
2199721997
readonly side: "left" | "right";
2199821998
readonly conversionFunctionName: string;
2199921999
}
22000+
2200022001
function getExplicitConversion(left: Type, right: Type): ExplicitConversion | undefined {
22001-
const convertLeft = getFunctionNameToConvertToType(right);
22002+
const convertLeft = getFunctionNameToConvertToType(right, left);
2200222003
if (convertLeft) return { side: "left", conversionFunctionName: convertLeft };
22003-
const convertRight = getFunctionNameToConvertToType(left);
22004+
const convertRight = getFunctionNameToConvertToType(left, right);
2200422005
if (convertRight) return { side: "right", conversionFunctionName: convertRight };
2200522006
return undefined;
2200622007
}
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)
2200922011
? "String"
22010-
: type.flags & TypeFlags.Number
22012+
: typeOrTypesHaveFlags(to, TypeFlags.NumberLike) && !typeOrTypesHaveFlags(from, TypeFlags.NumberLike)
2201122013
? "Number"
22012-
: type.flags & TypeFlags.Boolean
22014+
: typeOrTypesHaveFlags(to, TypeFlags.BooleanLike) && !typeOrTypesHaveFlags(from, TypeFlags.BooleanLike)
2201322015
? "Boolean"
2201422016
: undefined;
2201522017
}
2201622018

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+
2201722023
function isYieldExpressionInClass(node: YieldExpression): boolean {
2201822024
let current: Node = node;
2201922025
let parent = node.parent;

0 commit comments

Comments
 (0)