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

标签 javascript node.js typescript object

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

相关文章:

javascript - 纹理坐标拾取

node.js - sqlite3 nodejs - 同步返回数据

node.js - Puppeteer - 如何使用本地 IP 地址连接 WSEndpoint?

typescript - 为什么未收到我的 x-functions-key Azure Function header ?

angular - 如何导入模块或有条件地提供服务? (AOT)

javascript - 如何使用 React + TypeScript 从 MobX 5 迁移到 MobX 6,而不添加具有 200% 语法噪音的臃肿代码?

javascript - react 按钮 onClick 传递参数

javascript - babel-node 无法在 node_modules 中要求 jsx 文件

javascript - websockets、express.js 无法与服务器建立连接

javascript 获取当前日期时间