Вариант использования здесь, например, отображает ответ выборки с результатом json в более сложный класс с использованием обобщений.
Например, mapper<T,U>(U json)
, где T
- ожидаемый тип возвращаемого значения. И U
необязательно является классом json.
U
может быть массивом, например, приводящим к отображению T[]
или Array<T>
.
Например, заданный класс User
:
class User {
id: string;
birthDate: Date;
name: string;
adress: CustomAdressImplementation
}
пример json UserJson
:
[
{
"id": 1,
"birthdate": "2020-02-20T10:00:19.145Z"
"name": "Leanne Graham"
"address": {
"street": "Kulas Light",
"suite": "Apt. 556",
"city": "Gwenborough",
"zipcode": "92998-3874",
"geo": {
"lat": "-37.3159",
"lng": "81.1496"
}
},
},
[... more users]
]
Один из способов пользовательского сопоставления заключается в создании метода сопоставления:
export function mapUser(json: UserJson): User {
return {
id: json.id.toString(),
birthDate: new Date(json.birthdate),
name: json.name,
orderLines: mapAddress(json.address),
};
}
export function mapUserList(json: UserJson[]): User[] {
if (json) return json.map(mapUser);
return [];
}
Есть ли более элегантный способ создания набора правил для сопоставления этого с использованием обобщений? Или ручное настраиваемое сопоставление - путь к go при торговле машинописью сложных карт сопоставления c.
В моем примере Date преобразование строк и сопоставление с классом адресов выглядят так, как будто их можно было бы написать более элегантно, избегая стандартного метода отображения Mapper.
Использование библиотеки преобразователя классов не является приемлемым решением, в поисках чистой реализации Typescript с использованием обобщений.
Допущения:
- Функции реализации адреса и отображения можно предположить, что он совпадает с json, точка рекурсивно сопоставляется с классом