Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.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_Discriminated Union - Fatal编程技术网

Typescript 将标记映射到标记的联合成员不';不适用于特定的联合,只适用于通用的联合

Typescript 将标记映射到标记的联合成员不';不适用于特定的联合,只适用于通用的联合,typescript,discriminated-union,Typescript,Discriminated Union,作为后续工作,我将尝试编写一个泛型类型,将标记映射到一个属于歧视联合的类型 上述答案中给出的通用版本有效: type DiscriminateUnion=T扩展记录?T:从不 但是我不能在t(工会本身)上制作我自己的非通用版本。如果我使用默认值将联合类型设置为泛型,它确实会起作用,我觉得这很奇怪 这是我的密码: 接口类型A{ 标签:“a”; 数据:字符串; } 接口类型B{ 标签:“b”; 数据:[编号]; } 接口类型CD{ 标签:“c”|“d”; 数据:数字; } 类型联合=类型A |类型B

作为后续工作,我将尝试编写一个泛型类型,将标记映射到一个属于歧视联合的类型

上述答案中给出的通用版本有效:

type DiscriminateUnion=T扩展记录?T:从不

但是我不能在
t
(工会本身)上制作我自己的非通用版本。如果我使用默认值将联合类型设置为泛型,它确实会起作用,我觉得这很奇怪

这是我的密码:

接口类型A{
标签:“a”;
数据:字符串;
}
接口类型B{
标签:“b”;
数据:[编号];
}
接口类型CD{
标签:“c”|“d”;
数据:数字;
}
类型联合=类型A |类型B |类型CD;
类型DiscriminatedUnion\u 0=联合扩展记录?联盟:永远不会;
let shouldBeTypeA\u 0:DiscriminatedUnion\u 0;//不起作用,键入“从不”
//这很有效
类型DiscriminatedUnion_1=T扩展记录?T:从来没有;
let shouldBeTypeA_1:DiscrimitedUnion_1;
类型DecriminatedUnion_2=T扩展记录?T:从来没有;
let shouldBeTypeA_2:歧视联合_2;
中的技术使用的是,只有在检查纯泛型类型参数时才有效。这个链接很好地解释了这一点,如果你愿意,你也可以读一篇文章。获得此行为的唯一方法是在某个地方对一个简单的泛型类型参数执行条件转换。这就是为什么DiscriminatedUnion\u 1;您检查了类型参数
T

幸运的是,您不必玩带有默认类型参数的游戏来获得这种效果。必须进行泛型类型参数检查,但不必直接在最终类型别名中进行检查

一种方法是使用原始的
DiscriminateUnion
定义,并创建一个使用它的别名,如

type MyDiscriminateUnion<V extends Union["tag"]> = DiscriminateUnion<Union, "tag", V>;
这样,您就可以构建您的
DiscriminatedUnion
,而无需使用默认类型参数玩游戏:

type DiscriminatedUnion<V extends Union["tag"]> = Extract<Union, Record<"tag", V>>;
let shouldBeTypeA: DiscriminatedUnion<"a">; // TypeA, hooray!
type DiscriminatedUnion=Extract;
let shouldBeTypeA:DiscriminatedUnion;//TypeA,万岁!
好吧,希望这会有帮助;祝你好运

type DiscriminatedUnion<V extends Union["tag"]> = Extract<Union, Record<"tag", V>>;
let shouldBeTypeA: DiscriminatedUnion<"a">; // TypeA, hooray!