带你读《现代TypeScript高级教程》十、类型守卫(2)

简介: 带你读《现代TypeScript高级教程》十、类型守卫(2)

带你读《现代TypeScript高级教程》十、类型守卫(1)https://developer.aliyun.com/article/1348511?groupCode=tech_library


5.联合类型守卫

类型守卫最常用于联合类型中,因为联合类型可能包含多个不同的类型选项。以下是一个更复杂的示例,展示了如何使用类型守卫和联合类型来提供更精确的类型推断和类型检查:

 

interface Car {
  type: 'car';
  brand: string;
  wheels: number;}
interface Bicycle {
  type: 'bicycle';
  color: string;}
interface Motorcycle {
  type: 'motorcycle';
  engine: number;}
type Vehicle = Car | Bicycle | Motorcycle;
function printVehicleInfo(vehicle: Vehicle) {
  switch (vehicle.type) {
    case 'car':
      console.log(`Brand: vehicle.brand,Wheels:{vehicle.brand}, Wheels: {vehicle.wheels}`);
      break;
    case 'bicycle':
      console.log(`Color: ${vehicle.color}`);
      break;
    case 'motorcycle':
      console.log(`Engine: ${vehicle.engine}`);
      break;
    default:
      const _exhaustiveCheck: never = vehicle;
  }}
const car: Car = { type: 'car', brand: 'Toyota', wheels: 4 };const bicycle: Bicycle = { type: 'bicycle', color: 'red' };const motorcycle: Motorcycle = { type: 'motorcycle', engine: 1000 };
printVehicleInfo(car);         // 输出: Brand: Toyota, Wheels: 4printVehicleInfo(bicycle);     // 输出: Color: redprintVehicleInfo(motorcycle);  // 输出: Engine: 1000

 

在上面的示例中,我们定义了 Vehicle 类型,它是 CarBicycle 和 `Motor

cycle的联合类型。通过使用switch语句和根据vehicle.type的不同值进行类型守卫,我们可以在每个case分支中收窄vehicle` 的类型范围,并执行相应的代码逻辑。通过这种方式,我们能够更准确地推断和检查联合类型的变量。

 

非常抱歉之前的回答没有覆盖到你提到的其他重要概念。下面我将继续解析这些概念并提供相应的代码示例。

 

6.使用 in 操作符进行类型守卫

in 操作符可以用于在 TypeScript 中判断一个属性是否存在于对象中,从而进行类型判断和类型收窄。以下是一个示例:

interface Circle {
  kind: 'circle';
  radius: number;}
interface Rectangle {
  kind: 'rectangle';
  width: number;
  height: number;}
type Shape = Circle | Rectangle;
function printArea(shape: Shape) {
  if ('radius' in shape) {
    console.log(Math.PI * shape.radius ** 2);
  } else {
    console.log(shape.width * shape.height);
  }}
const circle: Circle = { kind: 'circle', radius: 5 };const rectangle: Rectangle = { kind: 'rectangle', width: 10, height: 20 };
printArea(circle);     // 输出: 78.53981633974483printArea(rectangle);  // 输出: 200

 

在上面的示例中,我们使用 in 操作符来检查属性 'radius' 是否存在于 shape 对象中。如果存在,则收窄 shape 的类型为 Circle,并执行相应的代码逻辑。通过使用 in 操作符进行类型判断,我们可以根据属性的存在与否进行类型收窄。


带你读《现代TypeScript高级教程》十、类型守卫(3)https://developer.aliyun.com/article/1348509?groupCode=tech_library

相关文章
|
4月前
|
JavaScript 前端开发
揭秘 TypeScript 条件类型:超越简单类型检查
揭秘 TypeScript 条件类型:超越简单类型检查
|
4月前
|
JavaScript 安全 索引
TypeScript 高级类型工具:Partial, Required, Record 的妙用与陷阱
TypeScript 高级类型工具:Partial, Required, Record 的妙用与陷阱
|
4月前
|
JavaScript 安全 IDE
TypeScript 类型体操:别让 `any` 毁了你的安全网!
TypeScript 类型体操:别让 `any` 毁了你的安全网!
|
4月前
|
JavaScript 安全 编译器
TypeScript 类型守卫:让你的类型系统更智能
TypeScript 类型守卫:让你的类型系统更智能
|
9月前
|
存储 安全 JavaScript
TypeScript-内置应用程序类型-Recode
通过使用 `Record` 类型,开发者可以显著提升代码的安全性和可维护性。无论是配置对象、字典结构还是动态表单,`Record` 类型都提供了一个简洁、类型安全的解决方案。
434 82
|
JavaScript 前端开发 安全
深入理解TypeScript:增强JavaScript的类型安全性
【10月更文挑战第8天】深入理解TypeScript:增强JavaScript的类型安全性
303 0
|
JavaScript 前端开发 开发者
深入理解TypeScript:类型系统与实用技巧
【10月更文挑战第8天】深入理解TypeScript:类型系统与实用技巧
|
存储 JavaScript
typeScript进阶(11)_元组类型
本文介绍了TypeScript中的元组(Tuple)类型,它是一种特殊的数组类型,可以存储不同类型的元素。文章通过示例展示了如何声明元组类型以及如何给元组赋值。元组类型在定义时需要指定数组中每一项的类型,且在赋值时必须满足这些类型约束。此外,还探讨了如何给元组类型添加额外的元素,这些元素必须符合元组类型中定义的类型联合。
166 0
|
JavaScript 前端开发 安全
使用 TypeScript 加强 React 组件的类型安全
【10月更文挑战第1天】使用 TypeScript 加强 React 组件的类型安全
307 106
|
设计模式 JavaScript 安全
TypeScript性能优化及代码质量提升的重要性、方法与策略,包括合理使用类型注解、减少类型断言、优化模块导入导出、遵循编码规范、加强代码注释等
本文深入探讨了TypeScript性能优化及代码质量提升的重要性、方法与策略,包括合理使用类型注解、减少类型断言、优化模块导入导出、遵循编码规范、加强代码注释等,旨在帮助开发者在保证代码质量的同时,实现高效的性能优化,提升用户体验和项目稳定性。
372 6