这是一个有趣的问题,理论上说 typeofinstanceof 应该起到相同的类型推断作用,但是在泛型 T 的作用下,却推断错误。

复现方式

  1. function f1(a: number | (() => number)) {
  2. if (typeof a === 'function') {
  3. a()
  4. }
  5. if (a instanceof Function) {
  6. a()
  7. }
  8. }
  9. function f2<T>(b: T | (() => T)) {
  10. if (typeof b === 'function') {
  11. b() // TS 报错 Type 'T & Function' has no call signatures.
  12. }
  13. if (b instanceof Function) {
  14. b()
  15. }
  16. }

解决方案

截止目前(2022-03-01)还未修复。可以使用 instanceof Funtion 来代替解决它。

参考