Нет проверки плавающих обещаний в TypeScript - PullRequest
0 голосов
/ 19 июня 2020

У меня есть асинхронная функция, возвращающая обещание. Теперь я хочу, чтобы TypeScript проверял, выполняю ли я обещания. Если я когда-либо пропустил добавление await, он должен показать предупреждение. Как я могу это сделать?

export const getData = async (id: number): Promise<number> => {
  return axios.get(
    `/api/human/${id}`
  );
};

// Should show error as await is missing
console.log(getData(1));

// Should just work
console.log(await getData(2));

Возможно, этого нельзя добиться с помощью Typescript, но eslint. Тогда, пожалуйста, помогите мне, как это сделать.

Если единственный вариант - no-floating-promises из tslint , это не помогает, так как он устарел и не используется в моей базе кода .

Обновление: как указал @ son-nguyen, ожидание ax ios, а затем приведение обещания является избыточным. Поэтому я удалил ожидание для этого.

1 Ответ

0 голосов
/ 19 июня 2020

getData четко заявляет, что возвращает обещание, в то время как вы возвращаете значение await ed, которое не является обещанием. Тогда вызов await getData() является проблематичным c, но проверка типа не завершается ошибкой, потому что значение stati c безопасно преобразовать как Promise (путем простого разрешения на него). Он работает без проблем, но выглядит некорректно, потому что, как правило, когда вы возвращаете обещание (которое вы получаете от вызова axios.get()), вам не нужно await его, о чем хороший редактор вас предупредит. .

Удаление await теперь делает результат getData() действительно обещанием, вы можете использовать его как обычно, передавая по цепочке или await ing для получения окончательного значения. Выгода в том, что теперь компилятор или линтер лучше знают ваши намерения и могут дать лучший совет.

export const getData = async (id: number): Promise<number> => {
  return axios.get(
    `/api/human/${id}`
  );   // returns a true Promise to be awaited outside
};
...