打字稿限制解决方法

时间:2019-01-07 20:57:17

标签: javascript typescript functional-programming

我有一个代码,从人的角度来看完全可以。但是看来打字稿类型系统很难理解它。 是否有一种聪明的方法来提示编译器该行的一切都很好

  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”调用,它可以工作。但是我不想重复代码。

2 个答案:

答案 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';
};

更多

这称为user defined type guard

答案 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