如何在match语句中检查变量类型?无需if语句的最优方案
在Match语句中检查变量类型(无需If语句)
你的示例代码无法运行的核心问题是:typeof只能返回JavaScript标准的类型字符串(如"string"、"object"、"function"等),无法识别自定义的"time:Date"这类类型标识,导致所有分支都无法命中。以下是两种场景下的最佳实现:
场景1:判断内置对象类型(如Date、Array)
使用Object.prototype.toString.call()获取精确的内置类型标识,再结合Match语句匹配:
const getTypeLabel = (val) => { const typeName = Object.prototype.toString.call(val).slice(8, -1); return match (typeName) { case "Date" => "Date"; case "String" => "String"; case "Array" => "Array"; default => "Invalid"; }; };
场景2:判断自定义类/实例
如果你是要匹配自定义类的实例,直接用instanceof结合Match的条件模式:
// 先定义自定义类 class TimeUtc {} class DateTime {} class CustomDate {} const getTypeLabel = (val) => { return match (val) { case val if val instanceof CustomDate => "Date"; case val if val instanceof TimeUtc => "Time:Utc"; case val if val instanceof DateTime => "DateTime"; default => "Invalid"; }; };
TypeScript 增强版(类型安全)
在TS中可以用类型谓词实现更严格的类型匹配:
class TimeUtc {} class DateTime {} class CustomDate {} // 类型谓词函数,用于类型守卫 function isCustomDate(val: unknown): val is CustomDate { return val instanceof CustomDate; } function isTimeUtc(val: unknown): val is TimeUtc { return val instanceof TimeUtc; } function isDateTime(val: unknown): val is DateTime { return val instanceof DateTime; } const getTypeLabel = (val: unknown): string => { return match (val) { case isCustomDate => "Date"; case isTimeUtc => "Time:Utc"; case isDateTime => "DateTime"; default => "Invalid"; }; };
内容的提问来源于stack exchange,提问作者sahanhe
相关产品推荐
相关产品推荐

