Aby zawęzić rodzaj nieruchomości, proste extenddziała idealnie, jak w odpowiedzi Nitzana :
interface A {
x: string | number;
}
interface B extends A {
x: number;
}
Dla poszerzenia lub ogólnie nadrzędnymi typu można zrobić rozwiązanie Zskycat za :
interface A {
x: string
}
export type B = Omit<A, 'x'> & { x: number };
Jeśli jednak twój interfejs Arozszerza ogólny interfejs, Apodczas używania utracisz niestandardowe typy pozostałych właściwości Omit.
na przykład
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" };
Powodem jest to, że Omitwewnętrznie przechodzą tylko przez Exclude<keyof A, 'x'>klucze, które będą generalne string | numberw naszym przypadku. Tak więc Bstałoby się {x: number; }i akceptuje każdą dodatkową właściwość typu number | string | boolean.
Aby to naprawić, wymyśliłem inny OverridePropstyp narzędzia:
type OverrideProps<M, N> = { [P in keyof M]: P extends keyof N ? N[P] : M[P] };
Przykład:
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" };