Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我是否可以定义一个Typescript映射,该映射具有与每个值对应的值约束';钥匙是什么?_Typescript_Generics_Key_Constraints_Discriminated Union - Fatal编程技术网

我是否可以定义一个Typescript映射,该映射具有与每个值对应的值约束';钥匙是什么?

我是否可以定义一个Typescript映射,该映射具有与每个值对应的值约束';钥匙是什么?,typescript,generics,key,constraints,discriminated-union,Typescript,Generics,Key,Constraints,Discriminated Union,在中,我想创建一个映射,其中最多包含action union中每种类型的单个action。通过使用不同的字符串文字属性“type”来区分每个联合类型。我对这张地图有一个定义,它可以编译,但是太松散了 const lastAction:{ [A in Action["type"]]?:Action } = {} lastAction映射中对键的约束强制执行以下操作 键是某个操作类型的“type”属性 该值必须是某个操作类型 …它当前不强制键和值来自相同的动作类型

在中,我想创建一个映射,其中最多包含action union中每种类型的单个action。通过使用不同的字符串文字属性“type”来区分每个联合类型。我对这张地图有一个定义,它可以编译,但是太松散了

const lastAction:{
    [A in Action["type"]]?:Action 
} = {}
lastAction
映射中对键的约束强制执行以下操作

  • 键是某个操作类型的“type”属性
  • 该值必须是某个操作类型
…它当前不强制键和值来自相同的动作类型。理想情况下,游乐场的最后一行将作为编译器错误失败,因为它试图将类型为“snooze”的操作分配到名为“fulfill”的属性中

lastAction[“fulfill”]=snoozoreaction

我只是错过了这里显而易见的东西。我肯定有一些方法可以用分配条件或更简单的东西来实现这一点。下面的伪代码是垃圾类型脚本,因为泛型不能像这样在每个属性的基础上工作,但它给出了我想要的东西的想法

const lastAction: {
    [key:A["type"]]:A extends Action
} = {};
使用Typescript 4.1,这非常简单:

const last操作:{
[A作为[“类型”]]起作用?:A
} = {}

这很难看,但可能有用吗?const lastAction:{[A in Action[“type”]]?:A扩展“create”?CreateAction:A扩展“filling”?filliAction:A扩展“snooze”?SnoozeAction:never}={}谢谢ABOS。然而,我认为对于解决方案来说,lastAction映射的定义应该跟踪Action联合,而不是重复它的定义,这是相当基本的。否则,复制可能会导致不一致和错误。如果我要重新声明键和值类型,只需在原始映射类型中显式地表示每个文本键及其对应的类型也会容易一些。然而,这也不能解决核心问题。这正是我所希望的,并回答了这个问题,虽然它现在提出了另一个问题,但分开处理更合适,因为我相信你回答了这个问题。