在TypeScript中未检查“无效”返回类型–防止浮动承诺吗?

问题描述

在TypeScript 3.9.7中运行,这与编译器无关:

const someFn: () => void = () => 123;

我发现了this answer,这说明这是设计使然。我得到了一些背后的理由(基本上,在将函数作为参数传递时,您应该能够忽略返回类型)。

但是,关于诺言的故事却变得与众不同:

const someFn: () => void = () =>
  new Promise((resolve,reject) => reject(Error('onoez')));
someFn();

我正在使用eslint的{​​{1}}规则检查我的代码,以避免未处理的承诺被拒绝。在上面的脚本中,由于linter认为@typescript-eslint/no-floating-promises不返回任何内容,因此不会警告我。

这是我必须忍受的东西吗?如果一个函数接受一个someFn类型的回调,而我给它传递了一个异步函数,则编译器不会警告我,并且坏事将开始发生。我能以某种方式避免这种情况吗?

解决方法

返回类型void意味着打字稿将不允许您使用返回值,无论它是什么。但是,正如您注意到的那样,这并不妨碍返回任何东西。您不会改变这种行为。

() => void意味着您不在乎返回值是什么,因为您不打算使用它。但是,在这种情况下,您确实会在意。

因此,您可以声明一个函数类型,该函数类型使用返回类型undefined来强制其不返回 any 值。

const someFn: () => undefined = () =>
  // Type 'Promise<unknown>' is not assignable to type 'undefined'.
  new Promise((resolve,reject) => reject(Error('onoez')));