我有一个名为IHistoryData的接口
export interface IHistoryData {
CourseId: string,
CourseName: string,
Duration: number,
IsMandatory: boolean,
CompetencyList: string[],
IsActive:boolean
}第二个小接口叫做ICurrentData,
export interface ICurrentData {
CourseId: string,
CourseName: string,
Duration: number,
}ICurrentData属性是IHistoryData属性的子集。
现在,我正试图使用IHistoryData[]、ES6、析构特性将其转换为ICurrentData[],但无法找到任何可行的解决方案。是否可以使用析构将大接口转换为小接口??
我使用的是TS 2.3.3和角4.4
发布于 2017-11-26 14:08:29
你可以把结构分解成地图的一部分,或者你只需要映射.无论哪种方式都没有很大的差别,所以选择最易读的是什么。
对于所有示例,我在变量input中使用源数据。
快速换型
如果您只需要更改类型,实际上不需要映射,因为您可以将input分配给ICurrentData[],因为它是一个兼容的类型。从技术上讲,数据仍然存在于输入中,但是当您使用output时,它只会自动完成属性的子集。
const output: ICurrentData[] = input;解构
在财产名称相同的地方,你可以这样拆解.
const output: ICurrentData[] = input.map((history) => {
const { CourseId, CourseName, Duration } = history;
return {
CourseId,
CourseName,
Duration
};
});
alert(JSON.stringify(output));负解构
您还可以通过列出您不希望在析构分配中映射的项来执行“负析构”,并使用rest参数获取您想要的所有内容。这是一个巧妙的技巧,但我不喜欢“你不想要的东西”的耦合。如果您只需要从20个属性中删除一个或两个属性,它可能是一个选项。
const output: ICurrentData[] = input.map((history) => {
const { IsMandatory, CompetencyList, IsActive, ...data } = history;
return data;
});
alert(JSON.stringify(output));不同的财产名称
如果源数据对属性有不同的名称(例如,A、B、C),则可以将其映射为析构的一部分。
const output: ICurrentData[] = input.map((history) => {
const { A: CourseId, B: CourseName, C: Duration } = history;
return {
CourseId,
CourseName,
Duration
};
});
alert(JSON.stringify(output));简单地图
有时候,简单是美丽的。这是一个简单的映射,使用与前面示例相同的属性。
const output: ICurrentData[] = input.map((history) => {
return {
CourseId: history.A,
CourseName: history.B,
Duration: history.C
};
});
alert(JSON.stringify(output));https://stackoverflow.com/questions/47496856
复制相似问题