【问题标题】:TypeScript: Reverse map key-value type to value-keyTypeScript:将映射键值类型反转为值键
【发布时间】:2020-03-20 12:12:54
【问题描述】:

给定一个类型的对象:

type Key2Value = {
  foo: "bar"
  voo: "doo"
}

假设该类型的值始终是字符串类型,如何构造一个实用类型ReverseMap<T>将键值对反向映射为值键对?

type Value2Key = ReverseMap<Key2Value>
// yields:
type Value2Key = {
  bar: "foo"
  doo: "voo"
}

【问题讨论】:

  • 张贴以记录 jcalz 对answer 的申请。

标签: typescript


【解决方案1】:
type Key2Value = {
  foo: "bar"
  voo: "doo"
}

type ReverseMap<T extends Record<keyof T, keyof any>> = {
    [P in T[keyof T]]: {
        [K in keyof T]: T[K] extends P ? K : never
    }[keyof T]
}

type Value2Key = ReverseMap<Key2Value>

Playground

【讨论】:

  • 如果人们正在寻找从类型中提取值,请查看stackoverflow.com/a/65210846/5519365
  • 对“keyof any”的一个小注释,我明确地想删除它,所以你可以用 T[keyof T] 替换它以避免使用任何关键字。
  • @ExoMemphiz keyof any 意图暗示 TS 将“值”用作“键”。从语义上讲,它不能用T[keyof T] 替换,后者对值部分施加零约束。但是,我们至少需要值 可以 用作键的约束。
  • 另外,自从人们开始猎巫any 类型时,我就不知道了。 Geez,any 是一个完全有效且有用的类型!这个答案就是您应该使用any的确切示例。不要盲目套用“规则”,试着理解这些规则背后的原因。
猜你喜欢
  • 2017-08-08
  • 2019-07-19
  • 2021-06-01
  • 2022-10-12
  • 2018-07-23
  • 2017-11-18
  • 2020-08-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多