我有一种方法可以接收两个params:
我还有一个枚举GroupColumns
enum GroupColumns {
ColumnTypeX = 'Column Type X',
ColumnTypeY = 'Column Type Y',
ColumnTypeZ = 'Column Type Z'
}当第二个参数匹配第二个组时,当第一个组等于GroupColumns枚举中的任何组时,该方法计算特定组类型的所有度量的总和。
private ComputeSpecificColumnMeasure(data: Array<IDynamic<any>>, groupType: String): number {
let measure: number = 0;
data.forEach(el => {
if (el.group2 === groupType && (el.group1 === GroupColumns.ColumnTypeX || el.group1 === GroupColumns.ColumnTypeY || el.group1 === GroupColumns.ColumnTypeZ )) {
measure += el.measure;
}
});
return measure;
}我不喜欢里面的核查。如果我想要添加更多的列(不太可能),我需要展开它,或者创建另一个方法来检查group1是否等于任何GroupColumns。
有什么意见吗?
如何使这段代码可伸缩和优化
发布于 2020-10-14 16:53:45
如果可能的话,我会将GroupColumns改为数组。这样,您所需要做的就是使用.includes来查看条目是否包含在其中。其他改进可包括:
如果可能,让TS自动推断类型。您只需要表示一个变量的类型或返回值的类型,当TS不能单独这样做的时候。TS可以自动确定ComputeSpecificColumnMeasure返回一个数字。它还可以确定measure将是一个数字,因此不需要表示其中任何一个的类型。
避免字符串类型" String“类型是通过字符串构造函数(如const str = new String('data'); )创建的。这几乎不是您想要的-对于一个普通的字符串,使用string (原语)类型代替。(TSLint规则:ban-types)
避免any你有data: Array<IDynamic<any>>。应该尽可能避免在any中使用TypeScript,因为它非常灵活--它失去了类型安全性。如果您不知道类型是什么,请使用unknown,它是类型安全的。
关于any问题的一个小例子:
const fn = (arg: any) => {
console.log(arg.toFixed(2));
}这不会引发TS错误,但除非传递的参数恰好是数字,否则很可能引发运行时错误。相反,使用unknown会引发TS错误--它将迫使您在调用特定方法之前先缩小类型。
const fn = (arg: unknown) => {
if (typeof arg === 'number') {
console.log(arg.toFixed(2));
}
}即使函数中没有使用any的值,在可能的情况下也最好避免使用any。(TSLint规则:no-unsafe-any)
按照惯例,大写化中只有少数东西在JS中使用PascalCase:
React)普通的方法可能应该使用标准的camelCase代替。
const groupColumns = [
'Column Type X',
'Column Type Y',
'Column Type Z'
] as const; // Use "as const" to prevent automatic widening to `string[]`
private computeSpecificColumnMeasure(data: Array<IDynamic<unknown>>, groupType: string) {
let measure = 0;
data.forEach(el => {
if (el.group2 === groupType && groupColumns.includes(el.group1)) {
measure += el.measure;
}
});
return measure;
}或者,如果您愿意,可以使用.filter和reduce:
private computeSpecificColumnMeasure(data: Array<IDynamic<unknown>>, groupType: string) {
return data
.filter(el => el.group2 === groupType && groupColumns.includes(el.group1))
.reduce((measureSoFar, el) => measureSoFar + el.measure, 0);
}https://codereview.stackexchange.com/questions/250666
复制相似问题