Para restringir o tipo da propriedade, o simples extendfunciona perfeitamente, como na resposta de Nitzan :
interface A {
x: string | number;
}
interface B extends A {
x: number;
}
Para ampliar, ou geralmente substituir o tipo, você pode fazer a solução do Zskycat :
interface A {
x: string
}
export type B = Omit<A, 'x'> & { x: number };
Mas, se a sua interface Aestender uma interface geral, você perderá os tipos personalizados das Apropriedades restantes de ao usar Omit.
por exemplo
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!
O motivo é que Omitinternamente apenas analisa as Exclude<keyof A, 'x'>chaves, o que será o geral string | numberem nosso caso. Portanto, Bse tornaria {x: number; }e aceitaria qualquer propriedade extra com o tipo de number | string | boolean.
Para corrigir isso, criei um OverridePropstipo de utilitário diferente, como segue:
type OverrideProps<M, N> = { [P in keyof M]: P extends keyof N ? N[P] : M[P] };
Exemplo:
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!