首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何在不指定构造函数的情况下从列表中提取区分的联合类型?

在 TypeScript 中,你可以使用映射类型(Mapped Types)和条件类型(Conditional Types)来从列表中提取区分的联合类型,而不需要显式地指定构造函数。以下是一个基本的例子:

代码语言:txt
复制
type List = { type: 'a'; value: string } | { type: 'b'; value: number };

// 使用映射类型和条件类型来提取 'a' 类型的 value
type ExtractAValue<T> = T extends { type: 'a'; value: infer U } ? U : never;

// 使用 ExtractAValue 提取 List 中 'a' 类型的 value
type AValues = ExtractAValue<List>; // string

// 类似地,提取 'b' 类型的 value
type ExtractBValue<T> = T extends { type: 'b'; value: infer U } ? U : never;

type BValues = ExtractBValue<List>; // number

在这个例子中,List 是一个联合类型,包含了两种不同的对象结构。ExtractAValueExtractBValue 是两个条件类型,它们检查传入的类型 T 是否符合特定的结构,并从中提取 value 字段的类型。

优势:

  • 类型安全:在编译时就能检查类型错误,避免运行时错误。
  • 代码清晰:通过类型别名和条件类型,可以清晰地表达复杂的类型逻辑。
  • 重用性:定义好的类型别名和条件类型可以在多个地方重用。

应用场景:

  • 当你需要处理多种不同类型的对象,但只关心它们共有的某些字段时。
  • 当你需要根据对象的某个属性来决定如何处理该对象时。

遇到的问题及解决方法: 如果你在尝试提取联合类型中的某个字段时遇到了问题,可能是因为 TypeScript 无法正确推断出类型。这时,你可以使用 infer 关键字来帮助 TypeScript 进行类型推断。

例如,如果你尝试提取一个更复杂的联合类型中的字段,但 TypeScript 提示错误,你可以尝试细化条件类型,或者使用多个条件类型组合来达到目的。

代码语言:txt
复制
type ComplexList = { type: 'a'; value: string } | { type: 'b'; value: number } | { type: 'c'; value: boolean };

// 提取 'a' 或 'b' 类型的 value
type ExtractABValue<T> = T extends { type: 'a' | 'b'; value: infer U } ? U : never;

type ABValues = ExtractABValue<ComplexList>; // string | number

在这个例子中,ExtractABValue 条件类型使用了 | 来指定 type 字段可以是 'a''b',这样就可以正确地提取这两种类型的 value 字段了。

参考链接:

  • TypeScript 官方文档关于映射类型:https://www.typescriptlang.org/docs/handbook/2/mapped-types.html
  • TypeScript 官方文档关于条件类型:https://www.typescriptlang.org/docs/handbook/2/conditional-types.html
  • TypeScript 官方文档关于 infer 关键字:https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-8.html#type-inference-in-conditional-types
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

领券