如何在Typescript中定义具有默认值的可选构造函数参数

15 浏览
0 Comments

如何在Typescript中定义具有默认值的可选构造函数参数

是否可以像这样使用带有默认值的可选构造函数参数?\n

export class Test {
    constructor(private foo?: string="foo", private bar?: string="bar") {}
}

\n这给了我以下错误:\n参数不能同时具有问号和初始化程序。\n我想创建实例,例如\n

x = new Test();               // x.foo === 'foo'            
x = new Test('foo1');         // x.foo === 'foo1'
x = new Test('foo1', 'bar1');

\n如何以正确的 TypeScript 方式实现这一点?

0
0 Comments

在Typescript中定义可选的构造函数参数时出现了问题。在代码中,可以在参数后面添加问号来标记参数为可选的,这样更干净。如果添加了默认参数,参数默认就是可选的。

export class Test {
   foo: string; 
   bar: string;
    constructor(foo?: string, bar?: string) {
    this.foo = foo;
    this.bar = bar;
   }
}

不确定这在当时是否有效,但现在编译会失败并显示以下错误:error TS2322: Type 'string | undefined' is not assignable to type 'string'.

解决这个问题的方法是将参数的类型设为联合类型,包括参数类型本身和undefined。这样可以确保参数既可以是指定的类型,也可以是undefined。

export class Test {
   foo: string | undefined; 
   bar: string | undefined;
    constructor(foo?: string, bar?: string) {
    this.foo = foo;
    this.bar = bar;
   }
}

通过使用联合类型,我们可以让参数既可以是指定的类型,也可以是undefined,从而解决了编译失败的问题。

0
0 Comments

在TypeScript中,具有默认值的参数被定义为可选参数,正如文档中所述。对于构造函数和其他函数来说都是一样的。因此,可以在构造函数中定义可选参数的默认值。如果在构造函数中定义了默认值,则在调用该构造函数时可以忽略这些参数。

然而,当使用解构参数时,如何以尽可能简洁的方式定义可选参数的默认值,而不需要重复列出解构字段的列表呢?

一个解决方法是使用对象解构和对象合并的方式。首先,可以定义一个包含所有可能的参数及其默认值的对象。然后,在构造函数中使用对象解构,将这个对象与传入的参数进行合并。这样,如果传入的参数中没有对应的属性,就会使用默认值。

下面是一个示例代码:

export class Test {
  constructor({ foo = "foo", bar = "bar" }: { foo?: string, bar?: string } = {}) {
    this.foo = foo;
    this.bar = bar;
  }
}

在这个示例中,构造函数的参数是一个对象,其中包含了属性foo和bar,它们都是可选的。如果不传入任何参数,则使用默认的空对象{}。然后,使用对象解构将传入的参数与默认值进行合并,并将值赋给相应的属性。

使用这种方式,可以简洁地定义具有默认值的可选参数,而无需重复列出解构字段的列表。这样可以提高代码的可读性和可维护性。

0