是否可以编写TypeScript类型防护来检查给定对象是否为空?
我可以做相反的事情,即编写类型保护,检查对象是否为非空(在此处使用lodash isEmpty):
isNonEmpty<T>(object: T | {}): object is T {
return !_.isEmpty(object);
}
writeTextIfAny(param: { text: string } | {}): void {
if (isNonEmpty(param)) {
console.log(param.text);
}
}
但是,当我尝试扭转事情时,出现了问题:
isEmpty<T>(object: T | {}): object is {} {
return _.isEmpty(object);
}
writeTextIfAny(param: { text: string } | {}): void {
if (!this.isEmpty(param)) {
// param is never, not { text: string }
}
}
那是为什么?
答案 0 :(得分:2)
通常,TypeScript对象类型包括具有至少个指定属性的任何对象。这意味着{}
实际上是任何对象的类型。因此,如果您的自定义类型卫士声称param
不是{}
,那么它也不是{text: string}
,并且您将得到never
。 (实际上,T | {}
简化为{}
,尽管maybe it shouldn't quite。)
我不相信有一种方法可以为空对象编写类型防护。如果您对这种情况有更多的看法,我可能会有更多建议。
答案 1 :(得分:0)
简单的解决方案:
guard (self.object != nil) else { return }
答案 2 :(得分:-1)
您应该能够使用!isNotEmpty(yourVar)
来实现所需的行为