Typescript 在没有运行时代码的情况下向对象类型添加新属性 type-FormerActions= | { 类型:“行动A” 有效载荷:字符串 } | { 类型:“动作B” 有效载荷:编号 } 类型转换器=。。。 类型ModifiedActions=转换器 //应该输出 类型修改= | { 组:“域” 类型:“行动A” 有效载荷:字符串 } | { 组:“域” 类型:“动作B” 有效载荷:编号 }

Typescript 在没有运行时代码的情况下向对象类型添加新属性 type-FormerActions= | { 类型:“行动A” 有效载荷:字符串 } | { 类型:“动作B” 有效载荷:编号 } 类型转换器=。。。 类型ModifiedActions=转换器 //应该输出 类型修改= | { 组:“域” 类型:“行动A” 有效载荷:字符串 } | { 组:“域” 类型:“动作B” 有效载荷:编号 },typescript,Typescript,我想编写一个转换器“type function”,它接受上面列出的参数,并输出一个与ModifiedActions相同(或结构相同)的类型 我知道我可能可以使用映射类型来添加属性,也许条件类型可以处理分布式的东西?试试看 type FormerActions = | { type: "ACTION_A" payload: string } | { type: "ACTION_B" payload: number } typ

我想编写一个
转换器
“type function”,它接受上面列出的参数,并输出一个与
ModifiedActions
相同(或结构相同)的类型

我知道我可能可以使用映射类型来添加属性,也许条件类型可以处理分布式的
东西?

试试看

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
    }
type Id={[K in keyof T]:T[K]}
类型转换器=T扩展任何?Id:从来没有
也许吧

这个想法实际上是通过
T扩展任何?…来覆盖类型
T
,然后将每个成分与中的
记录
合并。最后,我使用了
Id
,它只是遍历一个类型并将其作为键值对输出

尽管如此,我认为这种类型本质上等同于录制&T。分布和合并只是为了美观(也许可以避免一些奇怪的边缘情况,尽管它也增加了一些)


希望有帮助。祝你好运

如果您执行以下操作,当您将鼠标悬停在类型上(您消除了交叉点类型)时,您还将获得更好的名称:
type Converter=T extends any?{[P-in-keyof-Id]:Id[P]}:永远不会
这不就是
Id
?我看不出有什么变化。当我将鼠标悬停在我的上方时,我得到的输出没有交叉点(这就是
Id
所做的)。困惑。在你的版本中,如果我悬停在上面,我会得到流动的:
type ModifiedActions=Id | Id
与我的版本一起,我会得到
type ModifiedActions={group:“DOMAIN”;type:“ACTION_A”;payload:string;}{group:“DOMAIN”;type:“ACTION_B”;payload:number;}
功能相同,但第二个稍微容易阅读:)我还提出了
导出类型AddProp2=T扩展了什么?T&K:never
,我可以将对象传递给第二个参数。提香的答案是,不知何故,将对象降级为
{[string]:any}
。可悲的是,如果语法更清晰就好了。所以最后它非常简单,但我从未发现我可以对映射类型抛出一个
T扩展任何
:)@TitianCernicova Dragomir不确定我们的环境中有什么不同;我用我的VSCode检查
修改的屏幕截图编辑了以上内容。
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