我有两种方法可返回以下类型Pick<T, K>
和Omit<T, K>
,其中Omit为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}
类型的对象
答案 0 :(得分:0)
您的问题与打字稿无关。类型可以按您期望的方式omitMany
工作,唯一的问题是在运行时它不会删除您期望的所有属性,这是由于您调用{{1} },而不是先前的结果。不幸的是,这需要一些类型断言,但是它将起作用:
omitOne