有人可以推荐如何缩小
validateField
函数中的类型吗?
type TStringValidator = (v: string) => void;
type TNumberValidator = (v: number) => void;
type TFields = 'inn' | 'amount';
interface IValidators {
inn: TStringValidator[];
amount: TNumberValidator[];
}
const handleString: TStringValidator = (value: string) => {};
const handleNumber: TNumberValidator = (value: number) => {};
const validators = {
inn: [handleString],
amount: [handleNumber],
} satisfies IValidators;
function validateField(field: TFields, value: string | number) {
const fieldValidators = validators[field];
for (const validator of fieldValidators) {
// Problem is here
const result = validator(value);
}
return;
}
链接到TS 游乐场。
期望
validator(value)
调用不会抛出TS错误:
Argument of type 'string | number' is not assignable to parameter of type 'never'.
Type 'string' is not assignable to type 'never'.(2345)
(parameter) value: string | number
很明显,TS 编译器无法根据
field
值清楚地获取动态验证器的类型。
也许一些 validateField
重构可以有所帮助。
我认为这里的问题是你的值是
string
或number
并且TS不知道循环内的确切类型验证器(TStringValidator
或TNumberValidator
)。现在我认为你的结构有点不舒服,但你仍然可以让它像这样工作:
function validateField(field: TFields, value: string | number) {
const fieldValidators = validators[field];
Object.keys(validators).forEach(key => {
if (key === 'inn' && typeof value === 'string') {
const result = validators[key][0](value)
}
})
return;
}
您始终可以改进上面的代码,但您明白了。