为空对象键入Guard

时间:2018-09-04 12:12:06

标签: typescript

是否可以编写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 }
    }
}

那是为什么?

3 个答案:

答案 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)来实现所需的行为