TypeScript 基础学习笔记:泛型 <T> vs 断言 as

news2024/9/28 9:33:45

在这里插入图片描述


TypeScript 基础学习笔记:泛型 <T> vs 断言 as

🔥 引言

👋 TypeScript (TS) 以其静态类型的魔力,让我们的代码更加健壮、易读且易于维护。今天,我们将深入探讨两个核心概念——泛型(Generics) 和 类型断言(Type Assertions),并通过实战代码示例,揭示它们之间的区别。


🧩 泛型 <T>:灵活多变的类型容器

泛型是 TypeScript 提供的一种编写可重用代码的机制,它允许我们在定义函数、接口或类的时候不预先指定具体的类型,而是在使用时根据实际情况指定。🌈

示例:一个简单的泛型函数

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

// 使用示例
const num = identity<number>(42); // 类型为 number
const str = identity<string>("Hello"); // 类型为 string

在这里,<T> 是一个类型参数,代表一个待定的类型。当我们调用 identity 函数时,可以明确指定 T 应该是什么类型,从而让 TypeScript 进行精确的类型检查。


🏆 类型断言 as:告诉编译器“你错了,我是对的”

想象一下,你和编译器之间的一场小辩论,你自信地说:“听我的,这个变量就是这个类型!”这时候,类型断言就派上用场了。它允许你手动指定一个值的类型,即使这违反了 TypeScript 的静态类型检查规则。🚨

示例:类型断言的应用场景

假设你有一个 any 类型的对象,但你知道它实际上是一个特定类型的对象:

const someValue = {} as { name: string, age: number };

someValue.name = "Alice";
someValue.age = 30;

在这个例子中,我们通过 as 断言将 someValue 强制转换为拥有 nameage 属性的对象。这告诉 TypeScript 我们确信这个操作是安全的,尽管它无法自动推断出来。


🚀 泛型 <T>reactive 中的应用

Vue 3中,reactive 是一个关键的API,用于创建响应式对象。当你在Vue应用程序中使用TypeScript时,泛型 <T> 和类型断言 as 也扮演着重要的角色,尤其是在定义和操作响应式数据时。

当你创建响应式对象时,可以使用泛型 <T> 来指定这个对象的类型。这样,TypeScript就能提前知道这个响应式对象的结构,并提供相应的类型检查和代码补全功能。这对于大型项目尤其有用,因为它有助于减少类型错误并提高开发效率。

示例:使用泛型定义响应式对象

import { reactive } from 'vue';

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

const user = reactive<User>({
  name: 'Alice',
  age: 30,
});

// TypeScript会根据User接口提供智能提示
user.name = 'Bob'; // 正确
user.age = 'thirty'; // 错误,TypeScript会提示类型不匹配

在这个例子中,<User> 是泛型参数,它告诉 reactive 函数内部的对象应当遵循 User 接口定义的结构。这使得对 user 对象的操作都受到严格的类型检查。


🏅 类型断言 as 在Vue 3中的运用

虽然在使用 reactive 时,直接使用泛型是更常见和推荐的做法,但在某些特殊情况下,你可能需要使用类型断言 as。这通常发生在你确信某个值的类型,而TypeScript无法自动推断或者推断错误的时候。

示例:在特殊情况下使用类型断言

假设你从一个外部API获取数据,并且你非常清楚这个数据的结构,但TypeScript无法自动推断:

const rawUserData = fetchUserData(); // 假设这个函数返回any类型
const userData = reactive(rawUserData as User);

// 或者在解构时使用
const { name, age } = reactive(rawUserData) as { name: string, age: number };

在这个场景中,由于 fetchUserData 返回的是 any 类型,TypeScript无法提供类型安全。通过使用 as User 或具体结构的断言,我们强制告诉编译器我们期望的数据类型,从而能够在后续操作中得到类型支持。


