javascript - Hur kan jag utöka ett gränssnitt och åsidosätta en egenskaps typ?
Jag har ett ganska komplicerat objekt med flera egenskaper som jag skulle vilja utöka och skriva över en specifik egenskap.
interface ComplicatedObject {
propertyOne: string,
propertyTwo: null
}
interface MoreComplicatedObject extends ComplicatedObject {
propertyTwo: string
}
I huvudsak konverteras objekt med typen ComplicatedObject till MoreComplicatedType genom att tilldela ett strängvärde till propertyTwo. Jag vill undvika att använda en unionstyp på propertyTwo eftersom alla anrop som använder propertyTwo förutsätter att det är en sträng, inte ett nullvärde, så jag vill helst slippa att inkludera typkontroller i varje situation där jag får tillgång till propertyTwo.
Hur kan jag utöka ett gränssnitt och skriva om typen för en befintlig egenskap?
Svar #1
Du kan åsidosätta egenskapstypen när du utökar ett gränssnitt endast om typen i det utökande gränssnittet är kompatibel med den ursprungliga typen för egenskapen. Det vanliga fallet är när du åsidosätter den med en mer restriktiv typ.
Det betyder att du måste ha förutseende och deklarera ursprunglig egendom med en typ som är kompatibel med alla möjliga tillägg. I ditt fall kan du använda unionstyp i ComplicatedObject:
interface ComplicatedObject {
propertyOne: string,
propertyTwo: null | string
}
interface MoreComplicatedObject extends ComplicatedObject {
propertyTwo: string
}
Eller så kan du göra CompicatedObject generisk som beskrivs i detta svar.
Svar #2
Du kan använda Omit<T, K>, vilket gör att du kan utelämna vissa nycklar av en typ. Du kan sedan använda & för att lägga till de nycklar du vill ha.
type A = {a: string, b: string}
type B = Omit<A, 'b'> & {b: number}
Observera att du kan deklarera A som ett gränssnitt, Omit<T,K> fungerar på samma sätt.
Lekplatslänk
