首页
学习
活动
专区
工具
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
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • Spring 5.0.0框架介绍_中文版_3.9

    基于注解的配置提供了一种XML设置的可替代方式,它依赖于字节码元数据来连接组件,而不是用尖括号声明的方式。代替使用XML来描述bean连接,开发者通过将注解使用在相关的类,方法或字段声明中,将配置移动到了组件类本身的内部。正如在“Example: The RequiredAnnotationBeanPostProcessor”那节提到的那样,使用BeanPostProcessor与注解结合是扩展Spring IoC容器的的常见方法。例如,Spring 2.0引入了@Required注解来执行需要的属性的可能性。Spring 2.5使以同样地通用方法来驱动Spring的依赖注入变为可能。本质上来说,@Autowired提供了如3.4.5小节描述的同样的能力。“Autowiring collaborators”但更细粒度的控制和更广的应用性。Spring 2.5也添加对JSR-250注解的支持,例如,@PostConstruct和@PreDestroy 。Spring 3.0添加了对JSR-330,包含在javax.inject包内的注解(Java的依赖注入)的支持,例如@Inject和@Named。关于这些注解的细节可以在相关的小节找到。

    01

    关于Spring注解容器配置的那些事,掌握这几点,不再难!

    基于注解的配置提供了一种XML设置的可替代方式,它依赖于字节码元数据来连接组件,而不是用尖括号声明的方式。代替使用XML来描述bean连接,开发者通过将注解使用在相关的类,方法或字段声明中,将配置移动到了组件类本身的内部。正如在“Example: The RequiredAnnotationBeanPostProcessor”那节提到的那样,使用BeanPostProcessor与注解结合是扩展Spring IoC容器的的常见方法。例如,Spring 2.0引入了@Required注解来执行需要的属性的可能性。Spring 2.5使以同样地通用方法来驱动Spring的依赖注入变为可能。本质上来说,@Autowired提供了如3.4.5小节描述的同样的能力。“Autowiring collaborators”但更细粒度的控制和更广的应用性。Spring 2.5也添加对JSR-250注解的支持,例如,@PostConstruct和@PreDestroy 。Spring 3.0添加了对JSR-330,包含在javax.inject包内的注解(Java的依赖注入)的支持,例如@Inject和@Named。关于这些注解的细节可以在相关的小节找到。

    02

    PL/SQL 集合的初始化与赋值

    对于集合类型,与单一的数据类型相比较而言,应该以一个整体的观念来考虑集合,即是一批类型相同的数据组合而非单一的数据。因此集 合类型集合的声明、赋值、初始化较之单一类型而言,有很大的不同。尤其是嵌套表与变长数组,在赋值之前必须先初始化。当嵌套表和变长数 组在声明时,它们都会自动地被设置成NULL值。也就是嵌套表和变长数组中集合不存在任何元素,并不是针对它所拥有的元素。可以使用系统定 义的与集合类型同名的函数来初始化集合。我们必须显式地调用构造函数为每一个变长数组和嵌套表变量进行初始化操作(对于关联数组来说, 是不需要使用构造函数进行初始化的)。         有关集合类型的描述请参考:

    05
    领券