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-我有一个棉绒错误:type 'Object' has no index signature corresponding to type 'string' tslint [prop]

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

你需要

使函数泛型,用一个泛型参数(让我们调用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 的版本不能使用 spread(因为该版本不支持带有泛型类型参数的 spread,这在 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);

最新更新