我有两个方法返回以下类型的Pick<T, K>
和Omit<T, K>
,其中省略的是type Omit<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>
。当涉及到从对象中删除多个属性时,我遇到了一些问题。
我有一个从对象中选择一个属性的方法pickOne
,从一个对象中选择多个属性的方法pickMany
,以及从一个对象中删除一个属性的方法omitOne。我希望有一个OmitMany方法来从一个对象中删除多个属性,但是在修复方法中的类型错误时,我被困住了。
这些方法的实施:
export let pickOne = <T, K extends keyof T>(entity: T, props: K ): Pick<T, K> => {
return { [props] : entity[props] } as Pick<T, K>
}
export let pickMany = <T, K extends keyof T>(entity: T, props: K[]) => {
return props.reduce((s, prop) => (s[prop] = entity[prop], s) , {} as Pick<T, K>)
}
export let omitOne = <T, K extends keyof T>(entity: T, prop: K): Omit<T, K> => {
const { [prop]: deleted, ...newState} = entity
return newState
}
// And the OmitMany for so far I tried, the problem is with storing the entity
// in a temporary variable. This function only omits the last property in the
// the array. I would like an implementation simular to pickMany.
export let omitMany = <T, K extends keyof T>(entity: T, props: K[]): Omit<T, K> => {
let result = entity as Omit<T, K>
props.forEach(prop => {
result = omitOne(entity, prop)
})
return result
}
我希望omitMany({x: 1, y: 2, z: 3, r: 4}, ['x', 'y'])
的输出是{z: number, r: number}
类型的对象,但是正确地知道输出是{x: number, z: number, r: number}
类型的对象。
发布于 2019-05-22 03:08:56
你的问题与打字本没什么关系。类型的计算结果与您对omitMany
的期望一样,唯一的问题是在运行时,它没有删除所有您期望它的属性,这是因为您在entity
上调用omitOne
而不是前面的结果。不幸的是,这需要某种类型的断言,但它会起作用:
type Omit<T, K> = Pick<T, Exclude<keyof T, K>>
let omitOne = <T, K extends keyof T>(entity: T, prop: K): Omit<T, K> => {
const { [prop]: deleted, ...newState } = entity
return newState
}
let omitMany = <T, K extends keyof T>(entity: T, props: K[]): Omit<T, K> => {
let result = entity as Omit<T, K>
props.forEach(prop => {
result = omitOne(result, prop as unknown as keyof Omit<T, K>) as Omit<T, K>
})
return result
}
let o = omitMany({ x: 1, y: 2, z: 3, r: 4 }, ['x', 'y'])
console.log(o)
发布于 2021-11-22 01:47:12
因为TS3.5和标准的Omit
类型:
function omit<T, K extends keyof T>(obj: T, ...props: K[]): Omit<T, K> {
return props.reduce((o, k) => { delete o[k]; return o; }, { ...obj });
}
https://stackoverflow.com/questions/56255212
复制