You need to enable JavaScript to run this app. TypeScript 如何定义匹配接口属性约束的函数入参类型
优惠活动
大模型
产品
解决方案
定价
更多

TypeScript 如何定义匹配接口属性约束的函数入参类型

类型定义实现方案

直接使用TypeScript内置Partial映射类型

这是最简洁的实现方式,完全覆盖所有校验规则,改写后的完整代码如下:

interface ITest {
    prop1: number
    prop2: string
}

const obj: ITest = { prop1: 10, prop2: 'asd' };

// 入参类型标记为 Partial<ITest> 即可满足全部约束
const func = (newValue: Partial<ITest>) => {
    obj = {...obj, ...newValue};
}

该类型的约束完全匹配需求:

  • 入参的键名范围被严格限制为ITest定义的prop1、prop2,传入其他任意键(例如prop3)会直接触发类型报错
  • 每个合法键对应的值类型和ITest定义完全一致:比如给prop1传字符串、给prop2传数字都会被类型检查拦截
  • 所有字段为可选状态:支持只传{prop1: 100}、只传{prop2: 'test'}甚至空对象{}的合法入参,适配局部对象更新的场景

手写等价自定义类型

如果不想依赖内置的Partial,可以手动实现效果完全一致的映射类型:

type PartialITest = {
    // 遍历ITest的所有合法键,标记为可选,同时保留原键对应的值类型
    [K in keyof ITest]?: ITest[K]
}

核心实现逻辑拆解:

  • 用keyof ITest固定入参的键名范围,从根源杜绝接口外的额外键
  • 用索引访问类型ITest[K]严格匹配对应键的值类型,不会出现值类型被放宽为any的问题
  • 键后的?标记将所有字段设为可选,满足“可单独传某一个字段做局部更新”的要求

常见错误写法避坑

  • 若写成{ [key in keyof ITest]: ITest[key] }但漏了可选标记?,会要求入参必须同时传全prop1和prop2,不符合局部更新的入参要求
  • 若写成{ [key: string]: any },则完全没有键名、值类型的约束,传入任意结构的对象都不会报错,完全不满足校验规则

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.02 00:24:04