当前位置: 首页 > news >正文

《TypeScript 7天速成系列》第3天:TypeScript高级类型通关秘籍:泛型+联合+交叉类型实战

TypeScript 的类型系统是其最强大的特性之一,但也是许多开发者感到困惑的地方。今天我们就来破解 TypeScript 中最难的类型系统,掌握泛型、联合类型和交叉类型的使用技巧。

一、泛型函数与泛型接口

泛型是 TypeScript 中创建可重用组件的重要工具,它允许我们创建可以处理多种类型而不是单一类型的组件。

function identity<T>(arg: T): T {
  return arg;
}

// 使用方式
let output1 = identity<string>("myString");  // 显式指定类型
let output2 = identity("myString");          // 类型推断

泛型也可以应用于接口:

interface GenericIdentityFn<T> {
  (arg: T): T;
}

function identity<T>(arg: T): T {
  return arg;
}

let myIdentity: GenericIdentityFn<number> = identity;

二、类型别名与联合类型

联合类型表示一个值可以是几种类型之一,而类型别名可以给类型起一个新名字。

type Result = 
  | { success: true; data: string } 
  | { success: false; error: string };

function handleResult(result: Result) {
  if (result.success) {
    console.log(result.data); // 这里可以安全访问data
  } else {
    console.log(result.error); // 这里可以安全访问error
  }
}

联合类型与类型别名的结合使用,可以创建出非常灵活且类型安全的代码结构。

三、类型守卫与类型断言

类型守卫和类型断言是 TypeScript 中处理类型不确定性的重要工具。

// typeof 类型守卫
if (typeof x === "string") {
  console.log(x.toUpperCase()); // 在这个块中,x被确定为string类型
}

// 自定义类型守卫
function isString(test: any): test is string {
  return typeof test === "string";
}

if (isString(x)) {
  console.log(x.toUpperCase());
}

// 类型断言
let someValue: any = "this is a string";
let strLength: number = (someValue as string).length;

四、交叉类型实战

交叉类型是将多个类型合并为一个类型,包含了所有类型的特性。

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

interface Employee {
  company: string;
  position: string;
}

type EmployeePerson = Person & Employee;

const john: EmployeePerson = {
  name: "John",
  age: 30,
  company: "Tech Corp",
  position: "Developer"
};

五、高级类型组合应用

让我们看一个综合应用的例子:

type NetworkLoadingState = {
  state: "loading";
};

type NetworkFailedState = {
  state: "failed";
  code: number;
};

type NetworkSuccessState = {
  state: "success";
  response: {
    title: string;
    duration: number;
    summary: string;
  };
};

type NetworkState = 
  | NetworkLoadingState
  | NetworkFailedState
  | NetworkSuccessState;

function logger(state: NetworkState): string {
  switch (state.state) {
    case "loading":
      return "Downloading...";
    case "failed":
      return `Error ${state.code} downloading`;
    case "success":
      return `Downloaded ${state.response.title} - ${state.response.summary}`;
  }
}

结语

掌握 TypeScript 的高级类型系统可以显著提高代码的类型安全性和可维护性。泛型提供了代码复用的灵活性,联合类型和交叉类型则允许我们创建更精确的类型定义,而类型守卫和类型断言帮助我们处理类型不确定性。将这些特性组合使用,可以构建出既灵活又类型安全的 TypeScript 应用程序。

相关文章:

  • 【react】类组件和函数组件的区别
  • Xshell能连接远程服务器,vscode连接远程服务器一直让输入密码,连不上
  • 炫酷的3D卡片翻转画廊实现教程
  • b站视频提取mp4方案
  • Vue3中keep-alive缓存组件应用场景。
  • HarmonyOS Next~鸿蒙系统开发类Kit深度解析与应用实践
  • C++11QT复习 (四)
  • Linux上位机开发实践(积极使用SoC厂家的SDK)
  • Linux系统perf命令使用介绍,如何用此命令进行程序热点诊断和性能优化
  • 信息安全的数学本质与工程实践
  • 【算法工程】RAG:针对linux下文档解析出现乱码问题的解决
  • package.json版本前缀
  • 【Python 代码进阶-2】Python 中的 **(...)语法,字典解包操作符
  • 虫洞数观系列一 | 豆瓣电影TOP250数据采集与MySQL存储实战
  • 阿里巴巴1688类网站高保真原型设计
  • 国产化适配 - YashanDB、达梦数据库与MySQL 的兼容性及技术选型对比分析
  • 重学vue3(三):vue3基本语法及使用
  • AI驱动下的智能异常处置:海量多元异构数据的挑战与应对
  • 二分查找(二分答案)套路模板
  • JavaScript 改变 HTML 样式
  • 杜前任宁波中院代理院长,卸任宁波海事法院院长
  • 外交部回应涉长江和记出售巴拿马运河港口交易:望有关各方审慎行事,充分沟通
  • 王毅会见乌兹别克斯坦外长赛义多夫
  • 预热苏杯,“谁羽争锋”全国新闻界羽毛球团体邀请赛厦门开赛
  • 往事|学者罗继祖王贵忱仅有的一次相见及往来函札
  • 济南市莱芜区委书记焦卫星任济南市副市长