【发布时间】:2020-09-30 11:43:51
【问题描述】:
所以我有以下问题:
给定一个键,我将从字典中获取一个函数,该函数可以是异步函数或普通函数。但是当我将 await 关键字放在 func 之前,编译器会抱怨:
TS2349:无法调用其类型缺少调用签名的表达式。类型“Promise”没有兼容的调用签名。
我该如何解决这个问题?开关将是唯一的解决方案?
简单示例:
function example(aux: string){
return string
}
function async main(key, ...args): Promise<Boolean>{
dictionary = {
"example": example
}
let func = dictionary[key]
if (func instanceof Promise) { // If the function is a promise we wait
let result = await func(...args) //<-- PROBLEM HERE
} else {
let result = func(...args)
}
}
return result
此处为完整示例:
export enum ValidatorsTypes {
EMAIL = 1,
EMAIL_IS_UNIQUE = 2
}
export function validEmail (text: any) {
const pattern = /^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/
return pattern.test(text) || 'Invalid e-mail.'
}
export async function isEmailUnique (text: any): Promise<boolean> {
let response = await UserService.list(1, 1, { 'email': text })
// if the number of matches is 0, then is unique
return response[1] === 0
}
export async function isAnswerValid (validatorsTypes: Array<ValidatorsTypes>, ...args: any) : Promise<boolean> {
let availableValidators = {
[ValidatorsTypes.EMAIL]: validEmail,
[ValidatorsTypes.EMAIL_IS_UNIQUE]: isEmailUnique
}
let results = []
for (let rule of validatorsTypes) {
let func = availableValidators[rule]
if (func instanceof Promise) { // If the function is a promise we wait
let result = await func(...args) //<-- PROBLEM HERE
results.push(result)
} else {
results.push(func(...args))
}
}
return !results.some(v => v === false)
}
【问题讨论】:
-
Aron 提供了解决方案。我只想说,我认为您应该决定是否真的要同步运行所有规则(即,在当前可能是异步的规则完成之前不要继续前进)。如果是这样,我建议您在返回错误的情况下尽早返回(然后您可以避免存储此结果数组。否则,我建议您“同时”发送所有内容,或者它们都返回正确,或者一个返回 false,您返回 false 并取消所有其他事情(如果可以的话)。