前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >深入理解 TypeScript 中的类型提取语法与实际应用

深入理解 TypeScript 中的类型提取语法与实际应用

原创
作者头像
编程扫地僧
发布2025-01-18 14:06:14
发布2025-01-18 14:06:14
1220
举报
文章被收录于专栏:前端开发前端开发

theme: channing-cyan

highlight: atom-one-dark


在 TypeScript 中,类型系统提供了极大的灵活性和强大的表达能力。以下代码片段展示了一种使用高级类型工具实现的类型提取逻辑:

代码语言:typescript
复制
type TExtractValuesOfTuple<T extends any[]> = T[keyof T & number];

要理解这段代码,我们需要逐个分析其中的每个组成部分,并通过示例展示它的功能。


分析代码中的每个部分

type

TypeScript 中的 type 是用于定义类型别名的关键字。它允许我们为复杂类型取一个易于理解的名字,便于复用和维护。例如:

代码语言:typescript
复制
type MyNumber = number;

在当前代码中,TExtractValuesOfTuple 是一个类型别名,描述了如何从元组类型中提取所有可能的值。

TExtractValuesOfTuple

这个是我们定义的类型别名的名称。根据命名约定,这个名称暗示它的用途是从元组类型 T 中提取值。

<T extends any[]>

这里的 <T extends any[]> 是类型参数的声明部分,表示 T 必须是一个数组类型或元组类型。

  • T 是一个泛型参数,可以表示任何符合条件的类型。
  • extends any[] 表示 T 必须是 any[] 类型的子类型,也就是一个数组或元组。

例如:

代码语言:typescript
复制
// 合法的例子
type Example1 = TExtractValuesOfTuple<[number, string]>; // T 是元组类型
type Example2 = TExtractValuesOfTuple<string[]>; // T 是数组类型

// 非法的例子
type Example3 = TExtractValuesOfTuple<number>; // T 不是数组类型,报错
type Example4 = TExtractValuesOfTuple<{ a: string }>; // T 不是数组类型,报错
T[keyof T & number]

这个部分是类型提取的核心逻辑。它表示从类型 T 中取出所有 keyof T & number 对应的值。

keyof T

keyof T 表示获取类型 T 的所有键的联合类型。

  • 对于数组或元组类型,键通常是数字索引(如 0, 1, 2)以及一些额外的字符串键(如 length, push, pop 等)。
  • 例如:
代码语言:typescript
复制
type KeysOfTuple = keyof [string, number, boolean]; // "0" | "1" | "2" | "length" | "push" | "pop" | ...
& number

& 是交集操作符,用于取两个类型的交集。

在这里,keyof T & number 表示仅保留 keyof T 中属于数字的部分。这是因为元组或数组的值是通过数字索引访问的,其他字符串键(如 length, push)并不在我们的关注范围内。

例如:

代码语言:typescript
复制
type NumericKeys = keyof [string, number, boolean] & number; // 0 | 1 | 2
T[keyof T & number]

最终,这部分表示通过 keyof T & number 提取 T 中对应键的值。

  • 对于 [string, number, boolean] 类型,keyof T & number0 | 1 | 2,因此 T[keyof T & number] 的值是 string | number | boolean

示例代码

下面的示例代码展示了如何使用 TExtractValuesOfTuple

代码语言:typescript
复制
type TExtractValuesOfTuple<T extends any[]> = T[keyof T & number];

// 示例 1:简单元组
type Tuple1 = [string, number, boolean];
type Values1 = TExtractValuesOfTuple<Tuple1>; // string | number | boolean

// 示例 2:字符串数组
type StringArray = string[];
type Values2 = TExtractValuesOfTuple<StringArray>; // string

// 示例 3:空元组
type EmptyTuple = [];
type Values3 = TExtractValuesOfTuple<EmptyTuple>; // never

// 示例 4:混合数组
type MixedArray = [number, ...string[]];
type Values4 = TExtractValuesOfTuple<MixedArray>; // number | string

console.log("类型提取示例完成。");

关键点总结

  1. T[keyof T & number] 的作用是从数组或元组类型中提取所有可能的值。
  2. keyof T 包括所有键,但通过交集 & number 限制为数字索引。
  3. 这种类型工具对于操作复杂类型、定义通用逻辑十分有用。

通过对每个组成部分的逐步分析,以及示例的展示,相信你对这一类型提取工具的意义和用途有了更深刻的理解。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 分析代码中的每个部分
    • type
    • TExtractValuesOfTuple
    • <T extends any[]>
    • T[keyof T & number]
      • keyof T
      • & number
      • T[keyof T & number]
  • 示例代码
  • 关键点总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档