📚 泛型与类型断言的区别总结

  • 泛型reactive 中主要用于定义响应式对象的预期类型结构,提供静态类型检查和代码补全,是编写类型安全代码的基础。
  • 类型断言 则是在TypeScript无法正确推断类型或者需要明确指定类型以绕过类型检查时的解决方案,它更多是一种开发者对类型的“手动确认”,应当谨慎使用,确保不会引入潜在的类型错误。

结合Vue 3的响应式系统,合理运用泛型和类型断言,可以使你的代码更加健壮、易于维护,同时保持高效开发。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1643883.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用socket+Python实现ping

import os import socket import struct import select import time# 计算校验和&#xff0c;用于确保数据的完整性 def checksum(source_string):sum 0count 0max_count len(source_string)# 处理成对的字节while count < max_count - 1:val source_string[count 1] *…

结构体介绍(2)

结构体介绍&#xff08;2&#xff09; 前言一、结构体的内存对齐之深入理解为什么存在内存对齐&#xff1f;修改默认对齐数 二、结构体传参2.1&#xff1a;该怎么传参呢&#xff1f; 三、结构体实现位段3.1什么是位段位段的内存分配位段的跨平台问题 总结 前言 根据之前讲了结…

金融行业AI大模型百项应用案例综述【大模型系列】

逐浪金融大模型的玩家&#xff0c;除了BAT、华为等高科技巨头&#xff0c;试图以技术优势充当产业链的“卖铲人”&#xff0c;更多的还是金融和类金融企业&#xff0c;包括银行、保险、互金、券商等&#xff0c;既不想被喧宾夺主&#xff0c;又不想肥水外流&#xff0c;都在押注…

基于Springboot的校园竞赛管理系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的校园竞赛管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构…

VS2019下使用MFC完成科技项目管理系统

背景&#xff1a; &#xff08;一&#xff09;实验目的 通过该实验&#xff0c;使学生掌握windows程序设计的基本方法。了解科技项目组织管理的主要内容和管理方面的基本常识&#xff0c;熟练应用数据库知识&#xff0c;通过处理过程对计算机软件系统工作原理的进一步理解&am…

新型直膨式光伏光热热泵/动力热管复合循环系统

太阳能光伏光热热泵&#xff08;即PVT热泵&#xff09;技术是建筑领域内实现碳中和的有效技术手段&#xff0c;该技术具有优越的热电冷联产能力。然而&#xff0c;现有的PVT热泵在良好的室外工况下能耗较高。为了解决这一问题&#xff0c;本文提出了一种新型的DX-PVT热泵/动力热…

解决网络ping不通问题

网络ping不通可能有多种原因&#xff0c;以下是一些常见的解决方法&#xff1a; 1. 检查IP地址和域名&#xff1a;确保你使用的是正确的IP地址或者域名来ping目标设备。如果IP地址或者域名错误&#xff0c;ping请求将无法到达目标设备。 2. 检查网络连接&#xff1a;首先确保…

【电源专题】拿人体的循环系统与板级电源做个比较

一般人可能会觉得电源大概是电子设备里面比较容易搞定的门类。因为,只要线路没有接错,指示灯(如果有)能亮,电源都能工作。从这个方面说,好像是很容易。但是通过多年的经验和经历的坑,发现电源其实是一个很麻烦的东西,稍微有一点不完美就会有大问题出现。 如果将人体也当…

cloudreve手动添加文件

cloudreve导入本地已有的文件&#xff0c;不需要再次上传 需要更新版本到3.1及更高 在【管理面板】-----【文件】导入 如上图&#xff1a; 选择目标用户、原始路径、目的路径&#xff0c;创建导入任务即可&#xff01;

[C++基础学习-06]----C++指针详解

前言 指针是一个存储变量地址的变量&#xff0c;可以用来访问内存中的数据。在C中&#xff0c;指针是一种非常有用的数据类型&#xff0c;可以帮助我们在程序中对内存进行操作和管理。 正文 01-指针简介 指针的基本概念如下&#xff1a; 声明指针&#xff1a;使用“*”符…

