我试图找到一种正确而直接的方法,将一个复杂的对象Map成一个简单的对象。
我想利用这样的东西:
interface TransferableResponse<T> {
toServiceResponse(): T;
}
export interface SimpleUserObject {
accessToken: string;
refreshToken: string;
expiresIn: number;
refreshTokenExpiresIn: number;
roleIds: number[];
}
export class ComplexUserObject implements TransferableResponse<SimpleUserObject> {
accessToken: string;
refreshToken: string;
expiresIn: number;
refreshTokenExpiresIn: number;
someRedundancy: Guid;
someWeirdStuff: string;
complexRoles: [{id: number, name: string}];
constructor(init?: Partial<ComplexUserObject>) {
Object.assign(this, init);
}
toServiceResponse(): SimpleUserObject {
return {
...this,
roleIds: this.complexRoles.map(role => role.id)
};
}
}
所以在这种情况下,我创建了ComplexUserObject
,但是当调用toServiceResponse()
时,我希望得到**仅SimpleUserObject
**中指定的属性。实际上,我得到了两者的组合(roleIds
,但还有complexRoles
,someWeiredStuff
和someRedundancy
)。
长话短说,有没有一种简单的、一行的方式来表示...this
,但要删除类型中不包含的内容?伪:(...this as SimpleUserObject)
1条答案
按热度按时间n8ghc7c11#
不幸的是,您总是需要手动指定希望以某种方式应用于
SimpleUserObject
的ComplexUserObject
中的密钥。接口在运行时并不存在,所以当接口被剥离时,你的代码需要是有效的JavaScript。没有JavaScript方法告诉方法"获取键的这个子集"而不显式地列出这些键,例如手动地作为新对象上的键,作为迭代的数组,作为迭代的引用对象等等
最简单的办法就是列出新密钥
您也可以使用类而不是接口(这将允许生成的具体示例成为类型化实体,即使在JavaScript中也是如此),但仍然需要手动列出键来示例化类,只是这次是在构造函数中而不是直接在返回的对象上
x一个一个一个一个x一个一个二个x