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
相关产品推荐
相关产品推荐

