如何将提取出的类型合并回原区分联合类型并覆盖指定分支
替换联合类型指定分支并保留其他分支的TypeScript实现
你可以通过 Exclude 工具类型先移除原联合类型A中需要被覆盖的分支,再和类型B合并,就能得到目标类型:
type A = { type: 'x', foo: boolean } | { type: 'y', bar: string } type B = Extract<A, { type: 'x' }> & { baz: number } // 生成新类型:用B替换A中type为'x'的分支,保留type为'y'的分支 type NewType = B | Exclude<A, { type: 'x' }>
验证这个类型的有效性:
- 允许创建type为'x'且包含foo、baz的对象:
const validX: NewType = { type: 'x', foo: false, baz: 3 }
- 保留了type为'y'的分支的有效性:
const validY: NewType = { type: 'y', bar: "hmm" }
- 不符合分支规则的对象会被TypeScript报错,比如缺少baz的type='x'对象:
// 报错:缺少属性'baz' const invalidX: NewType = { type: 'x', foo: false }
原理说明:
Exclude<A, { type: 'x' }>会从联合类型A中排除所有匹配{ type: 'x' }的分支,仅保留{ type: 'y', bar: string }- 将该结果与B合并,即可实现用B覆盖原A中type='x'分支的需求
内容的提问来源于stack exchange,提问作者spassvogel
相关产品推荐
相关产品推荐

