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>;;
};