Если я вас правильно понимаю, вы:
Имеете: API, который дает не 100% предсказуемый ответ.
Хотите: создать конкретный экземпляр класса из этого ненадежного источника
Если я прав, у вас есть два варианта:
Если входной объект не очень большой и динамический c, вы можете сделать все явно:
const unreliableObject = fetchFromApi();
const result = new Result();
if (typeof unreliableObject.name === 'string') {
result.name = unreliableObject.name;
}
Этот код более-менее в порядке, за исключением того, что он toooo подробный.
В качестве немного более продвинутого решения вы можете создать TransformationMapper, примерно так:
class MyClass {
name: string;
}
const expectedKeys: (keyof MyClass)[] = ['name'];
const data: any = { v: 1, name: '13212' };
const res = expectedKeys.reduce((result, fieldName) => {
const value = data[fieldName];
if (value != null) {
result[fieldName] = data[fieldName]
}
return result;
}, new MyClass());
console.log(res);
ОБНОВЛЕНИЕ
Есть ли способ получить ключ MyClass программно
Основная идея состоит в том, чтобы получить схему для разбора исходного ответа. К счастью, вы его уже получили.
Итак, вам нужно: создать экземпляр нужного класса и получить от него ключи:
Это можно сделать с помощью:
Object.keys ()
Object.entries ()
const data: any = {};
let result = new MyClass();
result = Object.keys(result).reduce((result, fieldName) => {
const value = data[fieldName];
if (value != null) {
result[fieldName] = data[fieldName]
}
return result;
}, result)
Но я также должен вас предупредить . Если вы не доверяете API, вам следует не только анализировать, но и проверять значения, которые вы анализируете. В другом случае неверные типы, предоставленные через API, могут сломать ваше приложение.
Вы можете написать свою собственную проверку (это не так сложно) или взять что-то существующее, например да