Pour restreindre le type de propriété, les extendtravaux simples sont parfaits, comme dans la réponse de Nitzan :
interface A {
x: string | number;
}
interface B extends A {
x: number;
}
Pour l' élargissement, ou en général remplaçant le type, vous pouvez faire la solution de Zskycat :
interface A {
x: string
}
export type B = Omit<A, 'x'> & { x: number };
Mais, si votre interface Aétend une interface générale, vous perdrez les types personnalisés de Apropriétés restantes lors de l'utilisation Omit.
par exemple
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!
La raison est que, en Omitinterne, ne passe que par les Exclude<keyof A, 'x'>clés qui seront le général string | numberdans notre cas. Ainsi, Bdeviendrait {x: number; }et accepte toute propriété supplémentaire avec le type de number | string | boolean.
Pour résoudre ce problème, j'ai proposé un OverridePropstype d'utilitaire différent comme suit:
type OverrideProps<M, N> = { [P in keyof M]: P extends keyof N ? N[P] : M[P] };
Exemple:
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!