Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 类型脚本限制解决方法_Javascript_Typescript_Functional Programming - Fatal编程技术网

Javascript 类型脚本限制解决方法

Javascript 类型脚本限制解决方法,javascript,typescript,functional-programming,Javascript,Typescript,Functional Programming,我有一个代码,从人类的角度来看,这是完全正确的。但看起来typescript类型系统很难理解它有没有一种聪明的方法来提示编译器这一行的一切都很好 const isMustToRun: boolean = isFunc(condition) ? condition() : condition; 代码: 如果我写 typeof condition === 'function' 而不是“isFunc”调用,那么它就可以工作了。但我不想重复代码 更改 export const isFunc =

我有一个代码,从人类的角度来看,这是完全正确的。但看起来typescript类型系统很难理解它有没有一种聪明的方法来提示编译器这一行的一切都很好

  const isMustToRun: boolean = isFunc(condition) ? condition() : condition;
代码:

如果我写

typeof condition === 'function'

而不是“isFunc”调用,那么它就可以工作了。但我不想重复代码

更改

export const isFunc = function(obj: any): boolean {
  return typeof obj === 'function';
};
要成为
是功能

export const isFunc = function(obj: any): obj is Function {
  return typeof obj === 'function';
};
更多
这称为您需要在自定义类型保护中转换
isFunc
,您的代码将按预期工作:

export const isFunc = function(obj: any): obj is Function {
  return typeof obj === 'function';
};
我建议不要使用
函数
,因为它实际上不是非常安全的类型,您可以使用函数签名来收紧函数类型,并使用
提取
条件类型来保留传递给
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();
     };
};

你的错误是什么?参数的类型声明不包括返回值类型。@Pointy无法调用类型缺少调用签名的表达式。类型“boolean | Function”没有兼容的调用签名。这就是我想要的。感谢您为我指出文档:-)还要注意
typeof condition==='function'?condition():condition
将编译,因为TS理解
类型guard的
类型。无需缩小范围。TypeScript不会将类型扩展到
函数
。原有定义将保留。尝试对
declare const foo:typeof addEventListener | null;if(isFunc(foo))foo()
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();
     };
};
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