Güncellenmiş cevap: aracılığı kavşak tiplerinin yanı sıra bu yana &, bu anında iki çıkarsama yoluyla türleri "birleştirme" mümkündür.
İşte bazı nesnenin özelliklerini okuyan bir genel yardımcı olduğunu frombir nesnenin üzerine ve kopya onları onto. Aynı nesnesi geri ontodoğru olarak çalışma zamanı davranışını tanımlayan, özelliklerin iki seti içeren yeni bir türü ile ancak:
function merge<T1, T2>(onto: T1, from: T2): T1 & T2 {
Object.keys(from).forEach(key => onto[key] = from[key]);
return onto as T1 & T2;
}
Bu düşük seviyeli yardımcı hala tip iddiayı performans gösteriyor, ama bu tip-güvenli tasarım gereğidir. yerine bu yardımcı ile, biz tam tip güvenliği ile OP'ın sorunu çözmek için kullanabileceğiniz bir operatöre sahiptir:
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}`)
}
}
);
Typescript Oyun alanı denemek için burayı tıklayın . Biz kısıtlı olduğunu unutmayın footürden olmalı Foo, böylece sonucu mergetam olması gerekir Foo. Yani adlandırmak eğer barüzere bado zaman bir tür hatası alıyorum.
NB ancak yine de burada bir tür delik vardır. Typescript "değil bir işlev" olarak bir tür parametresi sınırlamak için bir yol sağlamaz. Yani karışık ve ikinci argüman olarak işlev geçebileceği mergeve bu işe yaramaz. Bu ilan edilene kadar Yani, biz zamanında yakalamak zorundayız:
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;
}