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

TypeScript类型守卫与可辨识联合详解一

类型守卫 (Type Guards)

类型守卫是能够在特定作用域中确定变量类型的表达式。

1. typeof 类型守卫

function printValue(value: string | number) {if (typeof value === "string") {// 在这个作用域中,value 被识别为 string 类型console.log(value.toUpperCase());} else {// 在这个作用域中,value 被识别为 number 类型console.log(value.toFixed(2));}
}

2. instanceof 类型守卫

class Dog {bark() {console.log("Woof!");}
}class Cat {meow() {console.log("Meow!");}
}function handleAnimal(animal: Dog | Cat) {if (animal instanceof Dog) {animal.bark(); // 正确:animal 被识别为 Dog 类型} else {animal.meow(); // 正确:animal 被识别为 Cat 类型}
}

3. in 操作符类型守卫

interface Circle {kind: "circle";radius: number;
}interface Square {kind: "square";sideLength: number;
}function getArea(shape: Circle | Square) {if ("radius" in shape) {// shape 被识别为 Circle 类型return Math.PI * shape.radius ** 2;} else {// shape 被识别为 Square 类型return shape.sideLength ** 2;}
}

4. 自定义类型守卫

function isString(value: any): value is string {return typeof value === "string";
}function isNumber(value: any): value is number {return typeof value === "number" && !isNaN(value);
}function processValue(value: string | number) {if (isString(value)) {console.log("String length:", value.length);} else if (isNumber(value)) {console.log("Number squared:", value * value);}
}

可辨识联合 (Discriminated Unions)

可辨识联合是一种通过共享字面量字段来区分联合类型成员的模式。

基本概念

// 定义可辨识联合
type Shape = | { kind: "circle"; radius: number }| { kind: "square"; sideLength: number }| { kind: "rectangle"; width: number; height: number };// 使用可辨识联合
function getArea(shape: Shape): number {switch (shape.kind) {case "circle":// TypeScript 知道 shape 是 Circle 类型return Math.PI * shape.radius ** 2;case "square":// TypeScript 知道 shape 是 Square 类型return shape.sideLength ** 2;case "rectangle":// TypeScript 知道 shape 是 Rectangle 类型return shape.width * shape.height;default:// 穷尽性检查const _exhaustiveCheck: never = shape;return _exhaustiveCheck;}
}

更复杂的例子

// 网络请求状态的可辨识联合
type NetworkState =| { state: "loading" }| { state: "success"; data: string }| { state: "error"; error: Error };function handleNetworkState(networkState: NetworkState) {switch (networkState.state) {case "loading":console.log("Loading...");break;case "success":console.log("Data:", networkState.data); // 可以安全访问 databreak;case "error":console.log("Error:", networkState.error.message); // 可以安全访问 errorbreak;}
}

带函数的可辨识联合

type Action =| { type: "ADD_TODO"; payload: string }| { type: "REMOVE_TODO"; payload: number }| { type: "TOGGLE_TODO"; payload: number };function todoReducer(state: Todo[], action: Action): Todo[] {switch (action.type) {case "ADD_TODO":// action.payload 是 string 类型return [...state, { id: Date.now(), text: action.payload, completed: false }];case "REMOVE_TODO":// action.payload 是 number 类型return state.filter(todo => todo.id !== action.payload);case "TOGGLE_TODO":// action.payload 是 number 类型return state.map(todo =>todo.id === action.payload? { ...todo, completed: !todo.completed }: todo);default:return state;}
}

预知更多信息,请阅读详情二。

http://www.dtcms.com/a/607667.html

相关文章:

  • 闲鱼钓鱼网站怎么做天津网站开发工资水平
  • 1.3 SubShader
  • 中信建设有限责任公司内部网站做胃镜需那好天津津门网站A
  • 从裸机到RTOS:基于MCU硬件特性的架构演进与范式转移
  • 建设厅网站174号文打电话来说做网站_然后答应了
  • [科普] GNSS授时原理
  • 厦门做商城网站拖拽式建站wordpress
  • 杭州免费网站制作创建网站的流程是什么
  • 淄博做网站手游官网首页
  • wordpress多本小说站出售admin管理员登录
  • Ansible之Playbook简单应用
  • 美橙互联网站建设下载百度2023最新版
  • 上海浦东建筑建设网站污水处理工程网站备案 个人
  • 什么是网络营销策略福田企业网站优化排名
  • 网站设计中怎么显示链接内容网站短信通知
  • Stable_Diffusion使用EasyPhoto报错动态链接库(DLL)初始化例程失败解决
  • 公司做网站计入那个科目建筑行业信息平台
  • 文山专业网站建设苏州新闻今天最新消息新闻事件
  • 张家口职教中心计算机网站建设销售系统的整个流程
  • 兰考县红庙关东村做网站的建设久久建筑网站
  • 做网站放什么软件企业公众号以及网站建设
  • 网站空间可以自己做吗本地服务推广平台哪个好
  • 创建网站需要哪些过程wordpress用户导出
  • 比HSE快几十倍高效计算符合实验带隙,Mate-MBJ混合泛函计算
  • 有几种工具可以实现“非空复制“(只复制源对象中非空的值到目标对象)
  • 推进网站集约化建设的做法seo整合营销
  • 什么可以用手机做网站邮箱注册网址
  • 奇墙网站建设西安市建设工程信息网诚信平台官网
  • 深圳免费做网站青岛营销型网站建设
  • c++(斗罗大陆3)