【问题标题】:Typescript overload signature pass object and value打字稿重载签名传递对象和值
【发布时间】:2018-03-29 00:40:44
【问题描述】:

我有一个可以接受对象或值的函数。

export function A( param: string );
export function A({ param }: { param: string }) {

}

但我收到以下错误:

打字稿重载签名与函数不兼容 实施

有什么问题?

export function A( param: string ): void
export function A({ param, ...rest  }: { param: string}): void
export function A( param: string | { param: string = "initial", ...rest }) : void{

}

【问题讨论】:

  • 您只能在类型声明中定义重载。 Javascript 不支持方法重载,并且 typescript 不知道如何将多个方法编译为一个方法。这意味着实际的实现必须包含一个方法,该方法适用于类型声明中的每个重载签名。
  • @JakeHolzinger 你可以有多个重载,但只有一个实现
  • 这不是我说的吗?单个实现必须具有匹配所有重载的签名,因为 typescript 不知道如何自动创建该方法。
  • @JakeHolzinger 抱歉,我从您的评论中了解到,您只能在声明中定义重载,而不能在打字稿中实现具有多个签名的函数。对不起,如果我误解了。

标签: typescript


【解决方案1】:

当您有多个重载时,最后一个是实现重载。实现重载从外部不可见,并且必须与所有其他重载兼容。在您的情况下,签名应如下所示:

export function A(param: string): void
export function A(param: { param: string, otherProp?: string }): void
export function A(paramOrObj: string | { param: string, otherProp?: string } = { param: "initial"}): void {
    // If param is not string destructure
    if (typeof paramOrObj !== "string") {
        let { param, ...rest } = paramOrObj;
    } else {
        // otherwise use the string value
        let param = paramOrObj;
    }
}

【讨论】:

  • 谢谢,但我还是有问题。当我向对象添加默认值并尝试使用 rest 运算符时,它不起作用。
  • 导出函数 A(param: string): void export function A({ param }: { param: string, ...rest }): void export function A( param: string | { param: string = "initial", ...rest }) : void{ }
  • 哎呀,没有看到你的答案。删除了我的。
  • @undefined 已编辑,希望这接近您想要的。很抱歉从 PC 调用延迟
  • 非常感谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多