TypeScript异构枚举赋值给对象参数属性时类型检查失败的疑问
TypeScript异构枚举赋值给对象参数属性时类型检查失败的疑问
嘿,这个问题我刚接触TypeScript异构枚举的时候也踩过一模一样的坑!咱们一点点拆解来看:
首先看你定义的异构枚举,里面既有字符串类型的Unknown(值为''),又有数字类型的Bond、Cash,这种混合了不同类型成员的枚举,TypeScript对它的类型校验逻辑会更严格。
先说说为啥t2(AssetType.Bond)能顺利通过:当你直接把枚举的数字成员传给接收number类型的函数参数时,TypeScript允许这种隐式转换——毕竟AssetType.Bond的底层值就是数字0,和number类型天生兼容。
那t1({ assetType: AssetType.Bond })为啥会报错呢?这就涉及到TypeScript对新鲜对象字面量的严格检查规则了:当你直接把一个对象字面量作为函数参数传递时,TypeScript会默认把这个对象的属性类型拓宽为整个枚举类型(也就是AssetType,它是字符串和数字的联合类型),而不是你传入的具体成员AssetType.Bond的类型。
而AssetType因为包含了字符串类型的成员Unknown,整个枚举类型和number类型是不兼容的(毕竟谁也没法保证这个枚举值不会是字符串),所以就触发了类型不匹配的报错。
如果想让t1也能通过类型检查,有几个简单的解决办法:
- 用
const断言把属性类型锁定为具体的枚举成员:t1({ assetType: AssetType.Bond as const }) - 显式给对象字面量指定类型:
t1({ assetType: AssetType.Bond } as { assetType: number }) - 把异构枚举改成纯数字枚举(比如把
Unknown的值改成-1这类数字),这样整个AssetType类型就和number完全兼容了,自然不会报错
备注:内容来源于stack exchange,提问作者Lin Du
相关产品推荐
相关产品推荐

