Машинопись: как добавить подпись вызова в сопоставленный тип? - PullRequest
0 голосов
/ 05 октября 2018

У меня есть простая функция.Вы знаете, что функции в JS являются объектами?Поэтому я также добавил некоторые свойства к нему.Есть две важные детали:

  • Я не хочу, чтобы Function.prototype методы (call, apply и т. Д.) Отображались во всплывающем окне IntelliSense (автозаполнение IDE), поэтому я использую Exclude встроенный тип для удаления методов Function.prototype.
  • Я добавляю методы динамически, поэтому мне нужно использовать Mapped Type для функции.

Итак, мой код выглядит так, и он не работает должным образом:

type ExcludeFunctionPrototypeMethods<T extends () => any> = {
  [K in Exclude<keyof T, keyof Function>]: T[K]
}

function someFunc<T extends () => any>(t: T): ExcludeFunctionPrototypeMethods<T> {
    return {} as any
}

someFunc(() => {})() // the methods are excluded, but when calling,
  it fails with "Cannot invoke an expression whose type lacks a call
  signature. Type 'ExcludeFunctionPrototypeMethods<() => void>' 
  has no compatible call signatures."

Так как избежать последнего сообщения об ошибке?Как добавить подпись вызова в Mapped Type?Обратите внимание, что приведенный ниже код исправит ошибку, НО также добавит Function.prototype методов, что нежелательно:

type ExcludeFunctionPrototypeMethods = {...} & {
    (): any // <- the call signature added, but methods of Function.prototype added as well
}
...