javascript - Typescript'te sarılmış bir fonksiyonda bir fonksiyonu dinamik olarak türlemek için bir yol var mı?
Diyelim ki basit bir kullanım durumum var - bir fonksiyonun başka bir zaman takip fonksiyonu ile sarılmasını istiyorum. Zaman takip kodumu her yere kopyalayıp yapıştırmak yerine, orijinal fonksiyonum etrafında bir sarmalayıcı fonksiyon oluşturarak zaman takip kodunu soyutlamak ve sonuç olarak yeni bir fonksiyon oluşturmak istiyorum. Böylece aşağıdaki gibi bir fonksiyonla sonuçlanıyorum.
function wrapFunction(someFunction: Function) {
const wrappedFunction = function() {
let args = arguments;
let beforeTime = new Date();
someFunction.apply(args);
let afterTime = new Date();
console.log("Time Elapsed " + afterTime - beforeTime);
};
return {execute: wrappedFunction};
}
O zaman kullanmak için aşağıdakine benzer bir şey yapardım:
//Generate the wrapped function
let wrappedFunction = wrapFunction((param1 : string, param2: number) =>{
console.log("Param1 = ", param1);
console.log("Param2 = ", param2);
});
//This is the actual usage of the function
wrappedFunction.execute('param1', 2);
Benim sorum şu: Typescript hataları tespit edebilir ve IDE'ler fonksiyon parametrelerini fark edebilir şekilde, döndürülen .execute() fonksiyonunun parametrelerini dinamik olarak ayarlamanın bir yolu var mı?
Mevcut durumda, fonksiyonun nerede oluşturulduğunu kontrol etmeden .execute() içine hangi parametreleri geçmem gerektiğini kontrol etmenin bir yolu yok.
Cevap #1
Rest argümanlarında generikler ve demetler kullanabilirsiniz:
function wrapFunction<A extends any[], R>(someFunction: (...a: A) => R) {
const wrappedFunction = function (...args: A) {
let beforeTime = new Date();
let result = someFunction(...args);
let afterTime = new Date();
console.log("Time Elapsed " + (afterTime.getDate() - beforeTime.getDate()));
return result;
};
return { execute: wrappedFunction };
}
//Generate the wrapped function
let wrappedFunction = wrapFunction((param1: string, param2: number) => {
console.log("Param1 = ", param1);
console.log("Param2 = ", param2);
});
wrappedFunction.execute('param1', 2); //ok now
Cevap #2
Evet, genel bir fonksiyon türü kullan:
function wrapFunction<F extends Function>(someFunction: F) {
function wrappedFunction(...args) { // personal preference + performance boost
const beforeTime = new Date();
const result = someFunction.apply(this, args);
const afterTime = new Date();
console.log("Time Elapsed " + afterTime - beforeTime);
return result;
}
return {execute: wrappedFunction as F }; // why this object though?
}
