正如TypeScript documentation 所说:
void 有点像any 的反面:根本没有任何类型。
由于没有任何类型,因此从其中排除某些东西是没有意义的。
之所以可以将类型A 分配给类型B 的原因是,简单地说,只要忽略返回类型,任何函数都可以是void。因为void 的返回类型本质上意味着您不能使用返回值。而且这个属性与任何函数都兼容,你只需要忽略它返回的任何东西。
这不仅会影响Promise<void>,还会影响所有返回类型:
declare let voidFunction: (a: number) => void;
declare let promiseFunction: (a: number) => Promise<void>;
declare let numberFunction: (a: number) => number;
declare let stringFunction: (a: number) => string;
declare let undefinedFunction: (a: number) => undefined;
voidFunction = promiseFunction; // no error
voidFunction = numberFunction; // no error
voidFunction = stringFunction; // no error
voidFunction = undefinedFunction; // no error
但是,请注意,事实并非如此:
promiseFunction = voidFunction; // error
numberFunction = voidFunction; // error
stringFunction = voidFunction; // error
undefinedFunction = voidFunction; // error
我认为对您的情况更好的解决方案实际上是使用undefined 作为返回类型而不是void:
undefinedFunction = promiseFunction; // error
undefinedFunction = numberFunction; // error
undefinedFunction = stringFunction; // error
但问题在于,当您声明一个返回类型为 undefined 的函数时,您实际上需要有一个 return undefined; 语句,而您可能不希望这样做。
为了解决这个问题,我相信undefined | void 将是返回类型的一个很好的折衷方案:
declare let undefinedVoidFunction: (a: number) => undefined | void;
undefinedVoidFunction = promiseFunction // error
undefinedVoidFunction = numberFunction // error
undefinedVoidFunction = stringFunction // error
undefinedVoidFunction = undefinedFunction // no error
undefinedVoidFunction = voidFunction // no error
Playground