首页 > 解决方案 > 打字稿:如何从对象中获取属性子集?

问题描述

例子:

type t = {
  a1: boolean;
  a2: number;
  a3: string;
};

const o1 = {
  a1: true,
  a2: 1,
  a3: 'blah',
  a4: false,
  a5: 'blah blah'
}

const o2: t = o1 as t;  // this doesn't work as I expected

如何动态设置 o2 以仅采用适合类型 t 的 o1 属性?

即,保留适合的属性并丢弃其余的属性。在这种情况下,结果相当于

const o2: t = {
  a1: o1.a1,
  a2: o1.a2,
  a3: o1.a3
}

除了动态完成,因为 t 可能会改变。

标签: javascripttypescript

解决方案


我不认为 TypeScript 有任何内置的东西可以让你这样做。它需要一种反射形式,这反过来又需要 TypeScript 向t它输出的 JavaScript 发出一个 ' 成员列表,而通常它不会这样做。我在 TypeScript 文档中没有找到任何关于反射的内容(这令人惊讶)。

作为一种解决方法,您可以列出数组中的成员。这是重复,但似乎是不可避免的重复:

type t = {
  a1: boolean;
  a2: number;
  a3: string;
};
const t_members = ["a1", "a2", "a3"];

那么这是一个简单的循环:

const o2: t = {} as t;
for (const member of t_members) {
    o2[member] = o1[member];
}

如果这是您经常做的事情,请为它创建一个实用函数。


推荐阅读