从TypeScript对象中删除动态键

时间:2019-02-18 14:17:41

标签: javascript typescript ecmascript-6 ecmascript-5 ecma

在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

3 个答案:

答案 0 :(得分:2)

使用结构化分配来创建没有该属性的新对象,而不是从a中删除该属性:

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

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

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

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

c

如果您在编译时知道属性名称,则上述方法将起作用。如果您的情况并非如此,那么TypeScript编译器将无法真正帮助您,因为它无法确定操作的结果类型。

最好将const {c: someOtherName, ...b} = a; 键入为a,在这种情况下最好使用{ [k: string]: number },或者可以使用类似以下的内容:

delete a[c]

答案 1 :(得分:2)

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

"string_from_array": null

在这里,我们将属性{em> something (从const a = { 'something': 1, 'e': 2, }; const c = 'something'; const { [c]: _, ...withoutC } = a; 取值)放入c变量中,所有其他道具都放在_变量中。 withoutC定义为c的事实允许打字稿正确地推断const的类型。

答案 2 :(得分:0)

当然!您可以使用Omit类型:

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

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

P.S。我意识到您可能已经问过值,而不是类型。您应该问关于javascript的问题,而不是打字稿。