如何省略“删除”一个对象的许多属性?

时间:2019-05-22 10:53:55

标签: typescript object

我有两种方法可返回以下类型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}类型的对象

1 个答案:

答案 0 :(得分:0)

您的问题与打字稿无关。类型可以按您期望的方式omitMany工作,唯一的问题是在运行时它不会删除您期望的所有属性,这是由于您调用{{1} },而不是先前的结果。不幸的是,这需要一些类型断言,但是它将起作用:

omitOne

Playground