TLDR;
这个可以吗?还是不好的做法?
function isUndefined (payload: any): payload is undefined | void {
return payload === undefined
}
语境
在TypeScript中,我有一个函数可以返回内容或
undefined
或void
。诸如事件处理程序之类的东西可以返回修改后的有效负载,或者开发人员可以选择不返回任何内容或返回未定义的内容以防万一他们不会修改有效负载:
function eventHandler <T extends {[key: string]: any}> (payload: T): Modified<T> | undefined | void {
// ... implementation
}
然后,我有一个类型检查器,需要检查它是否返回除void或undefined以外的内容:
const result = eventHandler(payload)
if (result !== undefined) {
// we have a modified payload!
}
但是,上面的代码片段我是否出错,因为它说即使
result !== undefined
仍然可以是void
?我认为这很特殊,因为
void
应该与undefined
相同。所以我做了这个类型检查器来解决它:
function isUndefined (payload: any): payload is undefined | void {
return payload === undefined
}
这解决了我的问题,但是我的问题是:
这个可以吗?还是不好的做法?
最佳答案
void
不是undefined
。 void
表示没有返回值。 undefined
是在运行时未定义的值的类型。
的确,在运行时不返回任何值的函数会返回undefined
,但是在TS类型系统中,我们选择了使不存在返回值的特殊情况。
例如,分配(a) => void to (a) => number | undefined
可能是一个错误,尽管在运行时是安全的。
通常,除了函数的返回类型外,不要使用void。对于其他所有内容,请使用undefined
。
因此,是的,我们将需要对undefined
和void
使用不同的检查。