AI+客服行业落地应用

一、客服行业变迁 1.传统客服时代 &#xff08;1&#xff09;客服工作重复性高&#xff0c;技术含量低 &#xff08;2&#xff09;呼出效率低&#xff0c;客服水平参差不齐 &#xff08;3&#xff09;管理难度高&#xff0c;情绪不稳定 &#xff08;4&#xff09;服务质量…

【系统架构师】-选择题(十三)

1、在某企业的营销管理系统设计阶段&#xff0c;属性"员工"在考勤管理子系统中被称为"员工"&#xff0c;而在档案管理子系统中被称为"职工"&#xff0c;这类冲突称为&#xff08; 命名冲突&#xff09;。 同一个实体在同系统中存在不同的命名&am…

2024“天一永安杯“宁波第七届网络安全大赛极安云科战队部分WP

“天一永安杯”2024 宁波第七届网络安全大赛暨第九届大学生网络技术与信息安全大赛 大赛竞赛形式 一、线上初赛 参赛人员&#xff1a;各单位自行选拔3人&#xff08;设队长1名&#xff09;组成团队&#xff0c;不足3人不允许参赛。 竞赛时间&#xff1a;8&#xff1a;30-12&…

15 C语言常用函数

C语言常用函数 本次笔记参考哔站尚硅谷宋红康老师的C语言教程。 C语言是一种广泛应用的编程语言&#xff0c;它提供了一系列的标准库函数&#xff0c;使得程序员能够更高效地编写程序。函数是C语言编程中的基础&#xff0c;通过它们&#xff0c;程序员可以构建出功能丰富的应用…

牛客NC382 切割木头【中等 二分超找 Java/Go/C++】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/707d98cee255448c838c76918a702be0 核心 二分查找Java代码 import java.util.*;public class Solution {/*** 代码中的类名、方法名、参数名已经指定&#xff0c;请勿修改&#xff0c;直接返回方法规定的值即可…

泰克示波器电流探头如何抓浪涌电流波形?

泰克示波器是一种常见的电子测量仪器&#xff0c;广泛应用于电子工程、通信工程、医疗设备等领域。它的主要功能是实时显示电信号的波形&#xff0c;从而帮助工程师和技术人员分析和调试电路。而在一些特定的应用场景中&#xff0c;例如电源、电机、电器设备等&#xff0c;我们…

神经网络之防止过拟合

今天我们来看一下神经网络中防止模型过拟合的方法 在机器学习和深度学习中&#xff0c;过拟合是指模型在训练数据上表现得非常好&#xff0c;但在新的、未见过的数据上表现不佳的现象。这是因为模型过于复杂&#xff0c;以至于它学习了训练数据中的噪声和细节&#xff0c;而不…

基于EBAZ4205矿板的图像处理:12图像二值化(阈值可调)

基于EBAZ4205矿板的图像处理&#xff1a;12图像二值化(阈值可调) 先看效果 板卡拿回寝室了&#xff0c;明天晚上再补充实际运行效果 我的项目是可以通过按键调整二值化的阈值的&#xff0c;key1为阈值加1&#xff0c;key2为阈值减1&#xff0c;key3为阈值加10&#xff0c;ke…

vue初始化项目

打开终端输入vue create project-name 选择Manually select features回车&#xff0c;继续选择如下&#xff1a; 如果要使用pina就可以不选vuex&#xff0c;回车&#xff0c;选择如下&#xff1a; 按下图选即可

SX1301 1MHz、2A升压电流模式PWM转换器芯片IC

一般说明 S1301是直流-直流之间的a电流。安装Wμ电路内置0.25Ω功率MOSFET&#xff0c;使此稳压器高功率效率。内部补偿网络还可最大限度地减少多达6个外部元件数量。误差放大器的同相输入端接0.6V精密基准电压&#xff0c;内部具有软启动功能&#xff0c;可以减小浪涌电…