Nitzan'ın cevabındaextend
olduğu gibi , mülkün türünü daraltmak için, basit mükemmel çalışır :
interface A {
x: string | number;
}
interface B extends A {
x: number;
}
Türü genişletmek veya genel olarak geçersiz kılmak için Zskycat'in çözümünü uygulayabilirsiniz :
interface A {
x: string
}
export type B = Omit<A, 'x'> & { x: number };
Ancak, arabiriminiz A
genel bir arabirimi genişletiyorsa, A
kullanırken kalan özelliklerin özel türlerini kaybedersiniz Omit
.
Örneğin
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" };
Nedeni, Omit
dahili olarak yalnızca bizim durumumuzda Exclude<keyof A, 'x'>
genel olacak anahtarların üzerinden geçer string | number
. Yani, türüyle herhangi bir ekstra özellik B
olur {x: number; }
ve kabul eder number | string | boolean
.
Bunu düzeltmek için, OverrideProps
aşağıdaki gibi farklı bir yardımcı program türü buldum :
type OverrideProps<M, N> = { [P in keyof M]: P extends keyof N ? N[P] : M[P] };
Misal:
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" };