我有一个代码,从人的角度来看完全可以。但是看来打字稿类型系统很难理解它。 是否有一种聪明的方法来提示编译器该行的一切都很好?
const isMustToRun: boolean = isFunc(condition) ? condition() : condition;
代码:
export const noop = function() {
};
export const isFunc = function(obj: any): boolean {
return typeof obj === 'function';
};
/**
*
* @param func funtion to run
* @param condition condition check
* @param args
*/
export const runIf = function f(condition: (Function | boolean), func: Function, ...args: any[]) {
return () => {
const isMustToRun: boolean = isFunc(condition) ? condition() : condition;
return isMustToRun ? func(...args) : noop();
};
};
如果我写
typeof condition === 'function'
代替“ isFunc”调用,它可以工作。但是我不想重复代码。
答案 0 :(得分:4)
更改
的返回类型export const isFunc = function(obj: any): boolean {
return typeof obj === 'function';
};
成为is Function
export const isFunc = function(obj: any): obj is Function {
return typeof obj === 'function';
};
答案 1 :(得分:2)
您需要在自定义类型防护中转换isFunc
,您的代码才能按预期运行。
export const isFunc = function(obj: any): obj is Function {
return typeof obj === 'function';
};
我建议不要使用Function
,因为它并不是非常安全的类型,您可以使用函数签名来加强函数类型,并使用Extract
条件类型来保留实际类型传递给isFunc
类型防护的函数:
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