打字稿中有'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
我正在编写 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 ofany
: 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