首页 > 解决方案 > 打字稿在速记构造函数中创建对象

问题描述

我有一个 Foo 和一个 Bar 类:

class Foo {
  
  private name: string;
  private bar: Bar;

  constructor(name: string, bar: Bar) {
    this.name = name;
    this.bar = bar;
  }
}

class Bar {
  private x: number;
  private y: number;

  constructor(x: number, y: number) {
    this.x = x;
    this.y = y;
  }
}

现在使用 Typescript 构造函数速记,我可以将 Foo 写为:

class Foo {
  constructor(private name: string, private bar: Bar) { }
}

但是,我想做的不是将Bar对象传递给Foo构造函数。而是传入 and 的值xy但仍然使用简写符号来保存我完整地写出类。

实际上,可以这样:

class Foo {
  
  private name: string;
  private bar: Bar;

  constructor(name: string, x: number, y: number) {
    this.name = name;
    this.bar = new Bar(x, y);
  }
}

是使用速记符号书写的吗?

标签: typescript

解决方案


速记符号称为“参数属性”,具体来说只是将构造函数参数复制到同名的类属性。它不适合你正在做的事情bar。您仍然可以使用该name属性的简写,如下所示:

class Foo {
    private bar: Bar;
    constructor(private name: string, x: number, y: number) {
        this.bar = new Bar(x, y);
    }
}

这就是我建议您继续进行的方式。


如果有人以人身伤害威胁我,除非我想出一些方法来为你的bar场景使用参数属性,我想我可以像这样滥用默认参数

// ☠ DON'T DO THIS ☠
class AbuseFoo {
    constructor(
        private name: string,
        x: number, y: number,
        private bar: Bar = new Bar(x, y)
    ) { }
}

这在那个“起作用”

// ☠ DON'T DO THIS ☠
let f = new AbuseFoo("name", 1, 2);
console.log(JSON.stringify(f)); // {"name":"name","bar":{"x":1,"y":2}}

生成一个包含私有bar属性的值,其xis1yis 2。但它公开了一个可选的第四个构造函数参数,该参数覆盖了xandy属性:

f = new AbuseFoo("name", 1, 2, new Bar(3, 4)); 
console.log(JSON.stringify(f)); // {"name":"name","bar":{"x":3,"y":4}}

当然,它比bar在类中声明并以正常方式在构造函数中设置它更丑陋和复杂。因此,除非您有充分的理由这样做(例如,代码混淆竞赛、人身伤害威胁等),否则我会坚持原来的答案:

不,您不能使用参数属性来设置bar这种方式。使用速记方法。

Playground 代码链接


推荐阅读