在TS的类型文字中设置默认属性值



我有以下TS类:

export class TestClass {
constructor(public options: { a?: number, b?: string, c?: boolean, d?: number }) { }
}

实现:

new TestClass({a:123});
new TestClass({b:'hello'});

我正在寻找一种方法来设置每个选项属性的默认值(a, b, c等),以便开发人员只能发送部分参数,而其他未分配的参数将获得其默认值。

此选项不可用:

constructor(public options: { a?: number = 0, b?: string = '', c?: boolean = false, d?: number = 1 }) { }

因为"在限制中,类型文字属性不能有初始化式。

所以我现在实现它的方式如下:

constructor(public options: { a?: number, b?: string, c?: boolean, d?: number }) {
!options.a && (options.a = 0),
!options.b && (options.b = ''),
!options.c && (options.c = false),
!options.d && (options.d = 1)
}

我的问题是,在现实世界中选项参数包含许多属性,我不想强制每个属性写入两次,分别在构造函数签名和构造函数体中。

我的问题是是否有更好的方法。

默认参数用于未定义的函数/方法参数(JavaScript和TypeScript都是如此),但是在你的情况下,你有一个参数值,其中包含可选属性。遗憾的是,将这些属性设置为默认值本身是不可能的。

但是,我们可以稍微改进一下构造函数的语法:
constructor(public options: { a?: number, b?: string, c?: boolean, d?: number }) {
options.a || options.a = 0;
options.b || options.b = '';
options.c || options.c = false;
options.d || options.d = 1;
}

如果你正在使用ES2020+,你可以使用逻辑空赋值让你的语法更简洁:

constructor(public options: { a?: number, b?: string, c?: boolean, d?: number }) {
options.a ??= 0;
options.b ??= '';
options.c ??= false;
options.d ??= 1;
}

更多信息可以在这里找到。

最新更新