我有一个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);