typescript - Union-type med tom matrise løses til never[]
Lekeplass
type Base = string[]
interface Foo { prop: Base }
interface Bar { prop: Base }
type FooBar = Foo | Bar
const test: FooBar = {
prop: [] // property prop resolves to never[] here
}
test.prop // property prop resolves to Base here
Hvorfor blir typen i kostnadsdeklarasjonen løst til never[] og ikke Base siden definisjonene i både Foo og Bar av egenskapen prop er de samme?
Svar #1
Fordi test ikke er {prop: []}, det er FooBar
const test: FooBar = {
prop: [] // property prop resolves to never[] here
}
// is same as:
const test2 = {prop:[]} as FooBar; // type is lost
Det du vil ha er
const test = {
prop: []
} satisfies FooBar
og satisfies er ts@>=4.9
Svar #2
Årsaken kan være at du har brukt to unioner Foo | Bar som ikke er diskriminerte. Hvis du definerer en diskriminerende egenskap i hver av dem, vil dette problemet bli løst.
Endre Foo og Bar slik(kind er en diskriminerende egenskap):
interface Foo {
prop: Base;
kind: 'Foo'
}
interface Bar {
prop: Base;
kind: 'Bar'
}
Og under test-definisjonen:
const test: FooBar = {
prop: [], // property prop is never[] no more, it is Base type.
kind:"Bar"
}
For mer informasjon om diskriminerte unioner, følg med på denne artikkelen.
