Pour restreindre le type de propriété, les extend
travaux 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 A
proprié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 Omit
interne, ne passe que par les Exclude<keyof A, 'x'>
clés qui seront le général string | number
dans notre cas. Ainsi, B
deviendrait {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 OverrideProps
type 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!