एक अद्यतन जवाब: चौराहे के प्रकार के अलावा के माध्यम से &
, यह मक्खी पर दो अनुमान लगाया प्रकार "मर्ज" करने के लिए संभव है।
यहां एक सामान्य सहायक है जो किसी वस्तु के गुणों को पढ़ता है from
और उन्हें किसी वस्तु पर कॉपी करता है onto
। यह एक ही वस्तु देता है onto
लेकिन एक नए प्रकार के साथ जिसमें संपत्तियों के दोनों सेट शामिल होते हैं, इसलिए रनटाइम व्यवहार का सही वर्णन करते हैं:
function merge<T1, T2>(onto: T1, from: T2): T1 & T2 {
Object.keys(from).forEach(key => onto[key] = from[key]);
return onto as T1 & T2;
}
यह निम्न-स्तरीय सहायक अभी भी एक प्रकार का दावा करता है, लेकिन यह डिजाइन द्वारा टाइप-सुरक्षित है। इस सहायक के साथ, हमारे पास एक ऑपरेटर है जिसका उपयोग हम ओपी की समस्या को पूर्ण प्रकार की सुरक्षा के साथ हल करने के लिए कर सकते हैं:
interface Foo {
(message: string): void;
bar(count: number): void;
}
const foo: Foo = merge(
(message: string) => console.log(`message is ${message}`), {
bar(count: number) {
console.log(`bar was passed ${count}`)
}
}
);
टाइपस्क्रिप्ट प्लेग्राउंड में इसे आज़माने के लिए यहां क्लिक करें । ध्यान दें कि हमने foo
टाइप करने के लिए विवश किया है Foo
, इसलिए इसका परिणाम merge
पूर्ण होना है Foo
। इसलिए यदि आप नाम बदलते bar
हैं bad
तो आपको एक प्रकार की त्रुटि मिलती है।
एनबी अब भी यहाँ एक प्रकार का छेद है। टाइपस्क्रिप्ट एक प्रकार के पैरामीटर को "फ़ंक्शन नहीं" होने के लिए बाध्य करने का एक तरीका प्रदान नहीं करता है। तो आप भ्रमित हो सकते हैं और दूसरे तर्क के रूप में अपने कार्य को पारित कर सकते हैं merge
, और यह काम नहीं करेगा। इसलिए जब तक यह घोषित नहीं किया जा सकता, हमें इसे रनटाइम पर पकड़ना होगा:
function merge<T1, T2>(onto: T1, from: T2): T1 & T2 {
if (typeof from !== "object" || from instanceof Array) {
throw new Error("merge: 'from' must be an ordinary object");
}
Object.keys(from).forEach(key => onto[key] = from[key]);
return onto as T1 & T2;
}
var f: { (): any; someValue: number; } = <{ (): any; someValue: number; }>{ ...(() => "Hello"), someValue: 3 };
:।