TypeScript无法调用类型缺少调用签名的表达式



执行以下行会给我Error:(288, 25) TS2349: Cannot invoke an expression whose type lacks a call signature. Type 'CreateValidateObjectType | ((param: string) => CreateValidateObjectType)' has no compatible call signatures.

validationMap[FORM_ELEMENTS_NAMES.LAST_NAME_INPUT]('aaaa')

这是validationMap及其类型

type ValidationMapType = {
[key: string]: CreateValidateObjectType | ((param: string) => CreateValidateObjectType);
};
const validationMap: ValidationMapType = {
[FORM_ELEMENTS_NAMES.FIRST_NAME_INPUT]: createValidationObject({
required: true,
minLength: 2,
maxLength: 25,
}),
[FORM_ELEMENTS_NAMES.LAST_NAME_INPUT]: (param: string) => createValidationObject({
required: true,
minLength: 2,
maxLength: 25,
})
}

不将validationMap作为函数调用不会给我任何错误。

您没有告诉useCreateValidateObjectType的定义,但从错误中,我认为它不是一个函数。由于它不是一个函数,当你这样做时:

validationMap[FORM_ELEMENTS_NAMES.FIRST_NAME_INPUT]

你可以得到也可以不得到函数。但你的代码假设它总是一个函数,因为你会立即无条件地调用它:

validationMap[FORM_ELEMENTS_NAMES.FIRST_NAME_INPUT]('aaaa')

Typescript指出,根据您定义的类型,您必须首先检查它是否是一个函数。例如:

const validation = validationMap[FORM_ELEMENTS_NAMES.FIRST_NAME_INPUT];
let result: CreateValidateObjectType;
if (typeof validation === 'function') {
result = validation('aaaa');
} else {
result = validation;
}

如果你提前知道哪些属性将是函数,哪些属性不会,那么你可以放弃使用索引类型,这样typescript就可以知道";啊,是的,LAST_NAME_INPUT属性;这是一个函数";。

const validationMap = { // <--- no longer an index type
[FORM_ELEMENTS_NAMES.FIRST_NAME_INPUT]: createValidationObject({
required: true,
minLength: 2,
maxLength: 25,
}),
[FORM_ELEMENTS_NAMES.LAST_NAME_INPUT]: (param: string) => createValidationObject({
required: true,
minLength: 2,
maxLength: 25,
})
}

这意味着您不需要检查,但也意味着您不能像索引类型允许的那样在运行时任意添加/删除键。

最新更新