打字稿中有'not promise'类型吗?

Is there 'not promise' type in typescipt?

我正在编写 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>>

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

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

正如 TypeScript documentation 所说:

void is a little like the opposite of any: the absence of having any type at all.

因为它没有任何类型,所以排除一些东西是没有意义的。

之所以可以将类型A赋值给类型B,简单的说,只要忽略return类型,任何函数都可以是void .因为 return 类型的 void 本质上意味着您不能使用 return 值。而且这个 属性 兼容任何函数,你只需要忽略它是什么 returning.

这不仅会影响 Promise<void>,还会影响所有 return 类型:

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 作为 return 类型而不是 void:

undefinedFunction = promiseFunction; // error
undefinedFunction = numberFunction; // error
undefinedFunction = stringFunction; // error

然而,问题在于,当您声明一个 return 类型 undefined 的函数时,您实际上需要一个 return undefined; 语句,而您可能并不想要。

为了解决这个问题,我认为 undefined | void 是 return 类型的一个很好的折衷方案:

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