У меня есть простая функция.Вы знаете, что функции в 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
}