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
相关产品推荐
相关产品推荐

