我想将 API 提供的对象同步到表中。 该表在 Sequelize 中定义,并具有一个接口(interface)和一个类:
declare interface SampleInterface {
value1?: string;
value2?: string;
value3?: number;
}
class SampleClass implements SampleInterface {
value1?: string;
value2?: string;
value3?: number;
}
API 的响应并不总是相同的,但可能看起来像这样:
const sampleResponse = {
value2: "..."
value3: 0
value4: "..."
}
现在,我只想创建一个可以传递给具有匹配内容的 sequelize 的新对象,例如:
const filteredResponse = {
value2: "..."
value3: 0
}
如何将对象属性键与接口(interface)或类相匹配?
谢谢!
最佳答案
如果我没理解错的话,你:
有:产生不是 100% 可预测响应的 API。
想要:从这个不受信任的来源创建类的具体实例
如果我是对的,你有两个选择:
如果输入对象不是很大而且不是动态的,你可以显式地做所有事情:
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);
更新
Is there any way, I could the get keyof MyClass programmatically
主要思想是得到一个解析原始响应的方案。幸运的是,您已经知道了。
因此您需要:创建所需类的实例,并从中获取 key :
这可以通过以下方式完成:
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
关于javascript - typescript :按接口(interface)或类过滤对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62087922/