Typescript 键入从对象中删除键
我想设置一个函数,使用以下代码从对象中删除密钥:Typescript 键入从对象中删除键,typescript,Typescript,我想设置一个函数,使用以下代码从对象中删除密钥: type GenericObject = { [key: string]: any; }; const removeKey = ( inputObject: GenericObject, key: string, ) => { if (!inputObject.hasOwnProperty(key)) { return inputObject; } const { [key]: _, ..
type GenericObject = {
[key: string]: any;
};
const removeKey = (
inputObject: GenericObject,
key: string,
) => {
if (!inputObject.hasOwnProperty(key)) {
return inputObject;
}
const {
[key]: _,
...rest
} = inputObject;
return rest;
};
这在某种程度上是有效的,因为它从对象中删除了一个键,但我觉得键入可能会更好。实际上,我希望typescript能够知道,这将返回一个与传递的类型相同的对象,只是没有指定的键。
我研究了对这类事情有用的方法,但不幸的是,我无法将其配置为工作。我觉得这是可能的,但我还没有找到一种有效的方法。有人知道这样做的方法吗?您需要使函数成为泛型函数,一个类型参数用于捕获对象的类型,另一个类型参数用于捕获表示传入键的字符串文本类型
const removeKey = <T, K extends keyof T>(
inputObject: T,
key: K,
) => {
if (!inputObject.hasOwnProperty(key)) {
return inputObject;
}
const {
[key]: _,
...rest
} = inputObject;
return rest;
};
let a = removeKey({ a: 10, b: 10 }, 'b');
a.a // ok
a.b // err
非常感谢!我正试图让它与我的代码一起工作,它看起来完全没问题,但我认为我的打字脚本版本有问题。我在2.2上,它似乎在推广仿制药方面有问题。@OliverRadini,嗯。。2.2岁了,我们也许能做点什么。。但我不确定..哈,是的,我是从一个样板开始的,没有检查版本。我将致力于升级typescript版本,并以这种方式解决它,我与2.2没有任何特别的联系。不幸的是,3.2+由于某种原因破坏了我的项目,因此我还无法将typescript升级到一个有此功能的版本supported@OliverRadini我想我们可以为2.2构建一个省略类型,让我检查一下
type Diff<T extends string, U extends string> = ({[P in T]: P } & {[P in U]: never } & { [x: string]: never })[T];
type Omit<T, K extends keyof T> = Pick<T, Diff<keyof T, K>>;
const removeKey = <T, K extends keyof T>(
inputObject: T,
key: K,
): Omit<T, K> => {
if (!inputObject.hasOwnProperty(key)) {
return inputObject as any as Omit<T, K>;
}
const result = Object.assign({}, inputObject);
delete result[key]
return result as any as Omit<T, K>;;
};