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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 11:30:01