我有一个歧视联盟
type MyDUnion = { type: "anon"; name: string } | { type: "google"; idToken: string };
我想直接从MyDUnion
类型的区别联合体中访问name键。
type Name = MyDUnion['name']
但是 typescript 不允许
Property 'name' doesn't exist on type '{ type: "anon"; name: string } | { type: "google"; idToken: string }'
我如何访问它?
需要说明的是,这不是有效的解决方案:
type MyName = string;
type MyDUnion = { type: "anon"; name: MyName } | { type: "google"; idToken: string };
type Name = MyName; // this line would be in a different file
这是无效的,因为这样我就必须导出MyName
和MyDUnion
类型以便在其他地方使用。
有什么想法吗?
3条答案
按热度按时间ioekq8ef1#
为了过滤对象的并集,通常需要使用提取:简单的方法:
更稳健:
v8wbuo2f2#
为了获得所需的密钥,您必须以某种方式告诉Typescript编译器
嘿编译器,我想了解一下这个对象,在一个非常特殊的情况下
在这个例子中,你想知道对象的信息,当
type ==='anon'
。那么,以你的例子为例,这样,你就可以得到这两种情况重叠的信息,现在你可以直接索引
name
键了。如果你想让它更健壮,我们可以确保我们使用的收缩类型(在本例中为
{type: 'anon'}
)满足所需的形状。我知道这有点粗糙,但是你总是可以把它提取到泛型函数中,然后随意使用它们。我只是向你展示了基本的逻辑。你可以用它来使它更美观。
2hh7jdfx3#
溶液
助手
x一个一个一个一个x一个一个二个x
目标
indexed access
和keyof
KeyOf<Union>
PickAll<Union, KeyOf<Union>?, Otherwise?>
默认情况下,选择 * all *
关注特定的
Key
(+IDE提示和类型检查)ctrl
+space
处于工作状态或
Keys
的并集陷阱
不要这样做:
type
应为"anon"
|"google"
执行以下操作: