Функция TypeScript claims не поддается вычислению

#typescript

#typescript

Вопрос:

По какой-либо причине TypeScript не обнаруживает, что какая-либо функция экземпляра недоступна для вызова.

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

function isClass(func: any) {
  return (
    typeof func === 'function' amp;amp;
    /^classs/.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=14amp;ssc=11amp;pln=14amp;pc=6#code/C4TwDgpgBAwg9gOwM7AE4FcDGwCGAjAG2gF4oBvKBCAdwAoA6RnVAcyQC4ocEQBtAXQCUnbiCgBfAFCSAZugTYAloiiKkMAjiRJachSJ6DykqFFQRg6VAii0TpqKEhwZUPZijEvUAOTvgygg UABkIfamAPQAepia2gA6SJH0wBAotABi8kqI9GCocMBF4BCpcADKaIoILPSYOAQEujmCgvbtUrI5ASqYcBComBAA8lS0ACY4uAYgADRuCJzZCr02AD6wiCgY2PhERmT2iq60ahpaOjIIbcYOUP3IwA-baFjFqJ6LXEhbT7u4QgQCJmCxWGxUagvf7vOCoSbTHDtUziKAQAhIaBHe7mSzWRYI3DIiSSKRAA

Есть идеи о том, как это решить?

Комментарии:

1. Вы проверяете, не должно ли func === 'function' быть не равно?

2. Классы в JavaScript являются функциями, так что да, эта проверка обязательна.

Ответ №1:

Для защиты типа isClass требуется возвращаемый тип предиката: : func is Constructable

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

function isClass(func: any): func is Constructable {
  return (
    typeof func === 'function' amp;amp;
    /^classs/.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