如何在Typescript中定义具有默认值的可选构造函数参数
如何在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 方式实现这一点?
在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,从而解决了编译失败的问题。
在TypeScript中,具有默认值的参数被定义为可选参数,正如文档中所述。对于构造函数和其他函数来说都是一样的。因此,可以在构造函数中定义可选参数的默认值。如果在构造函数中定义了默认值,则在调用该构造函数时可以忽略这些参数。
然而,当使用解构参数时,如何以尽可能简洁的方式定义可选参数的默认值,而不需要重复列出解构字段的列表呢?
一个解决方法是使用对象解构和对象合并的方式。首先,可以定义一个包含所有可能的参数及其默认值的对象。然后,在构造函数中使用对象解构,将这个对象与传入的参数进行合并。这样,如果传入的参数中没有对应的属性,就会使用默认值。
下面是一个示例代码:
export class Test { constructor({ foo = "foo", bar = "bar" }: { foo?: string, bar?: string } = {}) { this.foo = foo; this.bar = bar; } }
在这个示例中,构造函数的参数是一个对象,其中包含了属性foo和bar,它们都是可选的。如果不传入任何参数,则使用默认的空对象{}。然后,使用对象解构将传入的参数与默认值进行合并,并将值赋给相应的属性。
使用这种方式,可以简洁地定义具有默认值的可选参数,而无需重复列出解构字段的列表。这样可以提高代码的可读性和可维护性。