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

如何创建传入额外属性时会报错的Partial类型?

解决TypeScript中限制对象仅含指定部分属性的问题

你需要实现的是仅接受目标对象的部分属性、同时严格禁止额外属性传入的类型约束,当前泛型写法因TypeScript结构类型特性,无法拦截额外属性。以下是两种可行的解决方案:

方案1:定义精确类型约束工具

先创建一个Exact工具类型,确保传入的类型完全匹配目标结构,无额外属性:

type Exact<T, U> = T extends U ? (U extends T ? T : never) : never;

type TargetObject = {
  a: string;
  b: string;
  c: string;
};

const fn = <T extends Exact<T, Partial<TargetObject>>>(param: T) => {
  console.log(param);
};

测试验证:

  • 正常通过:fn({ a: "a" }); ✅
  • 正常通过:fn({ a: "a", b: "b" }); ✅
  • 触发错误:fn({ a: "a", b: "b", d: "d" }); ❌(提示类型不满足Exact约束)

方案2:直接约束额外属性为never

无需额外定义工具类型,直接在泛型约束中限制非目标属性的类型为never:

type TargetObject = {
  a: string;
  b: string;
  c: string;
};

const fn = <T extends Partial<TargetObject> & Record<Exclude<keyof T, keyof TargetObject>, never>>(param: T) => {
  console.log(param);
};

原理说明:Exclude<keyof T, keyof TargetObject>会提取T中不属于目标对象的键,Record要求这些键对应的属性类型必须是never——而传入实际值(如"d": "d")的类型为string,与never不兼容,因此会触发类型错误。

原代码失效原因

原代码中T extends Partial<Object>仅要求T包含目标对象的部分属性,但TypeScript的结构类型系统允许额外属性存在(只要目标属性都符合要求)。泛型T会捕获完整的传入字面量类型,而该类型确实是Partial<Object>的子类型,因此不会报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 09:10:09