【问题标题】:TypeScript claims Function is not CalalbleTypeScript 声明函数不可调用
【发布时间】:2020-09-01 11:20:41
【问题描述】:

无论出于何种原因,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
  }
}

错误:

This expression is not callable.
  No constituent of type 'Function | Constructable' is callable.(2349)

https://www.typescriptlang.org/play?ssl=14&ssc=11&pln=14&pc=6#code/C4TwDgpgBAwg9gOwM7AE4FcDGwCGAjAG2gF4oBvKBCAdwAoA6RnVAcyQC4ocEQBtAXQCUnbiCgBfAFCSAZugTYAloiiKkMAjiRJachSJ6DykqFFQRg6VAii0TpqKEhwZUPZijEvUAOTvgygg+UABkIfamAPQAepia2gA6SJH0wBAotABi8kqI9GCocMBF4BCpcADKaIoILPSYOAQEujmCgvbtUrI5ASqYcBComBAA8lS0ACY4uAYgADRuCJzZCr02AD6wiCgY2PhERmT2iq60ahpaOjIIbcYOUP3IwA-baFjFqJ6LXEhbT7u4QgQCJmCxWGxUagvf7vOCoSbTHDtUziKAQAhIaBHe7mSzWRYI3DIiSSKRAA

关于如何解决这个问题的任何想法?

【问题讨论】:

  • 你在检查func === 'function',是不是不等于?
  • JavaScript 中的类是函数,所以是的,这个检查是必需的。

标签: typescript


【解决方案1】:

你的类型保护 isClass 需要一个谓词返回类型:: func is Constructable

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))

https://www.typescriptlang.org/play?#code/C4TwDgpgBAwg9gOwM7AE4FcDGwCGAjAG2gF4oBvKBCAdwAoA6RnVAcyQC4ocEQBtAXQCUnbiCgBfAFCSAZugTYAloiiKkMAjiRJachSJ7CoezKqSxEKDNnxFykqFFQRg6VAii0HjqKEhwZY3lTYlCoAHITYGUEcKgAMnjvRwB6AD1MTW0AHSQU+mAIFFoAMWDoxHowVDhgWvAIArgAZTRFBBZ6TBwCAl1gwUFvIalZcpioTDgIVEwIAHkqWgATHFwDEAAaYwROMoUKjwAfC2Q0LFxCCEF7R0VA2jUNLR0ZBEHbnymzyctz7DgqCgpDeXHM8DO1kuRGSThcbg8VGov0hF0BKzWOCGjnEUAgBCQ0DIsOcrncOwxuGxEkko2+SDgRHoBDgLFoUxmc0WEFo4WogIA1khwtt6YzGiyWINJEA

【讨论】:

    猜你喜欢
    • 2016-04-04
    • 1970-01-01
    • 1970-01-01
    • 2022-07-05
    • 2022-07-01
    • 2020-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多