空对象的类型保护

kre*_*erd 2 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

然而,当我试图扭转局面时,出现了问题:

isEmpty<T>(object: T | {}): object is {} {
    return _.isEmpty(object);
}

writeTextIfAny(param: { text: string } | {}): void {
    if (!this.isEmpty(param)) {
        // param is never, not { text: string }
    }
}
Run Code Online (Sandbox Code Playgroud)

这是为什么?

Mat*_*hen 6

一般来说,TypeScript 对象类型包括至少具有指定属性的任何对象。这意味着{}实际上是任何对象的类型。因此,如果您的自定义类型保护声明param不是 a {},那么它也不是 a {text: string},并且您只剩下never. (事实上​​,T | {}只是简化为{},尽管也许不应该完全简化为。)

我不相信有办法为空对象编写类型保护。如果您详细说明这是如何产生的,我可能会有更多建议。