Ошибка подписи вызова машинописного текста для экспортированной асинхронной функции - PullRequest
2 голосов
/ 24 апреля 2019

У меня есть файл 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: Невозможно вызвать выражение, тип которого не имеет подписи вызова. Тип «Обещание» не имеет совместимых подписей вызовов.

Я гуглил и пробовал что-то вроде:

export default (async (key: string) => {
  console.log(key)
  const themeImport = await import(`../build/theme/${key}/color.js`)
  return themeImport
})()

Но безрезультатно. Typescript - это не моя сильная сторона, это уже существующая среда, в которой я пытаюсь работать. Насколько я понимаю, мне нужно как-то настроить типы для Promise, может быть? Но я не уверен, как это сделать.

Обновление: добавлен более полный пример кода для того, что я пытаюсь сделать.

1 Ответ

2 голосов
/ 24 апреля 2019

Посмотрите на две завершающие скобки:

(async (x) => {
  console.log(x)
})() <--

Вы выполняете функцию так, как вы ее объявили.Это так называемое IIFE: выражение вызова немедленно вызванной функции .

Давайте разделим экспорт, добавив переменную:

const result = (async (x) => {
  console.log(x)
})();

export default result;

Каково значение результата?Ну, значение результата равно возвращаемому значению функции.Если это была нормальная функция, она была бы равна функции, которая сразу же была бы разрешена как undefined.Поскольку это асинхронная функция, и мы ничего не возвращаем, это означает, что возвращаемое значение равно Promise из undefined.

Итак, то, что вы экспортируете, это уже решенное обещание!Но ... как насчет параметра x?

Ну, функция принимает параметр x, но вы фактически ничего не передаете.Посмотрите снова на завершающие скобки, внутри ничего нет, поэтому вы увидите undefined в консоли, если вы выполните код.

Если вместо этого вы передали аргумент, например строку, вы увидели эту строку:

(async (x) => {
  console.log(x) // It prints banana!
})('banana')

Итак, вот точка, в которой вам нужно передать аргумент, затем немедленно вызывается функция и экспортируется результат.

Давайте перепишем colorTheme.ts более простым способом:

1.Добавьте переменную

const result = (async (x) => {
  console.log(x)
})();

export default result;

2.Возврат undefined (это не возврат)

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

export default result;

3.Используйте Promise вместо async

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

export default result;

4.Не вызывайте функцию немедленно

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

const result = f(undefined);

export default result;

Итак, это в основном то, что вы экспортировали.Теперь вам нужно исправить это в соответствии с тем, что вы хотите получить!

...