TypeScript: пропуск прототипа функции из типа extending () => any - PullRequest
0 голосов
/ 12 января 2020

Я создаю API в машинописном тексте, и я хотел бы вернуть функцию, которая имеет больше функций в качестве свойств (одна из которых - та же функция).

Для этого у меня есть:

type MainFunc = () => PublicInterface
type PublicFunction = () => PublicInterface

interface PublicInterface extends MainFunc {
  mainFunc: MainFunc
  anotherFunc: PublicFunction
}

const removeProto = (func: MainFunc) => {
  Object.setPrototypeOf(func, null)
  return func
}

const mainFunc: MainFunc = (): PublicInterface => createPublicInterface()
const anotherFunc: PublicFunction = () => createPublicInterface()

const createPublicInterface = (): PublicInterface =>
  Object.assign(
    removeProto(mainFunc),
    {
      mainFunc,
      anotherFunc
    }
  )

В коде Javascript я также удаляю прототип MainFun c (примените, звоните et c.), Как и я Не хочу, чтобы он использовался, но я не могу понять, как удалить его из шрифта.

Я пробовал разные комбинации Omit, Pick et c, но пока ничего .

Редактировать:

Я добавил больше кода выше, чтобы попытаться дать больше контекста. Фактический код гораздо сложнее, но я надеюсь, что это отображает проблему.

По сути, у меня есть интерфейс publi c для функции. В реальном коде «MainFunction» изменяется в зависимости от контекста, но он всегда возвращает другую функцию с интерфейсом publi c, чтобы пользователь мог выполнить цепочку.

Я вручную удаляю прототип из главной функции, а затем назначьте ему интерфейс publi c.

Все это работает отлично и просто в JS, а типы работают нормально, если я не удаляю прототип. Я просто не могу заставить Typescript понять функцию со сделанными на заказ свойствами, и без этого я не могу предоставить точный смысл.

То, что я до сих пор управлял своей работой:

Тип, в котором есть мой PublicInterface, но он также не знает о своей функции.

Тип, который знает свою функцию и имеет мой интерфейс publi c на нем, но все реквизиты Function.prototype (apply, call et c) установлены в значение never. В этом случае они все еще отображаются в intellisense, что не очень удобно для пользователя. Don't want this

Если люди проголосуют за закрытие вопроса, не могли бы вы объяснить, почему я могу что-то с этим сделать, а не просто щелкать из тени без объяснение?

...