如果有人能帮助我,那将是非常感激的:)。我一直在为typescript的语法而苦恼(这里是初学者)。
我需要重构这段代码,以便我可以得到完整的serviceBranch列表。正确的一些过滤和映射已经完成,一个serviceBranch正在从我们的API返回.我已经尝试删除一些过滤器,但可能不是正确的。谁能帮助我获得所有的serviceBranches(所以按顺序的话删除正确的过滤器)。
谢谢你的帮助。
public async personNews(serviceBranch?: string[]): Promise<INews> {
const fetchResult: IPersonNewsFetchResultEntry[] = await this._get('api/person/news/', newsSchema, true) as IPersonNewsFetchResultEntry[];
const serviceBranches: string[] = (serviceBranch !== undefined ? serviceBranch : fetchResult.filter((entry: IPersonNewsFetchResultEntry, index: number, array: IPersonNewsFetchResultEntry[]): boolean => {
return entry.niveauID === NewsLevel.ServiceBranch && array.findIndex((value: IPersonNewsFetchResultEntry): boolean => {
return entry.unitID === value.unitID;
}) === index;
}).map((entry: IPersonNewsFetchResultEntry): string => {
return entry.unitID;
}));
为什么所有的东西都有显式类型,有什么原因吗?
是不是因为 this._get('api/person/news/', newsSchema, true);
返回 any
?
稍微重构和删除类型后,就更清楚了。
public async personNews(serviceBranch?: string[]): Promise<INews> {
const fetchResult = await this._get('api/person/news/', newsSchema, true);
let serviceBranches: string[] = [];
if(serviceBranch) {
serviceBranches = serviceBranch;
return;
}
serviceBranches = fetchResult.filter((entry, index, array) => {
return entry.niveauID === NewsLevel.ServiceBranch
&& array.findIndex(({unitID}) => entry.unitID === unitID) === index;
}).map(entry => entry.unitID)
}
这是一个非常密集的函数,人类很难解析和理解。所以让我们把它格式化得更好。
public async personNews(serviceBranch?: string[]): Promise<INews> {
const fetchResult: IPersonNewsFetchResultEntry[] = (await this._get(
'api/person/news/',
newsSchema,
true,
)) as IPersonNewsFetchResultEntry[]
const serviceBranches: string[] =
serviceBranch !== undefined
? serviceBranch
: fetchResult
.filter(
(
entry: IPersonNewsFetchResultEntry,
index: number,
array: IPersonNewsFetchResultEntry[],
): boolean => {
return (
entry.niveauID === NewsLevel.ServiceBranch &&
array.findIndex(
(value: IPersonNewsFetchResultEntry): boolean => {
return entry.unitID === value.unitID
},
) === index
)
},
)
.map((entry: IPersonNewsFetchResultEntry): string => {
return entry.unitID
})
现在很明显 fetchResult
首先过滤掉一些项目,然后将这些项目映射过来,只返回它们的 unitID
.
从你的问题中很难知道你想要什么逻辑,也不知道你的数据是什么样的。但是,如果你想要 都 的结果,消除了 filter()
调用。如果你想返回整个对象,而不是只返回 unitID
移除 map()
完全调用。如果你想要不同的过滤逻辑,请改变该调用的内部逻辑。filter
.