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

TypeScript:映射类型与判别联合的类型推断问题

TypeScript判别联合类型场景适配问题

我看过很多关于判别联合类型的讨论,但还没找到适配我特定场景的方案。现有代码如下:

type A = {label: 'a', options: {x: number}; text: string}; // label 用作标签
type B = {label: 'b', options: {y: string}; text: string};
type C = A | B;
type D<T extends C> = {
  label: T['label'];
  displayOptions: T['options'];
  complexValue: T extends B ? T['options']['y'] : never;
};
function f<U extends D<C>>(u: U) {
  if (u.label === 'a') {
    u.displayOptions // 推断类型为 {x: number} | {y: string},而非预期的 {x: number}
  }
}

在注释位置,我期望u.displayOptions的类型被推断为{x: number}——因为label本该作为判别标签工作,就像常见的判别联合类型逻辑那样。但实际推断结果还是{x: number} | {y: string}。

我推测问题出在D的定义上:它只是间接引用了T['label']和T['options']。如果在D里加个type: T属性,然后通过if (u.type.label === 'a')判断就能正常工作,但这个方案我没法用,原因有三个:

  • 我不想在D里包含T(或C)的全部属性,比如text;
  • 需要用到的属性可能会重命名,比如把options改成displayOptions;
  • 需要添加依赖于T的额外属性,比如complexValue。

有没有(最好是简单的)方案能满足这些需求?

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 06:33:29