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