嵌套接口上的求和类型



使用求和类型的工作示例:

interface Cash {
amount: number,
type: 'cash'
}
interface Card {
amount: number,
type: 'card',
cardNumber: string
}
type Payment = Cash | Card
const logPayment = (payment: Payment) => {
if (payment.type === 'card') {
console.log(`paid ${payment.amount} using ${payment.type} with number ${payment.cardNumber}`)
}
else {
console.log(`paid ${payment.amount} using ${payment.type}`)
}
}
logPayment({ type: 'cash', amount: 100 })
logPayment({ type: 'card', amount: 100, cardNumber: '0123456789' })

另一个类似的例子,不再工作

interface Cash {
amount: number,
// type now is wrapped inside a metadata property
metadata: {
type: 'cash'
}
}
interface Card {
amount: number,
cardNumber: string
// type now is wrapped inside a metadata property
metadata: {
type: 'card'
}
}
type Payment = Cash | Card
const logPayment = (payment: Payment) => {
if (payment.metadata.type === 'card') {
// Error: Property 'cardNumber' does not exist on type 'Payment'. Property 'cardNumber' does not exist on type 'Cash'.
console.log(`paid ${payment.amount} using ${payment.metadata.type} with number ${payment.cardNumber}`)
}
else {
console.log(`paid ${payment.amount} using ${payment.metadata.type}`)
}
}
logPayment({ metadata: { type: 'cash' }, amount: 100 })
logPayment({ metadata: { type: 'card' }, amount: 100, cardNumber: '0123456789' })

总和类型不起作用是有原因的吗?

当数据透视不在接口的最外部(在本例中为元数据(时,Typescript似乎无法缩小特定类型(现金或卡(的范围。

控制流分析(TypeScript根据代码缩小类型的能力的名称(不支持区分并集的嵌套判别属性。

这里已经提出了这样一个功能,但还没有足够的需求来实际实现它

最新更新