Um die Art der Immobilie einzugrenzen, extendfunktioniert 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 Ajedoch eine allgemeine Schnittstelle erweitert, verlieren Sie Abei 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 Omitintern nur Exclude<keyof A, 'x'>Schlüssel besprochen werden, die string | numberin unserem Fall der allgemeine sind . Also, Bwü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 OverridePropsDienstprogrammtyp 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!