typescript - 打字稿在速记构造函数中创建对象
问题描述
我有一个 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 的值x
,y
但仍然使用简写符号来保存我完整地写出类。
实际上,可以这样:
class Foo {
private name: string;
private bar: Bar;
constructor(name: string, x: number, y: number) {
this.name = name;
this.bar = new Bar(x, y);
}
}
是使用速记符号书写的吗?
解决方案
速记符号称为“参数属性”,具体来说只是将构造函数参数复制到同名的类属性。它不适合你正在做的事情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
属性的值,其x
is1
和y
is 2
。但它公开了一个可选的第四个构造函数参数,该参数覆盖了x
andy
属性:
f = new AbuseFoo("name", 1, 2, new Bar(3, 4));
console.log(JSON.stringify(f)); // {"name":"name","bar":{"x":3,"y":4}}
当然,它比bar
在类中声明并以正常方式在构造函数中设置它更丑陋和复杂。因此,除非您有充分的理由这样做(例如,代码混淆竞赛、人身伤害威胁等),否则我会坚持原来的答案:
不,您不能使用参数属性来设置bar
这种方式。使用速记方法。
推荐阅读
- sql - 根据 SQL Server 中的日期和时间将单行拆分为多行
- tensorflow - 张量流维度/占位符
- java - 为什么java文件编译到java项目中的几个位置
- xamarin - Xamarin Forms:获取无效更新:iOS 中第 0 部分的行数无效
- sql - 这个 SQL 语法是如何工作的?多个左连接,单打开
- xml - 如何以 .XML 文件存储库格式打开 PDI v7 .1 转换
- angular - 如何从列表中显示 ng-templates
- ampl - 在最小化问题上使用ampl的约束中的语法错误
- kubernetes - 如何在 OpenEBS 中获取客户端使用的空间?
- github - Github - 克隆时找不到远程存储库