前端掌握 ts 的类型体操

简介: 【8月更文挑战第23天】前端掌握 ts 的类型体操

在前端开发中,TypeScript(TS)的类型系统以其强大的类型推断和类型体操能力而著称。类型体操,简单来说,就是利用TypeScript的类型系统来执行一些在编译时就能完成的“计算”或“推导”,这些操作通常与类型定义和类型操作相关,不涉及运行时逻辑。下面,我将通过几个代码示例来展示TypeScript中类型体操的一些基本和进阶用法,每个示例都将附带解释。

简单来讲,TypeScript(TS)就是为 JS 提供了一个类型限定,它的主要目的是让 js 代码更加健壮和可维护,在学习 TS 时,最重要的一环就是理解并熟练运用类型系统。而“类型体操”则是通过各种 TS 类型操作技巧,来实现复杂的类型转换和推导,从而充分利用 TS 的类型系统,大家取名的体操这个词还是非常形象的,说明是可以玩出花来的

1. 基础类型操作

示例:联合类型与类型别名

type Name = 'Alice' | 'Bob' | 'Charlie';

// 使用类型别名定义函数参数类型
function greet(name: Name): string {
   
  return `Hello, ${
     name}!`;
}

// 调用函数
console.log(greet('Alice')); // 正确
console.log(greet('David')); // 错误:'David' 不是 'Name' 类型的成员

2. 条件类型

示例:基于条件的类型推导

type IsString<T> = T extends string ? true : false;

type Result1 = IsString<string>; // true
type Result2 = IsString<number>; // false

// 实际应用:根据条件返回不同类型
type ExtractString<T> = T extends string ? T : never;

type Filtered = ExtractString<string | number | boolean>; // string

3. 映射类型

示例:修改对象类型的每个属性

type MappedObject<T> = {
   
  [P in keyof T]: T[P] extends string ? T[P].toUpperCase() : T[P];
};

// 注意:由于TypeScript的限制,这里不能直接转换为大写,仅作为示例
// 实际应用中,你可能需要借助其他方式(如函数)来实现

interface Person {
   
  name: string;
  age: number;
}

type PersonCaps = MappedObject<Person>; // 理论上希望将name转换为大写,但实际上TypeScript不支持直接转换

// 替代方案:使用函数
function mapToCaps<T>(obj: T): {
   [K in keyof T]: T[K] extends string ? string : T[K]} {
   
  const result: any = {
   };
  for (const key in obj) {
   
    if (typeof obj[key] === 'string') {
   
      result[key] = obj[key].toUpperCase();
    } else {
   
      result[key] = obj[key];
    }
  }
  return result;
}

const person = {
    name: 'Alice', age: 30 };
console.log(mapToCaps(person)); // { name: 'ALICE', age: 30 }

4. 高级类型体操:递归类型

示例:实现一个深度只读类型

type DeepReadonly<T> = {
   
  readonly [P in keyof T]: T[P] extends object ? DeepReadonly<T[P]> : T[P];
};

interface Nested {
   
  name: string;
  details: {
   
    age: number;
    address: {
   
      street: string;
      city: string;
    };
  };
}

type DeeplyReadonlyNested = DeepReadonly<Nested>;

// DeeplyReadonlyNested 的每个属性都是只读的,包括嵌套的对象

5. 泛型约束与索引签名

示例:使用泛型约束和索引签名处理任意对象

interface Dictionary<T> {
   
  [key: string]: T;
}

function getProperty<T, K extends keyof T>(obj: T, key: K): T[K] {
   
  return obj[key];
}

const myObj: Dictionary<number> = {
   
  one: 1,
  two: 2,
  three: 3,
};

console.log(getProperty(myObj, 'one')); // 1

总结

以上示例展示了TypeScript类型体操的一些基本和进阶用法,包括类型别名、条件类型、映射类型、递归类型、泛型约束和索引签名等。这些技术使得TypeScript能够在编译时提供强大的类型检查和推导能力,从而帮助开发者编写更加健壮和易于维护的代码。通过熟练掌握这些技术,你可以更好地利用TypeScript的类型系统来优化你的前端项目。

目录
相关文章
|
6月前
|
JavaScript 前端开发 安全
Apollo与TypeScript:强大类型检查在前端开发中的应用
Apollo与TypeScript:强大类型检查在前端开发中的应用
|
2月前
|
存储 前端开发 JavaScript
前端基础(十一)_函数声明及调用、函数的形参与实参、arguments参数、函数的参数类型、函数中的问题
本文介绍了JavaScript中函数的声明及调用、形参与实参的概念、arguments对象的使用、函数参数的类型以及函数中this的作用。通过示例代码详细解释了函数如何接收参数、如何处理参数个数不匹配的情况,以及函数在不同上下文中this的指向。
23 1
|
2月前
|
前端开发 小程序 开发者
小程序的前端 display 有什么类型?
【9月更文挑战第4天】小程序的前端 display 有什么类型?
65 4
|
2月前
|
前端开发 小程序 开发者
小程序的前端 display 有什么类型?
【9月更文挑战第1天】小程序的前端 display 有什么类型?
49 2
|
3月前
|
前端开发 Java 数据库
Java系列之 Long类型返回前端精度丢失
这篇文章讨论了Java后端实体类中Long类型数据在传递给前端时出现的精度丢失问题,并提供了通过在实体类字段上添加`@JsonSerialize(using = ToStringSerializer.class)`注解来确保精度的解决方法。
|
3月前
|
前端开发 数据安全/隐私保护
探秘CSS类型选择器:解码前端设计的神秘密码!
探秘CSS类型选择器:解码前端设计的神秘密码!
探秘CSS类型选择器:解码前端设计的神秘密码!
|
3月前
|
数据采集 前端开发 算法
基于朴素贝叶斯算法的新闻类型预测,django框架开发,前端bootstrap,有爬虫有数据库
本文介绍了一个基于Django框架和朴素贝叶斯算法开发的新闻类型预测系统,该系统具备用户登录注册、后台管理、数据展示、新闻分类分布分析、新闻数量排名和新闻标题预测等功能,旨在提高新闻处理效率和个性化推荐服务。
|
5月前
|
前端开发 JavaScript 安全
TypeScript作为一种静态类型的JavaScript超集,其强大的类型系统和面向对象编程特性为微前端架构的实现提供了有力的支持
【6月更文挑战第11天】微前端架构借助TypeScript提升开发效率和代码可靠性。 TypeScript提供类型安全,防止微前端间通信出错;智能提示和自动补全加速跨代码库开发;重构支持简化代码更新。通过定义公共接口确保一致性,用TypeScript编写微前端以保证质量。集成到构建流程确保顺利构建打包。在微前端场景中,TypeScript是强有力的语言选择。
47 2
|
6月前
|
前端开发 JavaScript
前端 TS 快速入门之三:class 类
前端 TS 快速入门之三:class 类
89 1
|
6月前
|
前端开发 JavaScript 索引
【Web 前端】JS的几种具体异常类型(报错)
【4月更文挑战第22天】【Web 前端】JS的几种具体异常类型(报错)