如果我理解正确,您:
有:一个API,其响应不是100%可预测的。
想要:从这个不受信任的来源创建一个类的具体实例。
如果我没错,您有两个选择:
如果输入对象不是非常大且动态的,您可以明确地完成所有操作:
const unreliableObject = fetchFromApi();
const result = new Result();
if (typeof unreliableObject.name === 'string') {
result.name = unreliableObject.name;
}
这段代码基本上还可以,只是太啰嗦了。
作为更高级的解决方案,你可以创建一个 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提供的不正确的类型可能会破坏你的应用程序。
你可以编写自己的验证(这并不难),或者使用像yup这样的现有工具。