संपत्ति के प्रकार को कम करने के लिए, सरल extend
काम सही है, जैसा कि निट्ज़ैन के जवाब में है :
interface A {
x: string | number;
}
interface B extends A {
x: number;
}
चौड़ीकरण के लिए, या आम तौर पर ओवरराइड करने के लिए, आप Zskycat का समाधान कर सकते हैं :
interface A {
x: string
}
export type B = Omit<A, 'x'> & { x: number };
लेकिन, यदि आपका इंटरफ़ेस A
सामान्य इंटरफ़ेस का विस्तार कर रहा है, तो आप A
उपयोग करते समय कस्टम प्रकार के शेष गुणों को खो देंगे Omit
।
जैसे
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" };
कारण है, Omit
आंतरिक रूप से केवल Exclude<keyof A, 'x'>
उन चाबियों से अधिक है जो string | number
हमारे मामले में सामान्य होंगे । तो, B
बन जाएगा {x: number; }
और के प्रकार के साथ किसी भी अतिरिक्त संपत्ति को स्वीकार करता है number | string | boolean
।
इसे ठीक करने के लिए, मैं OverrideProps
निम्नलिखित के साथ एक अलग उपयोगिता प्रकार के साथ आया :
type OverrideProps<M, N> = { [P in keyof M]: P extends keyof N ? N[P] : M[P] };
उदाहरण:
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" };