typescript Map类型-自动移除类型中未指定的属性

unhi4e5o  于 2023-01-21  发布在  TypeScript
关注(0)|答案(1)|浏览(199)

我试图找到一种正确而直接的方法,将一个复杂的对象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,但还有complexRolessomeWeiredStuffsomeRedundancy)。
长话短说,有没有一种简单的、一行的方式来表示...this,但要删除类型中不包含的内容?伪:(...this as SimpleUserObject)

n8ghc7c1

n8ghc7c11#

不幸的是,您总是需要手动指定希望以某种方式应用于SimpleUserObjectComplexUserObject中的密钥。
接口在运行时并不存在,所以当接口被剥离时,你的代码需要是有效的JavaScript。没有JavaScript方法告诉方法"获取键的这个子集"而不显式地列出这些键,例如手动地作为新对象上的键,作为迭代的数组,作为迭代的引用对象等等
最简单的办法就是列出新密钥

toServiceResponse(): SimpleUserObject {
  return {
    accessToken: this.accessToken,
    refreshToken: this.refreshToken,
    expiresIn: this.expiresIn,
    refreshTokenExpiresIn: this.refreshTokenExpiresIn,
    roleIds: this.complexRoles.map(role => role.id)
  };
}

您也可以使用类而不是接口(这将允许生成的具体示例成为类型化实体,即使在JavaScript中也是如此),但仍然需要手动列出键来示例化类,只是这次是在构造函数中而不是直接在返回的对象上
x一个一个一个一个x一个一个二个x

相关问题