Um die Art der Immobilie einzugrenzen, extend
funktioniert einfach perfekt, wie in Nitzans Antwort :
interface A {
x: string | number;
}
interface B extends A {
x: number;
}
Um den Typ zu erweitern oder allgemein zu überschreiben , können Sie die Lösung von Zskycat ausführen :
interface A {
x: string
}
export type B = Omit<A, 'x'> & { x: number };
Wenn Ihre Schnittstelle A
jedoch eine allgemeine Schnittstelle erweitert, verlieren Sie A
bei Verwendung die verbleibenden Eigenschaften der benutzerdefinierten Typen Omit
.
z.B
interface A extends Record<string | number, number | string | boolean> {
x: string;
y: boolean;
}
export type B = Omit<A, 'x'> & { x: number };
let b: B = { x: 2, y: "hi" }; // no error on b.y!
Der Grund ist, dass Omit
intern nur Exclude<keyof A, 'x'>
Schlüssel besprochen werden, die string | number
in unserem Fall der allgemeine sind . Also, B
würde {x: number; }
und akzeptiert jede zusätzliche Eigenschaft mit der Art von number | string | boolean
.
Um dies zu beheben, habe ich mir einen anderen OverrideProps
Dienstprogrammtyp ausgedacht:
type OverrideProps<M, N> = { [P in keyof M]: P extends keyof N ? N[P] : M[P] };
Beispiel:
type OverrideProps<M, N> = { [P in keyof M]: P extends keyof N ? N[P] : M[P] };
interface A extends Record<string | number, number | string | boolean> {
x: string;
y: boolean;
}
export type B = OverrideProps<A, { x: number }>;
let b: B = { x: 2, y: "hi" }; // error: b.y should be boolean!