2017-07-26 77 views
2

我在“或”类型中发现了奇怪的行为。不知道,如果它是一个错误或功能... 我想实现的:我的变量应该只允许一个属性'数据'的对象或一个属性'记录'的对象。但不是既有'数据'又有'财产'的对象。 所以:typescript 2.4.2“or”type strange behavior

type X = { 
    data: string 
}; 
type Y = { 
    records: { 
    [recordId: number]: { 
     [attributeName: string]: any, 
    } 
    }, 
}; 

type XorY = X | Y; 


let a:XorY = { 
    data: 'something', 
    records: { 
    12: { 
     someKey: 'someValue', 
    } 
    } 
}; 

在我看来,分配到应该抛出一个错误。任何想法,我如何在ts中做这样的检查?

+0

通常,'|'表示'或'和''^意味着XOR。其中'OR'包含在内,'XOR'是唯一的。你自己说这是'OR',所以我有点困惑,为什么你会认为'XOR'会在这里被使用?我可以看到有独家工会的效用,但我认为包容性工会更有用。考虑一下所有现有的JavaScript库,它们都有可以接受字符串的函数或者一个元素。希望将您的支持添加到我关联的github问题中,可以帮助他们了解该功能有多少兴趣。 – AndyJ

回答

3

联盟类型目前仅包含在内,也就是说,如果任何条件都是真实的,那么它是匹配的。

目前无法创建专属联盟。

有一个开放的issue讨论添加独特的联合,你可能想参加,如果这是你强烈渴望的功能。

提案:允许独占使用工会类型之间的逻辑或(^)运算符#14094