TypeScript中如何匹配类型到子类型且不保留额外属性
实现方案
这是TypeScript场景下的实现思路,核心是类型层面约束交集字段、运行时过滤非共有键,两步就能实现需求:
1. 核心逻辑
- 类型侧:用
keyof A & keyof B拿到两个类型的共有键,返回值类型约束为仅包含这些共有键的交叉类型,从类型层面避免多余字段 - 运行侧:过滤掉仅存在于单个对象里的键,只保留共有键赋值,运行时不会生成多余字段
2. 通用函数实现
function assignIntersection<T extends object, U extends object>(sourceObj: T, takeValueFrom: U): Pick<T & U, keyof T & keyof U> { const result = {} as Pick<T & U, keyof T & keyof U>; // 筛选两个对象的共有键 const commonKeys = Object.keys(takeValueFrom).filter(key => key in sourceObj) as Array<keyof T & keyof U>; commonKeys.forEach(key => { // 示例需求是取B的值,所以这里用takeValueFrom的字段值 result[key] = takeValueFrom[key]; }); return result; }
3. 效果测试
对应你给出的示例,调用效果如下:
type A = { a: string, b: string }; type B = { a: string }; const a: A = { a: 'b', b: 'c' }; const b: B = { a: 'j' }; const c = assignIntersection(a, b); // 运行时c的值为 { a: 'j' },类型为A & B,无任何多余字段
如果需要优先取A的字段值,只需要把赋值逻辑替换为result[key] = sourceObj[key]即可。
内容的提问来源于stack exchange,提问作者Christo S. Christov
相关产品推荐
相关产品推荐

