我有两种返回以下类型的方法Pick<T, K>
and 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}