是否可以编写一个 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)
这是为什么?
一般来说,TypeScript 对象类型包括至少具有指定属性的任何对象。这意味着{}实际上是任何对象的类型。因此,如果您的自定义类型保护声明param不是 a {},那么它也不是 a {text: string},并且您只剩下never. (事实上,T | {}只是简化为{},尽管也许不应该完全简化为。)
我不相信有办法为空对象编写类型保护。如果您详细说明这是如何产生的,我可能会有更多建议。
| 归档时间: |
|
| 查看次数: |
1785 次 |
| 最近记录: |