You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从TypeScript联合类型中提取指定成员解决类型赋值报错?

类型缩小不生效的原因

你使用的Omit<Combined, 'src'>不会生成联合类型,最终得到的是单一类型{ prop: string | number }。TS无法对这种单类型内部的属性联合做跨属性的关联收窄,你判断prop是number之后,TS只会把prop本身的类型收窄为number,但不会认为这个对象和联合类型里的String接口存在关联,所以拼接src: 'str'之后还是无法匹配Combined类型。

从联合类型提取指定成员的方案

TS内置的Extract工具类型可以直接实现这个需求,你只需要通过成员的独有特征匹配即可,不需要拿到原接口的定义:

// 提取Combined中src为string的成员,也就是你需要的String接口类型
type TargetType = Extract<Combined, { src: string }>

// func1的props直接用这个类型去掉src即可
function func1(props: Omit<TargetType, 'src'>) {
  func2({src: 'str', ...props}) // 无类型报错
}

如果你确实需要保留之前的类型判断写法,可以自己实现一个分发版本的Omit,让Omit操作作用在联合类型的每个成员上,得到的结果还是联合类型,这时候类型缩小就会正常生效:

type DistributeOmit<T, K extends PropertyKey> = T extends unknown ? Omit<T, K> : never

function func1(props: DistributeOmit<Combined, 'src'>) {
  if (typeof props.prop === 'number') {
    func2({ src: 'str', ...props }) // 类型正确收窄,无报错
  }
}

内容的提问来源于stack exchange,提问作者Simon Dubek

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.10 11:00:03