typescript - 我可以定义一个具有与每个值的键对应的值约束的 Typescript 映射吗?

标签 typescript generics key constraints discriminated-union

this playground我想创建一个 map ,其中最多包含操作联合中每种类型的单个操作。每个联合类型都通过具有不同的字符串文字属性“type”来区分。我对这张 map 有一个定义,它可以编译,但太松散......

const lastAction:{
    [A in Action["type"]]?:Action 
} = {}

lastAction 映射中对键的约束强制执行...

  • 键是某个 Action 类型的“type”属性
  • 该值必须是某种 Action 类型

...目前不强制键和值来自相同操作类型。理想情况下,playground 的最后一行会因为编译器错误而失败,因为它尝试将类型为“snooze”的 Action 分配给名为“fulfil”的属性。

lastAction["fulfil"]=snoozeAction

我只是错过了这里显而易见的事情。我确信有某种方法可以通过分配条件或更简单的方法来做到这一点。下面的伪代码是垃圾 typescript ,因为泛​​型不能像这样在每个属性的基础上工作,但它给出了我想要的东西的想法......

const lastAction: {
    [key:A["type"]]:A extends Action
} = {};

最佳答案

使用 Typescript 4.1 的 key remapping ,这非常简单:

const lastAction:{
    [A in Action as A["type"]]?: A 
} = {}

关于typescript - 我可以定义一个具有与每个值的键对应的值约束的 Typescript 映射吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65365760/

相关文章:

c# - VB Collection - 转换为现代集合

javascript - react 键是本地的还是全局的?

python - 使用 python 正则表达式查找以逗号分隔的键=值对,但将引号部分保留在一起

arrays - 要求数组是 Swift 协议(protocol)中的最小大小

java - 如何多次实现相同的接口(interface),但使用不同的泛型?

typescript - 自定义管道 ionic 3 |找不到管道

typescript - 如何在 TypeScript 4.5.4 中定义方法返回类型的映射类型?

jQuery Error with 'on' statement Argument of type '"focus "' is not assignable to parameter of type ' PlainObject<false |事件处理程序<HTMLElement

javascript - Typescript 真的向后兼容吗?

java - Java是如何解决这个untyped generic Method的呢?