Typescript:按接口或类过滤对象

2024-03-27

我想将 API 提供的对象同步到表。 该表在 Sequelize 中定义,有一个接口和一个类:

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: "..."
}

现在,我只想创建一个可以传递给具有匹配内容的续集的新对象,例如:

const filteredResponse = {
  value2: "..."
  value3: 0
}

如何将对象属性键与接口或类匹配?

Thanks!


如果我理解正确的话,你:

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Typescript:按接口或类过滤对象 的相关文章

随机推荐