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.