gpt4 book ai didi

javascript - typescript :按接口(interface)或类过滤对象

转载 作者:行者123 更新时间:2023-12-05 01:36:25 24 4
gpt4 key购买 nike

我想将 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 :

这可以通过以下方式完成:

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

关于javascript - typescript :按接口(interface)或类过滤对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62087922/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com