typescript - 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
解决方案
您需要使函数泛型,使用泛型参数(让我们调用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);
推荐阅读
- c++ - 使用 conan 仅安装 boost 的一部分
- android - 以编程方式将 apk 从本地资产目录安装/卸载到 android studio 中的真实设备
- oracle - 如何修复 ORA-04091:表正在变异,触发器/函数可能看不到它?
- flutter - 如何制作带有白色边框和背景颜色的最喜欢的图标?
- python - tf.compat.v1.train.exponential_decay:全局步长 = 0
- symfony - Symfony messenger 工作人员在主管下运行时不会停止
- azure-devops - 使用负载均衡器部署到多台服务器
- airflow - Airflow - 只有在另一个 DAG 上的所有任务都成功时才运行 DAG
- python-3.x - 复制没有父文件夹的子文件夹
- javascript - 如何遍历地图并仅获取前几个键值对并将它们传递给另一个函数?