从 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 }
,c
和 b
的类型将被推断为 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
的类型。
在 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 }
,c
和 b
的类型将被推断为 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
的类型。