Typescipt 中是否有“不承诺”类型?

nko*_*3zf 3 types void promise typescript

我正在编写 TypeScript 并希望创建类似Exclude<void, Promise<void>>, 允许void但不允许 的东西Promise<void>

type A = (a: number) => Promise<void>
type B = (a: number) => void

declare let a: A
declare let b: B
// it does not cause type error
b = a

// what i want to do...
// but it is identical to B
type C = (a: number) => Exclude<void, Promise<void>>
Run Code Online (Sandbox Code Playgroud)

然而,Exclude<void,Promise<void>>似乎与 相同void

有没有一些方法可以创建这样的类型?

luk*_*ter 5

正如TypeScript 文档所说:

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
Run Code Online (Sandbox Code Playgroud)

但请注意,事实并非如此:

promiseFunction = voidFunction; // error
numberFunction = voidFunction; // error
stringFunction = voidFunction; // error
undefinedFunction = voidFunction; // error
Run Code Online (Sandbox Code Playgroud)

我认为针对您的情况更好的解决方案实际上是用作undefined返回类型而不是void

undefinedFunction = promiseFunction; // error
undefinedFunction = numberFunction; // error
undefinedFunction = stringFunction; // error
Run Code Online (Sandbox Code Playgroud)

然而,这样做的问题是,当您声明具有返回类型的函数时,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
Run Code Online (Sandbox Code Playgroud)

操场