首页 > 解决方案 > TypeScript:从扩展 () => any 的类型中省略函数原型

问题描述

我正在打字稿中创建一个 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 代码中,我还删除了 MainFunc 的原型(应用、调用等),因为我不想使用它,但是对于我的生活,我也无法弄清楚如何从类型中删除它。

我尝试了 Omit、Pick 等的各种组合,但到目前为止还没有。

编辑:

我在上面添加了更多代码以尝试提供更多上下文。实际代码要复杂得多,但我希望这能显示问题。

基本上,我有一个函数的公共接口。在实际代码中,“MainFunction”根据上下文变化,但它总是返回另一个具有公共接口的函数,以便用户可以链接。

我从主函数中手动删除原型,然后将公共接口分配给它。

仅在 JS 中,这一切都可以正常工作,而且如果我不删除原型,这些类型也可以正常工作。我只是无法让 Typescript 理解具有定制属性的函数,否则我无法提供准确的智能感知。

到目前为止,我在修补方面所做的事情:

一种类型,上面有我的 PublicInterface,但它不知道它本身也是一个函数。

一种类型,它知道它是一个函数,并且上面有我的公共接口,但所有 Function.prototype 道具(应用、调用等)都设置为从不。在这种情况下,它们仍然都以智能感知显示,这不是一个好的用户体验。 不想要这个

如果人们投票结束这个问题,你介意解释一下为什么这样我就可以做点什么,而不是只是从阴影中点击而不做任何解释?

标签: javascripttypescripttypesprototype

解决方案


推荐阅读