Вам необходимо преобразовать isFunc
в охрану пользовательского типа, и ваш код будет работать как положено .:
export const isFunc = function(obj: any): obj is Function {
return typeof obj === 'function';
};
Я бы порекомендовал не использовать Function
, хотя это не очень безопасно для типов, вы можете ограничить тип функции сигнатурой функции и использовать условный тип Extract
, чтобы сохранить фактический тип передаваемого значения. функция для isFunc
type-guard:
export const isFunc = function<T>(obj: T): obj is Extract<T, Function> {
return typeof obj === 'function';
};
export const runIf = function f(condition: ((()=> boolean) | boolean), func: Function, ...args: any[]) {
return () => {
const isMustToRun: boolean = isFunc(condition) ? condition() : condition;
return isMustToRun ? func(...args) : noop();
};
};
Или полностью безопасная версия runIf
, которая проверяет args
на параметры func
:
export const runIf = function f<T extends (...a: any)=>any>(condition: ((()=> boolean) | boolean), func: T, ...args: Parameters<T>): (()=>ReturnType<T>) {
return () => {
const isMustToRun: boolean = isFunc(condition) ? condition() : condition;
return isMustToRun ? func(...args as any[]) : noop();
};
};
function testFn(n: string) : number { return +n;}
runIf(true, testFn, "0"); //ok
runIf(true, testFn, 0); //err