使用 Typescript,我尝试编写一个函数,该函数接受通用对象和验证规则的键值映射以应用于每个属性。当使用 keyof 属性来验证“validators”对象中传递的 key 是否在 TObject
泛型中时,我得到 An indexsignatureparametertypemustbe'string'or'number'
。后来,当尝试访问验证器
中的值时,我得到No indexsignature with a type 'string' was found on type '{}'
。
function isValid<TObject>(
o: TObject,
validators: {
[key: keyof TObject]: (o: TObject) => boolean;
}
) {
for (const validator in validators) {
if (!validators[validator](o)) {
return false;
}
}
return true;
}
type Todo = {
text: string;
details: string;
completed: boolean;
};
console.log(
isValid<Todo>(
{
text: "mow yard",
details: "needs to be completed asap",
completed: false
},
{
text: (o: Todo) => o.text.length > 0,
completed: (o: Todo) => !!o.completed
}
)
);
最佳答案
您应该使用关键字 in
而不是 :
,因为 :
用于索引类型(字符串、数字、符号)
function isValid<TObject>(
o: TObject,
validators: {
[key in keyof TObject]: (o: TObject) => boolean;
}
) {
for (const validator in validators) {
if (!validators[validator](o)) {
return false;
}
}
return true;
}
如果 key 是可选的,请使用?
:
validators: {
[key in keyof TObject]?: (o: TObject) => boolean;
}
关于Typescript 使用 keyof 时,索引签名参数类型必须为 'string' 或 'number',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66838689/