TypeScript中如何为枚举类型重载逻辑非(!)运算符?
问题解答
先明确结论:TypeScript/JavaScript 不支持重载逻辑非运算符 !,你没法通过重载!来实现直接取枚举的相反值。因为!在JS里的固定作用是把任意值转成布尔类型后取反,比如!PathDirection.ASCENDING会得到false,完全不是你想要的另一个枚举值。
给你几个实用的替代方案:
1. 写个简单的工具函数
直接写个函数处理反向逻辑,清晰又好维护:
export enum PathDirection { ASCENDING = "ASCENDING", DESCENDING = "DESCENDING" }; function getOppositeDir(dir: PathDirection): PathDirection { return dir === PathDirection.ASCENDING ? PathDirection.DESCENDING : PathDirection.ASCENDING; } // 用起来很简单 let myVar = PathDirection.ASCENDING; myVar = getOppositeDir(myVar); // 现在是DESCENDING
2. 给枚举加静态方法
借助TypeScript的命名空间扩展,给枚举本身加个获取反向值的方法:
export enum PathDirection { ASCENDING = "ASCENDING", DESCENDING = "DESCENDING" }; namespace PathDirection { export function opposite(dir: PathDirection): PathDirection { return dir === PathDirection.ASCENDING ? PathDirection.DESCENDING : PathDirection.ASCENDING; } } // 使用示例 let myVar = PathDirection.ASCENDING; myVar = PathDirection.opposite(myVar);
3. 用映射对象匹配
如果以后枚举可能加新值,用映射对象会更灵活,新增值时只需要在映射里加对应关系就行:
export enum PathDirection { ASCENDING = "ASCENDING", DESCENDING = "DESCENDING" }; const oppositeDirMap: Record<PathDirection, PathDirection> = { [PathDirection.ASCENDING]: PathDirection.DESCENDING, [PathDirection.DESCENDING]: PathDirection.ASCENDING }; // 使用示例 let myVar = PathDirection.ASCENDING; myVar = oppositeDirMap[myVar];
这些方案都能满足你获取相反路径方向的需求,完全符合TS/JS的语言特性,比硬要重载运算符靠谱多了。
内容的提问来源于stack exchange,提问作者SnoAke
相关产品推荐
相关产品推荐

