एक अद्यतन जवाब: के माध्यम से चौराहे प्रकार के अलावा के बाद से &, यह मक्खी पर "मर्ज" करने के लिए दो अनुमानित प्रकार संभव है।
यहाँ एक सामान्य सहायक है कि कुछ ऑब्जेक्ट के गुणों को पढ़ता है 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;
}