Javascript TypeScript:与空对象的区分并集

Javascript TypeScript:与空对象的区分并集,javascript,typescript,discriminated-union,Javascript,Typescript,Discriminated Union,我有以下类型的User: type User = { name: string; email: string; } | {}; 因此,本质上,用户可以是具有名称和电子邮件属性的对象,也可以是空对象 当我试图检查给定用户对象是这两个对象中的哪一个时,TypeScript显示一个错误 if (user.name) { // ERROR // do something if user object is populated } 具体而言,上面的代码抛出错误: Propert

我有以下类型的
User

type User = {
    name: string;
    email: string;
} | {};
因此,本质上,用户可以是具有名称和电子邮件属性的对象,也可以是空对象

当我试图检查给定用户对象是这两个对象中的哪一个时,TypeScript显示一个错误

if (user.name) { // ERROR
    // do something if user object is populated
}
具体而言,上面的代码抛出错误:

Property 'url' does not exist on type 'PrismicImage'.
Property 'url' does not exist on type '{}'
当其中一个接口是空对象时,是否可能有一个判别联合?

一个判别联合(正如TypeScript中通常理解的术语)是一个联合,其中在该联合的每个成员上都存在一个具有不同值的判别属性。因此,根据定义,包含
{}
的联合不是歧视性联合。如果你愿意改变你的设计,使用一个歧视性的联盟,一切都应该工作


重新设计当前设计:通常,TypeScript对象类型包括至少具有指定属性的任何对象。这意味着
{}
实际上是任何对象的类型,而您的
用户
类型只是简化为
{}
。没有(合理的)方式来表示没有属性的对象的类型;可能会增加一个。在测试
name
属性之前,您必须强制转换对象,即使在测试属性之后,我也不知道有什么方法可以让TypeScript自动知道
email
属性也存在。您至少可以定义一个函数来隐藏一个函数中的所有混乱。

您可以在

if (user.name) { // error
    user // typeof user is User | {}
    user.name // error
    user.email // error 
}

if ('name' in user) {
    user // ok, typeof user is User
    user.name  // string 
    user.email // string
}