TypeScript声明函数不可调用

TypeScript声明函数不可调用,typescript,Typescript,无论出于何种原因,TypeScript都没有检测到实例函数的某些部分不可调用 type Constructable = { new(...args: any[]): any } function isClass(func: any) { return ( typeof func === 'function' && /^class\s/.test(Function.prototype.toString.call(func)) ) } function c

无论出于何种原因,TypeScript都没有检测到实例函数的某些部分不可调用

type Constructable = { new(...args: any[]): any }

function isClass(func: any) {
  return (
    typeof func === 'function' &&
    /^class\s/.test(Function.prototype.toString.call(func))
  )
}

function coerceOne(data: any, fn: Function | Constructable) {
  if (isClass(fn)) {
    const constructor = fn as Constructable
    return new constructor(data)
  } else {
    return fn(data) // <-- ERROR
  }
}


关于如何解决这个问题有什么想法吗?

您的类型guard
isClass
需要一个谓词返回类型:
:func是可构造的

type Constructable = { new(...args: any[]): any }

function isClass(func: any): func is Constructable {
  return (
    typeof func === 'function' &&
    /^class\s/.test(Function.prototype.toString.call(func))
  )
}

function coerceOne(data: any, fn: Function | Constructable) {
  if (isClass(fn)) {
    const constructor = fn as Constructable
    return new constructor(data)
  } else {
    return fn(data)
  }
}

console.log(coerceOne('works', console.log))

您的类型guard
isClass
需要谓词返回类型:
:func是可构造的

type Constructable = { new(...args: any[]): any }

function isClass(func: any): func is Constructable {
  return (
    typeof func === 'function' &&
    /^class\s/.test(Function.prototype.toString.call(func))
  )
}

function coerceOne(data: any, fn: Function | Constructable) {
  if (isClass(fn)) {
    const constructor = fn as Constructable
    return new constructor(data)
  } else {
    return fn(data)
  }
}

console.log(coerceOne('works', console.log))

您正在检查
func==='function'
是否假定不相等?JavaScript中的类是函数,因此需要进行此检查。您正在检查
func=='function'
是否假定不相等?JavaScript中的类是函数,因此需要进行此检查。