Aka*_*ash 2 typescript ecmascript-6
我有一个名为IHistoryData的接口
export interface IHistoryData {
CourseId: string,
CourseName: string,
Duration: number,
IsMandatory: boolean,
CompetencyList: string[],
IsActive:boolean
}
Run Code Online (Sandbox Code Playgroud)
第二个小接口称为 ICurrentData,
export interface ICurrentData {
CourseId: string,
CourseName: string,
Duration: number,
}
Run Code Online (Sandbox Code Playgroud)
ICurrentData属性是IHistoryData属性的子集。
现在我尝试使用ES6 破坏功能将IHistoryData[]转换为ICurrentData[],但无法找到任何可行的解决方案。是否可以使用析构将大接口转换为小接口?
我正在使用 TS 2.3.3 和 Angular 4.4
您可以将解构作为映射的一部分,也可以只进行映射...两种方式都没有很大的差异,因此请选择最具可读性的内容。
对于所有示例,我都使用变量中的源数据input。
如果您只需要更改类型,则实际上不需要映射,因为您可以将其分配给,input因为ICurrentData[]它是兼容类型。从技术上讲,数据仍然存在于输入中,但是当您使用output它时,它只会自动完成属性的子集。
const output: ICurrentData[] = input;
Run Code Online (Sandbox Code Playgroud)
如果属性名称相同,您可以像这样解构......
const output: ICurrentData[] = input.map((history) => {
const { CourseId, CourseName, Duration } = history;
return {
CourseId,
CourseName,
Duration
};
});
alert(JSON.stringify(output));
Run Code Online (Sandbox Code Playgroud)
您还可以通过列出您不想在解构分配中映射的项目来进行“负解构”,并使用剩余参数来获取您想要的所有内容。这是一个巧妙的技巧,但我不喜欢将“你不想要的东西”耦合起来。如果您只需要消除 20 个属性中的一两个,那么它可能是一个选择。
const output: ICurrentData[] = input.map((history) => {
const { IsMandatory, CompetencyList, IsActive, ...data } = history;
return data;
});
alert(JSON.stringify(output));
Run Code Online (Sandbox Code Playgroud)
如果源数据的属性具有不同的名称(例如,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));
Run Code Online (Sandbox Code Playgroud)
有时候,简单就是美。这是一个简单的地图,使用与前面的示例相同的属性。
const output: ICurrentData[] = input.map((history) => {
return {
CourseId: history.A,
CourseName: history.B,
Duration: history.C
};
});
alert(JSON.stringify(output));
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
809 次 |
| 最近记录: |