如果我理解正确的话,你:
Have:API 无法产生 100% 可预测的响应。
Want:从这个不受信任的来源创建该类的具体实例
如果我是对的,你有两个选择:
如果输入对象不是很大且不是动态的,您可以显式地执行所有操作:
const unreliableObject = fetchFromApi();
const result = new Result();
if (typeof unreliableObject.name === 'string') {
result.name = unreliableObject.name;
}
这段代码更多-更少OK,除了它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);
UPDATE
有什么办法,我可以通过编程方式获取 MyClass 的 key
主要思想是获得一个解析原始响应的方案。幸运的是,你已经得到了。
因此,您需要:创建所需类的实例,并从中获取密钥:
这可以使用以下方法完成:
对象.keys() https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys
对象.entries() https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/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,你不仅应该解析,还应该validate您正在解析的值。在另一种情况下,通过 API 提供的不正确类型可能会破坏您的应用程序。
您可以编写自己的验证(这并不难)或采用现有的东西,例如yup https://www.npmjs.com/package/yup