Javascript 导出的异步函数的Typescript调用签名错误

Javascript 导出的异步函数的Typescript调用签名错误,javascript,typescript,promise,async-await,Javascript,Typescript,Promise,Async Await,我有一个Typescript文件(colorTheme.ts)如下所示: export default (async (key) => { console.log(key) const themeImport = await import(`../build/theme/${key}/color.js`) return themeImport })() 然后我从一个单独的Typescript文件中引用这个函数,如下所示: import colorTheme from '../

我有一个Typescript文件(colorTheme.ts)如下所示:

export default (async (key) => {
  console.log(key)
  const themeImport = await import(`../build/theme/${key}/color.js`)
  return themeImport
})()
然后我从一个单独的Typescript文件中引用这个函数,如下所示:

import colorTheme from '../colorTheme'

colorTheme('test').then(color => {
  // do stuff
})
但是,我得到一个错误:

TS2349:无法调用其类型缺少调用签名的表达式。类型“Promise”没有兼容的调用签名

我在谷歌上搜索过,并尝试过以下内容:

export default (async (key: string) => {
  console.log(key)
  const themeImport = await import(`../build/theme/${key}/color.js`)
  return themeImport
})()
但是没有用。Typescript不是我的强项,它是一个我正在尝试使用的预先存在的环境。据我所知,我需要以某种方式设置承诺的类型,也许?但我不知道该怎么做


更新:为我要做的事情添加了更完整的代码示例。

看看后面的两个括号:

(async (x) => {
  console.log(x)
})() <--
结果的价值是什么?结果的值等于函数的返回值。如果它是一个正常函数,则等于一个立即解析为
未定义的函数。因为它是一个异步函数,我们不返回任何内容,这意味着返回的值是
未定义的
承诺

因此,你出口的是一个已经解决的承诺!但是那么参数x呢

这个函数接受一个参数
x
,但实际上没有传递任何内容。再次观察后面的括号,里面没有任何内容,因此如果执行代码,您将在控制台中看到
undefined

相反,如果您传递了一个参数,例如字符串,则会看到该字符串:

(async (x) => {
  console.log(x) // It prints banana!
})('banana')
在这里,您必须传递参数,然后立即调用函数并导出结果

让我们以更简单的方式重写
colorTheme.ts

1.添加一个变量 2.Return
未定义
(与不返回相同) 3.使用
Promise
代替
async
4.不要立即调用该函数
所以,这基本上就是您导出的内容。现在轮到你根据你想要得到的来修复它了

您在这里使用iLife试图做的是导出一个
Promise
。因为您正在执行一个
async
函数并返回它(一个async函数返回一个承诺)。你想干什么?我不认为返回一个
Promise
是可行的,导入一个文件会用更多的上下文更新代码示例。
const-themeImport=wait-import(`../build/theme/${key}/color.js`)
eeeuh我不确定它是否会起作用。除非
import
不是常规导入,否则此类代码将被传输,因此您将无法在编译后的代码上在运行时解析导入。此外,自调用匿名函数永远不会获得
参数。在这里使用IIFE有什么理由吗?。如果我手动传入键值(例如,
async()=>{const key='test'…
),它就会起作用.通过函数调用传递动态键的能力似乎给了我一个问题。当然,如果你声明它会起作用,问题是你为什么要使用IIFE。它太复杂了,你只需要导出一个应该返回承诺的函数。IIFE不应该以这种方式使用,请记住由于生命的本质,上述代码将立即执行,我不认为这是您想要的;)啊,好吧,这现在是有意义的。感谢您的详细回复!我添加了更多细节。我将所有内容都明确化,因为许多事情往往是隐含的,有人不知道它们
(async (x) => {
  console.log(x) // It prints banana!
})('banana')
const result = (async (x) => {
  console.log(x)
})();

export default result;
const result = (async (x) => {
  console.log(x)
  return undefined;
})();

export default result;
const result = (x => {
  console.log(x)
  return Promise.resolve(undefined);
})();

export default result;
const f = function (x) {
  console.log(x)
  return Promise.resolve(undefined);
}

const result = f(undefined);

export default result;