TypeScript无法调用其类型缺少调用签名的表达式
执行第行下方的操作会产生TypeScript无法调用其类型缺少调用签名的表达式,typescript,Typescript,执行第行下方的操作会产生错误:(288,25)TS2349:无法调用其类型缺少调用签名的表达式。类型“CreateValidateObjectType”|((参数:string)=>CreateValidateObjectType)”没有兼容的调用签名。 validationMap[表单元素名称.姓氏输入]('aaaa') 下面是validationMap及其类型 type ValidationMapType = { [key: string]: CreateValidateObjectTy
错误:(288,25)TS2349:无法调用其类型缺少调用签名的表达式。类型“CreateValidateObjectType”|((参数:string)=>CreateValidateObjectType)”没有兼容的调用签名。
validationMap[表单元素名称.姓氏输入]('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就可以知道“啊,是的,姓氏输入属性;这是函数”
const validationMap={//createValidationObject({
要求:正确,
最小长度:2,
最大长度:25,
})
}
这意味着您不需要检查,但也意味着您不能在运行时随意添加/删除键,就像索引类型允许的那样。谢谢,据我所知,
ValidationMapType
中的union不会帮助我在不检查其类型的情况下使用validationMap
?因为您的union说属性可能是函数,也可能不是函数,所以您需要先检查类型,然后才能调用它。如果你知道它们总是函数,那么你可以改变类型,这样你就不需要检查了。我很抱歉!复制validationMap
的内容时出错。当前版本是否有任何更改?这有助于突出显示您有一些函数和一些非函数,但从类型和类型错误中已经清楚了这一点。因为你不知道你是否有一个函数,所以你不能调用它。在javascript中,当您尝试运行代码时,它可能会抛出TypeError。在typescript中,当您试图编译代码时,会收到一个通知。@akoko我在回答的另一部分中编辑了。如果您提前知道所有类型,您可能可以删除索引类型,然后映射的每个属性都是单个类型而不是联合类型
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,
})
}