TypeScript如何限制patch函数仅接收目标对象已存在的属性
可以通过TypeScript类型系统实现该限制,只需要调整patchable函数的类型定义即可。
实现思路
给patch方法的入参添加类型约束:
- 基础方案使用TypeScript内置工具类型
Partial<T>:该类型会将泛型T的所有属性转为可选,天然限定了只能使用T中已存在的键,搭配TypeScript默认的对象字面量多余属性检查,就可以直接拦截传入不存在字段的操作 - 严格方案可以搭配
Record<string, never>交叉类型:即使传入提前声明的非字面量变量,也会拦截携带额外属性的入参
修改后完整代码
class Test{ a:number; b:number; } var c:Test={a:0,b:1} function patchable<T>(obj:T){ return { // 基础约束写法,如需更严格可替换为 Partial<T> & Record<string, never> patch:function(prop: Partial<T>){ return patchable({...obj,...prop}) }, value:function():T{return obj} } } // 此行会直接报类型错误:对象字面量只能指定已知属性,"notAllow" 不存在于类型 "Partial<Test>" 中 c=patchable(c).patch({notAllow:94}).value() // 合法调用示例 c=patchable(c).patch({a: 100}).value()
内容的提问来源于stack exchange,提问作者Fan Cheung
相关产品推荐
相关产品推荐

