此片段
function problem<T>(callback: T | (() => T)) : T {
return typeof callback === 'function' ? callback() : callback;
}
产生错误
This expression is not callable.
Not all constituents of type '(() => T) | (T & Function)' are callable.
Type 'T & Function' has no call signatures. ts(2349)
花了一段时间我才明白Function
本身的意义并不大,因为我需要的是一个[[parameter-less函数。
T = number
,我可以简单地切换到测试typeof callback === 'number'
并完成。但是,我需要一个一般的解决方案。我想
T
以便不包含函数(如我希望的那样)可以解决问题。有什么可能性?
问题说明
function myfun(s: string) {return s;}
和通话problem(myfun);
类型T = (s: string) => string
被正确推断。不应有类似myfun()
的回调调用;而是应返回myfun
。但是,由于typeof callback === 'function'
成立,它出错了。更新
假设
检查
callback instanceof Function
与AFAIK完全相同,我错了。与playground from the answer不同。但是,添加
const myfun = (s: string) => s; console.log(problem(myfun));
说出来
Argument of type '(s: string) => string' is not assignable to parameter of type 'string | (() => string)'. Type '(s: string) => string' is not assignable to type '() => string'.ts(2345) doAfter.ts(57, 21): Did you mean to call this expression?
听起来像是这行的错误
console.log(problem<(s: string) => string>(myfun));
编译,没有类型歧义。但是,它不起作用,将返回undefined
而不是myfun
本身。
instanceof
检查就足够了: