从 TypeScript 对象中删除动态键

Delete a dynamic key from a TypeScript object

在 TypeScript 中克隆对象非常简单:

const a = {...b}

或克隆和更新

const a = {...b, c: 'd'}

例如,我有这个代码:

const a = {
    'something': 1,
    'e': 2,
};
const c = 'something';
delete a[c];

有没有一个很好的方法来删除那个对象的 属性,而不是使用传统的 delete a[c] 方式? (当然也不是a[c] = undefined

好的!您可以使用 Omit 输入:

type Omit<T, K> = Pick<T, Exclude<keyof T, K>>

type DeleteBar = Omit<{bar: 123, baz: 123}, 'bar'> // {baz: 123}

P.S。我意识到您可能问的是值,而不是类型。您可能应该询问 javascript,而不是打字稿。

与其从 a 中删除 属性,不如使用解构赋值创建一个没有 属性 的新对象:

const {c, ...b} = a;

在此之后 b 将包含 a 的所有成员,除了 c

鉴于 a 是某种类型,例如 { c: string, d: string }cb 的类型将被推断为 string{ d: string } 分别。当然,如果您必须显式编写这些类型注释,使用 建议的 Omit 类型通常比必须以长格式拼写类型要好得多。

您可以使用以下语法重命名 c 以避免与其他名称发生冲突:

const {c: someOtherName, ...b} = a;

如果您在编译时知道 属性 名称,上述方法将起作用。如果在您的场景中不是这种情况,那么 TypeScript 编译器就无法真正帮助您,因为它无法确定操作的结果类型。

您最好将 a 键入 { [k: string]: number },在这种情况下 delete a[c] 就可以了,或者您可以使用如下内容:

const exclude = <T>(map: { [k: string]: T }, omitted: string[]): { [k: string]: T } =>
  return Object.getOwnPropertyNames(a)
    .filter(k => omitted.indexOf(k) >= 0)
    .reduce((a, k) => (a[k] = map[k], a), {})
};
var b = exclude(a, ["c"]);

您正在寻找计算的 属性 名称和解构的组合。更多信息 here

const a = {
    'something': 1,
    'e': 2,
};

const c = 'something';

const { [c]: _, ...withoutC } = a;

这里我们将 属性 something 的值(取自 c 变量)放入 _ 变量和所有其他道具转到 withoutC 变量。 c 定义为 const 的事实允许打字稿正确推断 withoutC 的类型。