TypeScript:如何基于现有类型定义更严格的限制类型
问题原因
你当前的交叉类型写法推导为never,通常是TypeScript对类原始属性和交叉类型重写属性的冲突处理逻辑导致的,要避免该问题,更稳妥的方式是先移除原有待限制的属性,再重新声明固定类型。
解决方案
方案1:构造限定类型
使用Omit工具类先移除Foo中原有foo属性定义,再交叉你需要的固定类型,无需重复声明已存在的bar属性:
type FooA = Omit<Foo, 'foo'> & { foo: 'a' }
方案2:搭配类型守卫实现双校验
结合你的业务场景,除了编译时类型限制,还需要运行时校验异常值,推荐补充类型守卫函数:
function isFooA(instance: Foo): instance is FooA { return instance.foo === 'a' } // 业务中使用示例 const queryRes: Foo = queryFooFromDB() // 你的查询方法返回原始Foo类型 if (isFooA(queryRes)) { // 该作用域内queryRes自动被推导为FooA类型,foo属性固定为'a' console.log(queryRes.foo) // 类型为'a' } else { // 处理foo不为'a'的异常逻辑 }
临时方案:类型断言
如果你能100%确认查询结果一定符合要求,也可以直接用类型断言跳过推导:
const queryRes = queryFooFromDB() as FooA
注意:类型断言不会做运行时校验,若实际返回结果不符合预期会存在隐式风险。
内容的提问来源于stack exchange,提问作者Thor Correia
相关产品推荐
相关产品推荐

