如何从含kind字段的联合类型Cartoon推导新联合类型Animal?
嘿,这个需求TypeScript的类型系统直接就能轻松实现,用索引访问类型就可以,完全不用手动重复定义Animal的取值:
type Cartoon = { kind: 'cat', name: 'Tom'} | { kind: 'mouse', name: 'Jerry' }; // 直接通过索引访问提取所有kind字段的取值联合 type Animal = Cartoon['kind']; // 最终类型就是 'cat' | 'mouse'
为啥这能行?
当你对联合类型使用索引访问(比如Cartoon['kind'])时,TypeScript会自动遍历联合里的每一个成员,把每个成员的kind字段类型都提出来,然后自动组合成一个新的联合类型。
这种写法还有个超大好处:和原类型完全同步。要是以后你给Cartoon加个新成员,比如{ kind: 'dog', name: 'Spike' },Animal会自动变成'cat' | 'mouse' | 'dog',根本不用手动改,避免了重复维护的麻烦。
如果需要在多个地方复用这个逻辑,还可以封装成一个通用工具类型:
// 定义一个通用工具,提取带有kind字段的类型的kind取值 type ExtractKind<T extends { kind: string }> = T['kind']; // 调用方式 type Animal = ExtractKind<Cartoon>; // 同样得到 'cat' | 'mouse'
内容的提问来源于stack exchange,提问作者user9863615
相关产品推荐
相关产品推荐

