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

TypeScript区分联合类型转换问题:同类型标签接口转换报错

解决方案

TypeScript无法自动推断泛型函数返回值的具体联合分支,是因为它会将item.type视为'A' | 'B'联合类型,而非与泛型参数T绑定的具体字面量类型。以下是无需类型断言(as)且无需枚举子类型的实现方式:

type FooItem = {
  type: 'A'
}

type BarItem = {
  type: 'B'
}

type Item = FooItem | BarItem;

type FooThing = {
  type: 'A'
}

type BarThing = {
  type: 'B'
}

type Thing = FooThing | BarThing;

type ConvertResult<T extends Item> = Extract<Thing, { type: T['type']}>;

function convert<T extends Item>(item: T): ConvertResult<T> {
  const result: ConvertResult<T> = {
    type: item.type
    // 实际场景中添加其他属性的转换逻辑即可
  };
  return result;
}

原理说明

通过显式声明result变量的类型为ConvertResult<T>,触发TypeScript在泛型约束下的精确类型检查:

  • 当输入T为FooItem时,ConvertResult<T>会被解析为FooThing,TypeScript会验证{type: item.type}符合FooThing的类型要求;
  • 当输入T为BarItem时,同理会验证符合BarThing的类型要求。

如果实际场景中Item和Thing包含更多属性,只需在result对象中补充对应的转换逻辑,TypeScript会自动校验属性是否匹配目标类型。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 13:53:22