Typescript类:“重载签名与函数实现不兼容”

30

我创建了以下类:

export class MyItem {
  public name: string;
  public surname: string;
  public category: string;
  public address: string;

  constructor();
  constructor(name:string, surname: string, category: string, address?: string);
  constructor(name:string, surname: string, category: string, address?: string) {
    this.name = name;
    this.surname = surname;
    this.category = category;
    this.address = address;
  }
}

我遇到了以下错误:

重载签名与函数实现不兼容

我尝试了几种构造函数重载的方法,最后一个我尝试过的是我从这里获取的(如上所述)。

但是我仍然得到相同的错误。我的代码有什么问题?


1
你想要做什么?你想要一个空的(默认)构造函数和另一个接收所有这些参数的构造函数吗? - Nitzan Tomer
1
为什么你要写两次第二个构造函数? - Hubert Grzeskowiak
@NitzanTomer:是的。 - smartmouse
@HubertGrzeskowiak:我在我提供的答案中看到了这个。 - smartmouse
2
只是一个猜测,也许重载签名与函数实现不兼容。 - user663031
1
@smartmouse 在链接的答案中,构造函数并不相同。其中一个版本将参数标记为可选项。我猜测只有在没有传递参数时才会调用该构造函数。在您的代码中,构造函数完全相同。第一个只是没有函数体。 - Hubert Grzeskowiak
1个回答

46
您遇到编译错误是因为实现函数的签名不符合您声明的空构造函数。
如果您想要默认构造函数,则应该是这样的:
class MyItem {
    public name: string;
    public surname: string;
    public category: string;
    public address: string;

    constructor();
    constructor(name:string, surname: string, category: string, address?: string);
    constructor(name?: string, surname?: string, category?: string, address?: string) {
        this.name = name;
        this.surname = surname;
        this.category = category;
        this.address = address;
    }
}

(code in playground)

注意实际实现中所有参数都是可选的,这是因为默认构造函数没有参数。这样,实现函数就有了一个同时满足其他两个签名的签名。
但是你可以只使用那个单一的签名而不需要声明其他两个。
class MyItem {
    public name: string;
    public surname: string;
    public category: string;
    public address: string;

    constructor(name?: string, surname?: string, category?: string, address?: string) {
        this.name = name;
        this.surname = surname;
        this.category = category;
        this.address = address;
    }
}

(code in playground)

这两者是等价的。


它们可能没有类型检查。 - Someone
1
两者绝对不等价。第一个重载不接受任何参数,因此都使用一些默认值(假设在这个简化的用例中可能还有其他未显示的逻辑),而第二个重载要求定义名称、姓氏和类别,但地址是可选的。您的“组合”版本完全不同,允许名称未定义而姓氏已定义,或者可能名称未定义、姓氏已定义且类别未定义,或任何其他不兼容的调用签名。绝对不等价。 - Eric Ferreira

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接