这是一个有趣的问题,理论上说 typeof
和 instanceof
应该起到相同的类型推断作用,但是在泛型 T
的作用下,却推断错误。
复现方式
function f1(a: number | (() => number)) {
if (typeof a === 'function') {
a()
}
if (a instanceof Function) {
a()
}
}
function f2<T>(b: T | (() => T)) {
if (typeof b === 'function') {
b() // TS 报错 Type 'T & Function' has no call signatures.
}
if (b instanceof Function) {
b()
}
}
解决方案
截止目前(2022-03-01)还未修复。可以使用 instanceof Funtion 来代替解决它。