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
而不是函数不会给我任何错误。

您没有告诉use
CreateValidateObjectType
定义为什么,但是从错误中,我假设它不是函数。因为它不是一个函数,所以在执行此操作时:

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,
  })
}