在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
)
答案 0 :(得分:2)
使用结构化分配来创建没有该属性的新对象,而不是从a
中删除该属性:
const {c, ...b} = a;
此后,b
将包含a
之外的所有c
成员。
鉴于a
是某种类型,例如{ c: string, d: string }
,c
和b
的类型将被推断为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的问题,而不是打字稿。