在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
)
您正在寻找计算属性名称和解构的组合。更多信息here
const a = {
'something': 1,
'e': 2,
};
const c = 'something';
const { [c]: _, ...withoutC } = a;
在这里,我们将属性的值(取自c
变量)放入_
变量,所有其他道具转到withoutC
变量。 c
定义为const
的事实允许打字稿正确地推断出withoutC
的类型。
不是从a
中删除属性,而是使用destructured assignment来创建没有该属性的新对象:
const {c, ...b} = a;
在此之后b
将包含除a
之外的c
的所有成员。
鉴于a
是某种类型,比如{ c: string, d: string }
,c
和b
的类型将分别推断为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"]);
当然!您可以使用Omit
类型执行此操作:
type Omit<T, K> = Pick<T, Exclude<keyof T, K>>
type DeleteBar = Omit<{bar: 123, baz: 123}, 'bar'> // {baz: 123}
附:我意识到你可能会问过价值而不是类型。你可能应该问一下javascript,而不是打字稿。