Typescript:作为函数参数分别检查任何接口属性的键和类型组合

Typescript:作为函数参数分别检查任何接口属性的键和类型组合,typescript,interface,Typescript,Interface,给定一个带有接口的变量: 接口模型{ textField?:字符串; 意义:布尔; 百分比:数字; 只读someMap:{ [键:字符串]:字符串; }; getMeSomething(代码:string):string; } let模型:模型; 我想在该函数中分别检查键名和值类型: const setField=(fieldName:WritableKeysOf,fieldValue:Model[WritableKeysOf])=>{ 模型[字段名]=字段值; } 所以当我这样使用它时:

给定一个带有接口的变量:

接口模型{
textField?:字符串;
意义:布尔;
百分比:数字;
只读someMap:{
[键:字符串]:字符串;
};
getMeSomething(代码:string):string;
}
let模型:模型;
我想在该函数中分别检查键名和值类型:

const setField=(fieldName:WritableKeysOf,fieldValue:Model[WritableKeysOf])=>{
模型[字段名]=字段值;
}
所以当我这样使用它时:

setField('textField',1);
设置字段(“不存在”,真);
setField('someMap',{'it':'not matter'});
我有错误,但这些都可以:

setField('textField',未定义);
设置字段(“百分比”,2);
设置字段('getMeSomething',code=>code+'suffix');
我想实现:

  • fieldName
    应与任何接口道具名称匹配,但与
    readonly
    ✔️
  • 字段值
    应与接口中的任何可能类型匹配,但与
    只读
    ✔️
  • 将两者结合起来,这样我就可以设置一个没有错误的值❌
我找到了一些技巧来删除
只读
,并正确获取这两个参数的类型,但出于某种原因,
model[fieldName]
现在是
从不
。也许我可以用一些泛型来告诉我到底要检查哪个接口

如同,您可以引入约束类型参数,将
字段值
的类型与相应的
字段名
相关联:

const setField = <T extends WritableKeysOf<Model>> (fieldName: T, fieldValue: Model[T]) => {
  model[fieldName] = fieldValue;
}
const setField=(fieldName:T,fieldValue:Model[T])=>{
模型[字段名]=字段值;
}
作为一个参数,您可以引入一个约束类型参数,将
字段值
的类型与相应的
字段名
相关联:

const setField = <T extends WritableKeysOf<Model>> (fieldName: T, fieldValue: Model[T]) => {
  model[fieldName] = fieldValue;
}
const setField=(fieldName:T,fieldValue:Model[T])=>{
模型[字段名]=字段值;
}
设置字段(键:T,值:模型[T])
设置字段(键:T,值:模型[T])