从TypeScript对象中删除动态键

问题描述 投票:0回答:3

在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

javascript typescript ecmascript-6 ecmascript-5 ecma
3个回答
2
投票

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

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

const c = 'something';

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

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


2
投票

不是从a中删除属性,而是使用destructured assignment来创建没有该属性的新对象:

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

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

鉴于a是某种类型,比如{ c: string, d: string }cb的类型将分别推断为string{ d: string }。当然,如果你必须明确地写这些类型的注释,使用Omit类型作为@Nurbol Alpybayev建议通常比必须以长格式拼出类型要好得多。

您可以使用以下语法重命名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"]);

0
投票

当然!您可以使用Omit类型执行此操作:

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

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

附:我意识到你可能会问过价值而不是类型。你可能应该问一下javascript,而不是打字稿。

© www.soinside.com 2019 - 2024. All rights reserved.