首页 > 解决方案 > TypeScript - 迁移 JavaScript 函数

问题描述

我有一个 JavaScript 辅助函数,它允许删除对象的属性:

removeProp(obj, prop) {
  const { [prop]: _, ...result } = obj;
  return result;
}

打字稿版本:

removeProp(obj: Object, prop: string): Object {
  // tslint:disable-next-line: no-shadowed-variable
  const { [prop]: _, ...result } = obj;
  return result;
}

1- 我有一个 lint 错误:type 'Object' has no index signature corresponding to type 'string' tslint[prop].

2-如果是泛型(获取泛型类型的所有属性 - 已删除的属性),我如何result使用正确的类型初始化变量?obj

标签: typescript

解决方案


您需要使函数泛型,使用泛型参数(让我们调用T)来表示对象的类型和第二个参数(让我们调用它K)应该是keyof T. 对于您可以使用的返回类型Omit<T, K>,它将从给定类型中删除一个键(虽然严格来说,您可以将返回类型留空并且它将被正确推断)

function removeProp<T, K extends keyof T>(obj: T, prop: K): Omit<T, K> {
  const { [prop]: _, ...result } = obj;
  return result;
}

let o = removeProp({ a: 1, b: 2}, "b")

适用于 3.1 的版本不能使用扩展(因为该版本不支持使用泛型类型参数进行扩展,这在 3.2 中是允许的)并且必须定义Omit为 3.1 中也不存在(在 3.5 中添加)


type Omit<T, K extends PropertyKey> = Pick<T, Exclude<keyof T, K>>
function removeProp<T, K extends keyof T>(obj: T, prop: K): Omit<T, K> {
  const result = Object.assign({}, obj);
  delete result[prop]
  return result;
}

let o = removeProp({ a: 1, b: 2}, "b");
console.log(o);

推荐阅读