TypeScript如何复制枚举指定成员以避免类型比较错误?
解决TypeScript不同枚举值相等但类型不兼容的问题
在TypeScript中,即使两个枚举的字面量值完全一致,它们的类型依然是独立的,直接比较会触发类型错误。要创建仅包含Test中CUSTOMERS和CASHFLOW成员的Test2并消除比较错误,可采用以下两种方案:
方案1:用const对象+类型别名模拟枚举(推荐)
这种方式直接复用原枚举的成员值和类型,从根源上保证类型兼容:
enum Test { CUSTOMERS = 'CUSTOMERS', CASHFLOW = 'CASHFLOW', SUPPLIERS = 'SUPPLIERS', DEBTS = 'DEBTS', } // 定义Test2的成员类型为Test的子集 type Test2 = Pick<typeof Test, 'CUSTOMERS' | 'CASHFLOW'>; // 创建Test2对象,复用Test的成员值 const Test2: Test2 = { CUSTOMERS: Test.CUSTOMERS, CASHFLOW: Test.CASHFLOW, } as const; // 此时比较不会触发类型错误 if (Test.CUSTOMERS === Test2.CUSTOMERS) { console.log("值相等,类型兼容"); }
方案2:坚持使用枚举类型
如果必须用枚举定义Test2,可以复用Test的成员值,再通过以下方式消除比较错误:
enum Test { CUSTOMERS = 'CUSTOMERS', CASHFLOW = 'CASHFLOW', SUPPLIERS = 'SUPPLIERS', DEBTS = 'DEBTS', } // 复用Test的成员值定义Test2枚举 enum Test2 { CUSTOMERS = Test.CUSTOMERS, CASHFLOW = Test.CASHFLOW, } // 方法A:使用类型断言 if (Test.CUSTOMERS === Test2.CUSTOMERS as Test.CUSTOMERS) { console.log("值相等"); } // 方法B:转为字符串类型后比较 if (Test.CUSTOMERS === String(Test2.CUSTOMERS)) { console.log("值相等"); }
方案1无需额外的类型断言操作,更符合TypeScript的类型安全原则,是优先推荐的实现方式。
内容的提问来源于stack exchange,提问作者Gaylord.P
相关产品推荐
相关产品推荐

