angular - 在 Angular 打字稿中重构重复的代码
问题描述
我需要重构重复的代码,但我不知道该怎么做。
我有两种基本上调用相同服务的方法(由于分页,我需要调用相同的请求)但现在由于重复代码而看起来很难看。我怎样才能使它变得更好?
getStockData(id: string): Observable<{
searchResult: IStockResult[];
searchCount: number;
}> {
return this.service
.search(
id,
this.service.getSearchMetaDefaults()
)
.pipe(
map(response => {
return {
searchResult: response,
searchCount: response.meta.totalResourceCount
};
})
);
解决方案
这个问题可能有多种优雅的解决方案。我可以提出以下快速更改
- 为使用的对象定义类型(例如,使用 TS 接口)
export interface ISearch {
searchResult: IStockResult[];
searchCount: number;
}
export interface IMeta {
pagination: {
size: number;
index: number;
},
sorting: {
order: string;
attribute: string;
}
}
- 使用定义的类型定义可选参数
?:
,并将参数作为对象发送。
getData(id: string, meta?: IMeta): Observable<ISearch>
所以以前的电话会变成
getStockData('some id') -> getData('some id')
paginate(1, 3, 'some id', 'some order', 'some attr') ->
const meta: IMeta = {
pagination: {
size: 3,
index: 1
},
sorting: {
order: 'some order',
attribute: StockMapper.getDataForSorting('some attr')
}
};
getData('some id', meta);
- 在使用可选参数之前,检查是否使用空值合并运算符 (
??
)定义了可选参数。
const meta = meta ?? this.service.getSearchMetaDefaults();
结合一切
getData(id: string, meta?: IMeta): Observable<ISearch> {
const meta = meta ?? this.service.getSearchMetaDefaults();
return this.service.search(id, meta).pipe(
map(response => ({
searchResult: StockMapper.fromStockResource(response),
searchCount: response.meta.totalResourceCount
} as ISearch))
);
}
推荐阅读
- c# - C# LINQ 过滤器 IEnumerable
并表示为 IEnumerable - sorting - 根据组将字典排序为两个不同的列表
- ruby-on-rails - Rails - collection_check_boxes 未触发连接模型上的回调
- grafana - 以编程方式导出 grafana 仪表板数据
- excel - MS Query 在 OBDC 查询中将十进制作为参数传递
- javascript - (ASP.NET) args.IsValid 如何阻止表单被提交?
- r - 将读取为字符的对比列表传递给R中的线性模式
- ios - Firebase 中生产的 APNs 身份验证密钥失败
- javascript - 基于另一个文本框值隐藏文本框的 Javascript 代码
- postgresql - 如何使用键和列名称以及更新列值将表数据中的更改记录到另一个表