TypeScript-迁移JavaScript函数
我有一个JavaScript助手函数,可以删除对象的属性:TypeScript-迁移JavaScript函数,typescript,Typescript,我有一个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]: _, ...resul
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错误:类型“Object”没有对应于[prop]
中类型“string”tslint的索引签名
2-如果obj
是泛型(获取泛型类型的所有属性-删除的属性),如何使用正确的类型初始化result
变量?您需要使用泛型参数(让我们调用T
)来表示对象的类型和第二个参数(我们称之为K
)它应该是T的keyof
。对于返回类型,您可以使用ommit
,这将从给定类型中删除一个键(尽管严格来说,您可以将返回类型保留为空,并且可以正确推断)
我有两个lint错误找不到name'Omit'
,Rest类型只能从对象类型创建。由于我使用的是TypeScript 3.1,我理解Omit
错误,但不理解第二个错误error@MouadEnnaciri这两个错误都会发生,因为您在3.1中,最新版本是3.5,代码可以使用它提供向后兼容的版本,但无法使用spread删除属性。正确键入3.2中发生的泛型类型上的spread我理解,这是兼容v3.1的版本?@MouadEnnaciri i添加了3.1的版本。所有ts版本基本上都兼容,但它们也都有一些突破性的更改,可能需要升级在较新版本中,随着类型系统变得更加严格,会产生新的错误。虽然如果它编译,我希望它能像以前一样工作。我希望避免使用delete
运算符,但我将问题标记为已解决,这是由于我的TS版本造成的限制。谢谢
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")
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);