这里的用例是使用泛型将带有 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 实现。
| 归档时间: |
|
| 查看次数: |
14604 次 |
| 最近记录: |