使用 Typescript 的通用映射器

Dof*_*f3n 3 typescript

这里的用例是使用泛型将带有 json 结果的获取响应映射到更复杂的类中。

例如,预期返回类型在mapper<T,U>(U json)哪里。T并且U是可选的 json 类。

U可以是一个数组,例如导致T[]或被Array<T>映射。

例如给定一个User

interface CustomAdressImplementation {
  street: string;
  streetNumber: string;
  city: string;
  zip: string;
}

interface User {
  id: string;
  birthDate: Date;
  name: string;
  address: CustomAdressImplementation;
}
Run Code Online (Sandbox Code Playgroud)

示例 json UserJson

[
  {
    "id": 1,
    "birthdate": "2020-02-20T10:00:19.145Z"
    "name": "Leanne Graham"
    "address": {
      "street": "Kulas Light",
      "streetNo": "2b"
      "suite": "Apt. 556",
      "city": "Gwenborough",
      "zipcode": "92998-3874",
      "geo": {
        "lat": "-37.3159",
        "lng": "81.1496"
      }
    },
  },
  [... more users] 
]
Run Code Online (Sandbox Code Playgroud)

自定义映射的一种方法是创建一个映射器方法:

interface GeoJson {
  lat: string;
  lng: string;
}

interface AddressJson {
  street: string;
  streetNo: string;
  suite: string;
  city: string;
  zipcode: string;
  geo: GeoJson;
}

interface UserJson {
  id: number;
  birthdate: string;
  name: string;
  address: AddressJson;
}

export function mapAddress(json: AddressJson): CustomAdressImplementation {
  return {
    street: json.street,
    streetNumber: json.streetNo,
    city: json.city,
    zip: json.zipcode,
  };
}

export function mapUser(json: UserJson): User {
  return {
    id: json.id.toString(),
    birthDate: new Date(json.birthdate),
    name: json.name,
    address: mapAddress(json.address),
  };
}

export function mapUserList(json: UserJson[]): User[] {
  if (json) return json.map(mapUser);
  return [];
}
Run Code Online (Sandbox Code Playgroud)

是否有更优雅的方法来创建规则集来使用泛型进行映射?或者手动自定义映射是复杂映射逻辑的打字稿交易的方式。

在我的示例中,日期、字符串转换和映射到地址类似乎可以更优雅地编写,避免使用样板自定义映射器方法。

使用类转换器库不是一个可接受的解决方案,而是寻找使用泛型的纯 Typescript 实现。

Dof*_*f3n 5

AutoMapper TypeScript是一个按照约定提供对象到对象映射的工具,它尽可能接近原始的 .NET AutoMapper。

这里的例子和问题描述很相似,也提供了解决方案。