我的Typescript类包含方法App.jar
,它过滤定义为构造函数参数的集合。
getProductAttributeByName(name: string)
这是不允许的,所以目前我正在做:
class Product {
id: string;
constructor(productDto: IProductDto) {
this.id = productDto.id;
}
getProductAttributeByName(name: string): ProductAttribute {
// I need productDto (the constructor parameter) here:
return productDto.productAttributes.filter(x => x.name === name)
}
}
毋庸置疑,这太可怕了。我正在公开一个只在方法中需要的公共属性,这是我无法访问构造函数参数的唯一原因。出于绝望,我还尝试将属性声明为class Product {
id: string;
productDto: IProductDto;
constructor(productDto: IProductDto) {
this.id = productDto.id;
this.productDto = productDto;
}
getProductAttributeByName(name: string): ProductAttribute {
return this.productDto.productAttributes.filter(x => x.name === name)
}
}
,如下所示:
private
但这并没有改变一旦初始化对象后仍然可以访问该属性的事实:
class Product {
id: string;
private productDto: IProductDto;
constructor(productDto: IProductDto) {
this.id = productDto.id;
this.productDto = productDto;
}
getProductAttributeByName(name: string): ProductAttribute {
return this.productDto.productAttributes.filter(x => x.name === name)
}
}
有没有办法在方法中访问构造函数参数而无需声明可公开访问的属性?
答案 0 :(得分:1)
"仅仅因为我的方法无法访问构造函数参数......" 正在考虑错误的术语。在实例化您的类时,productDto
是您实例的重要状态吗? productDto
中的数据是否包含Product
在其生命周期内需要的重要信息?然后,您不仅要尝试在构造函数和某个方法之间传递它,而且该数据是对象状态的一部分。并且您的对象方法使用并依赖于该状态。对象状态总是由对象属性实现,因此在productDto
上保存this.productDto
是完美的,并且是正确的方法。
但这并没有改变一旦初始化对象后仍然可以访问该属性的事实。
那又怎样?使用TypeScript和private
声明,TypeScript将确保您不会通过尝试从外部代码访问该属性来拍摄自己的脚。这就是你所需要的一切。实际上试图强制执行不可访问性没有任何意义。你只是为了几乎没有任何收获而向后弯腰。许多Javascript对象都有内部状态,如果您愿意,可以在其中查找。这完全没问题。
如果你实际上是针对这些不属于官方API的内部属性编写代码,并且内部实现发生了变化,那么这只是一个问题。根本不要这样做。同样,TypeScript' s private
可以帮助您实现这一点。
this.id = productDto.id;
this.productDto = productDto;
这非常多余。很明显,您在其他方法中稍后需要productDto.id
和 productDto
。只需将整个productDto
存储为属性,并根据需要访问其.id
。如果您需要在类上公开id
属性,则使用返回get
的{{1}}方法可能是一个明智的想法:
this.prodctDto.id
通常,尝试设计类而不先编写构造函数。写下所有但是构造函数。设计您的类需要的内部和外部属性以及您的方法将从中获取数据的属性。然后,作为最后一步,编写构造函数,该构造函数需要确保对象状态使得所有方法都可以按设计工作。然后思考"从构造函数传递到方法"避免自己。