在没有运行时代码的情况下向对象类型添加新属性

时间:2018-04-12 16:26:58

标签: typescript

type FormerActions =
  | {
      type: "ACTION_A"
      payload: string
    }
  | {
      type: "ACTION_B"
      payload: number
    }

type Converter = ...

type ModifiedActions = Converter<FormerActions, "group", "DOMAIN">

//should output
type ModifiedActions =
  | {
      group: 'DOMAIN'
      type: "ACTION_A"
      payload: string
    }
  | {
      group: 'DOMAIN'
      type: "ACTION_B"
      payload: number
    }

我想编写一个Converter“类型函数”,它接受上面列出的参数,并输出与ModifiedActions相等(或结构相等)的类型。

我知道我可以使用映射类型来添加属性,也许条件类型可以用于分配|事物?

1 个答案:

答案 0 :(得分:2)

尝试

type Id<T> = {[K in keyof T]: T[K]}  
type Converter<T, K extends string, V> = T extends any ? Id<Record<K, V> & T> : never

可能?

enter image description here

T确实distributeT extends any ? ... Record<K, V>类型的想法,然后将Id<T>中的每个成分与Record<K, V> & T合并。最后,我使用了{{1}},它只是遍历一个类型并将其作为键值对输出。

所有这一切,我认为,这种类型基本上只相当于{{1}}。分配和合并只是相当漂亮(并且可能避免一些奇怪的边缘情况,尽管它也增加了一些。)

希望有所帮助。祝你好运!