『TypeScript』深入理解变量声明、函数定义、类与接口及泛型
📣读完这篇文章里你能收获到
- 了解TypeScript变量声明与类型注解
- 掌握TypeScript函数与方法的使用
- 掌握TypeScript类与接口的使用
- 掌握TypeScript泛型的应用
文章目录
- 一、变量声明与类型注解
- 1. 变量声明
- 2. 类型注解
- 3. 类型推断
- 二、函数与方法定义
- 1. 函数定义
- 2. 方法定义
- 3. 参数和返回类型
- 三、类与接口的使用
- 1. 类(Class)
- 1.1 定义类
- 1.2 创建对象
- 2. 接口(Interface)
- 2.1 定义接口
- 2.2 实现接口
- 2.3 使用接口
- 四、泛型的应用
- 1. 什么是泛型?
- 2. 泛型类型
- 3. 泛型约束
一、变量声明与类型注解
1. 变量声明
在TypeScript中,我们可以使用关键字let或const来声明变量。let用于声明可变的变量,而const用于声明不可变的变量(常量)。通过这种方式,我们可以限制变量被修改的范围,减少潜在的错误。
let count: number = 10;
const name: string = "John";
2. 类型注解
类型注解是TypeScript中的一个重要概念,它允许我们明确指定变量的类型。通过在变量后面使用冒号(:)加上类型,我们可以告诉编译器应该为变量分配何种类型。
let count: number = 10;
let name: string = "John";
类型注解能够提供更好的类型安全性,让我们在编码过程中更早地发现潜在的类型错误。
3. 类型推断
TypeScript还支持类型推断,即根据变量的初始值自动推断出变量的类型。当我们没有显式地指定变量的类型时,TypeScript会根据上下文推断出变量的类型。
let count = 10; // 推断为number类型
let name = "John"; // 推断为string类型
类型推断的好处是可以减少代码中的冗余,同时仍然提供了类型安全性。我们无需在每一个变量声明中都显式地指定类型,TypeScript能够自动推断正确的类型。
二、函数与方法定义
在TypeScript中,函数和方法的定义是非常重要的,因为它们是构建可维护、可扩展和可重用代码的基础。本文将介绍如何在TypeScript中定义函数和方法,并探讨一些最佳实践。
1. 函数定义
在TypeScript中,你可以使用function关键字来定义一个函数。下面是一个简单的示例:
function greet(name: string): void {console.log(`Hello, ${name}!`);
}
上面的代码定义了一个名为greet的函数,它接受一个字符串类型的参数name并且不返回任何值(void表示没有返回值)。在调用这个函数时,你需要传入一个字符串作为参数。
2. 方法定义
在面向对象的编程中,方法是与类相关联的函数。在TypeScript中,方法的定义也很简单:
class Greeter {private greeting: string;constructor(greeting: string) {this.greeting = greeting;}greet() {console.log(`Hello, ${this.greeting}!`);}
}
上面的代码定义了一个名为Greeter的类,其中包含一个名为greet的方法。在这个例子中,greet方法并不接受任何参数,它直接访问类的成员变量greeting并输出相应的问候语。
3. 参数和返回类型
在TypeScript中,你可以为函数和方法指定参数的类型以及返回值的类型。这有助于提高代码的可读性和健壮性。下面是一个带有参数和返回类型的函数定义示例:
function add(x: number, y: number): number {return x + y;
}
在上面的示例中,add函数接受两个number类型的参数x和y,并返回它们的和作为number类型的结果。
三、类与接口的使用
1. 类(Class)
类是面向对象编程的基本概念,它是一种将数据和行为组合在一起的结构。在 TypeScript 中,我们可以使用类来创建对象,并通过类的实例来访问对象的属性和方法。
1.1 定义类
类使用 class 关键字进行定义,以下是一个简单的类示例:
class Animal {name: string;constructor(name: string) {this.name = name;}walk(): void {console.log(`${this.name} is walking.`);}
}
1.2 创建对象
通过类来创建对象的过程称为实例化。我们可以使用 new 关键字来实例化一个类,并获取一个类的实例。
const cat = new Animal("Tom");
cat.walk(); // 输出: "Tom is walking."
2. 接口(Interface)
接口是一种抽象的定义,它描述了对象的行为和属性。在 TypeScript 中,我们可以使用接口来定义对象的结构,并进行类型检查。
2.1 定义接口
接口使用 interface 关键字进行定义,以下是一个简单的接口示例:
interface Person {name: string;age: number;sayHello(): void;
}
2.2 实现接口
接口本身并不具备任何实际的数据,它只是一种规范或约束。我们需要通过类来实现接口,并提供具体的实现。
class Student implements Person {name: string;age: number;constructor(name: string, age: number) {this.name = name;this.age = age;}sayHello(): void {console.log(`Hello, my name is ${this.name}, I'm ${this.age} years old.`);}
}
2.3 使用接口
一旦我们定义了接口,并且通过类实现了接口,我们就可以使用接口来进行类型检查和约束。
function printInfo(person: Person): void {person.sayHello();
}const student = new Student("Tom", 20);
printInfo(student);
四、泛型的应用
1. 什么是泛型?
泛型是一种在编程中使用类型参数来创建可重用代码的方法。通过泛型,我们可以编写能够处理多种类型数据的代码,而不需要针对每种类型都编写一遍。
function identity<T>(arg: T): T {return arg;
}
在上面的示例中,我们定义了一个identity函数,它使用了一个类型参数T。这个函数可以接收任何类型的值,并返回相同类型的值。在这里,我们可以将T看作是一个占位符,当我们实际调用这个函数时传入的类型会替换掉它。
2. 泛型类型
除了可以使用泛型函数,我们还可以创建泛型类型。泛型类型在实现某些数据结构时非常有用,例如数组或元组。
interface Box<T> {contents: T;
}let box1: Box<number> = { contents: 42 };
let box2: Box<string> = { contents: "hello" };
在上面的示例中,我们定义了一个Box接口,它使用了一个类型参数T,表示这个盒子中可以装任何类型的物品。我们可以使用不同的类型参数来定义不同的Box,例如box1是一个存储数字的盒子,而box2是一个存储字符串的盒子。
3. 泛型约束
有时候,我们希望泛型能够处理某些特定类型的数据,而不是任何类型。在这种情况下,我们可以使用泛型约束。
interface Lengthwise {length: number;
}function loggingIdentity<T extends Lengthwise>(arg: T): T {console.log(arg.length);return arg;
}loggingIdentity("hello world"); // 输出 11
在上面的示例中,我们定义了一个Lengthwise接口,它表示拥有一个length属性的对象。然后我们定义了一个泛型函数loggingIdentity,并使用extends关键字来限制泛型参数T必须继承自Lengthwise接口。这样一来,我们就可以在函数内部使用arg.length属性。
相关文章:

『TypeScript』深入理解变量声明、函数定义、类与接口及泛型
📣读完这篇文章里你能收获到 了解TypeScript变量声明与类型注解掌握TypeScript函数与方法的使用掌握TypeScript类与接口的使用掌握TypeScript泛型的应用 文章目录 一、变量声明与类型注解1. 变量声明2. 类型注解3. 类型推断 二、函数与方法定义1. 函数定义2. 方法定…...

如何优雅使用 vue-html2pdf 插件生成pdf报表
使用 vue-html2pdf 插件 业务背景,老板想要一份能征服客户的pdf报表,传统的pdf要手撕,企业中确实有点耗费时间,于是github上面看到开源的这个插件就…废话不多说,直接上教程 1.使用下面命令安装 vue-html2pdf npm i…...

C语言第十六集(前)
1.关于那个整形存储入char的 是先取好补码,再截断 例: 2.%u是以十进制的形式打印无符号整数 3.注意(背):存储的char类型变量的补码为10000000的直接解析为-128 4.signed char 类型的变量取值范围是-128~127 5.unsigned char 类型的变量取值范围是0~255 6.有符号类型的变量…...

Makefile语法
一、Makefile规则格式 Makefile 里面是由一系列的规则组成的,这些规则格式如下: 目标…... : 依赖文件集合…… 命令 1 命令 2 ……参考上一节gcc编译器与Makefile入门参考这条规则 1 main: main.o input.o calcu.o2 gcc -o main main.o input.o c…...

用户案例|Milvus 助力 Credal.AI 实现 GenAI 安全与可控
AIGC 时代,企业流程中是否整合人工智能(AI)对于的企业竞争力至关重要。然而,随着 AI 不断发展演进,企业也在此过程中面临数据安全管理、访问权限、数据隐私等方面的挑战。 为了更好地解决上述问题,Credal.A…...
MySQL三 | 多表查询
目录 多表查询 内连接 隐式内连接 显示内连接 外连接 左外连接 右外连接 自连接 子查询 多表查询 笛卡尔积:集合A和集合B的所有组合情况 A * B 在多表查询时应消除无效的笛卡尔积 内连接 查询的是两张表交集的地方 隐式内连接 SELECT 字段列表 FROM 表1…...
PostgreSQL 索引介绍和使用事项
索引内容 关键点 索引是一种数据结构,用于加快数据库查询的速度。它类似于书籍的目录,可以快速定位到特定的数据页。 PG数据库支持多种类型的索引,包括B树索引、哈希索引、GiST索引、SP-GiST索引和GIN索引等。 B树索引是PG数据库中最常用的…...
MySQL注入攻防详解:保障数据库安全的最佳实践
引言 MySQL作为广泛使用的关系型数据库,其安全性一直备受关注。然而,MySQL注入攻击是一种常见而危险的安全漏洞,攻击者通过巧妙构造的输入,可以绕过应用程序的验证,执行恶意的SQL语句,导致数据泄露、篡改或…...

ubuntu or MacOS 源码安装 fmt fmtlib
1,前情 提醒这个源代码需要从release中下载 打包好的,而直接用git clone下载不了,可能github上的这个git clone的链接仅仅是给fmt lib的开发者使用的吧; 下载fmtlib的release源代码u下载fmtlib的release源代码 2,解压编…...
vue watch
vue 使用watch监听props的一些小建议 当在watch里面给data赋值,请使用深拷贝。 <template><div class"container"><div class"left"><div class"button_group"><!-- <button click"rand…...

异常检测 | 基于孤立森林(Isolation Forest)的数据异常数据检测(结合t-SNE降维可视化)
异常检测 | MATLAB实现基于孤立森林的数据异常检测 目录 异常检测 | MATLAB实现基于孤立森林的数据异常检测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 Matlab实现基于孤立森林(Isolation Forest)的数据异常数据检测可视化(完整源码和数据) 基于孤立森林(…...

【深度学习】一维数组的聚类
在学习聚类算法的过程中,学习到的聚类算法大部分都是针对n维的,针对一维数据的聚类方式较少,今天就来学习下如何给一维的数据进行聚类。 方案一:采用K-Means对一维数据聚类 Python代码如下: from sklearn.cluster im…...

100多种视频转场素材|专业胶片,抖动,光效电影转场特效PR效果预设
100多种 Premiere Pro 效果预设,包含:“胶片框架”、“胶片烧录”、“彩色LUT”、“相机抖动”、“电影Vignette”和“胶片颗粒”。非常适合制作复古风格的视频,添加独特的色彩。包括视频教程。 来自PR模板网:https://prmuban.com…...

http与apache
目录 1.http相关概念 2.http请求的完整过程 3.访问浏览器背后的原理过程 4.动态页面与静态页面区别 静态页面: 动态页面: 5.http协议版本 6.http请求方法 7.HTTP协议报文格式 8.http响应状态码 1xx:提示信息 2xx:成功…...

一、服务器准备
本案例使用VMware Workstation Pro虚拟机创建虚拟服务器来搭建Linux服务器集群,所用软件及版本如下: Centos7.7-64bit 1、三台虚拟机创建 第一种方式:通过iso镜像文件来进行安装(不推荐) 第二种方式:直接复制安装好的虚拟机文…...

区块链optimism主网节点搭建
文章目录 官方参考资料编译环境搭建编译Optimism Monorepo编译op-geth 执行下载数据快照生成op-geth和op-node通信密钥op-geth执行脚本 op-node执行脚本 启动日志op-gethop-node 本文是按照官方参考资料基于源码的方式成功搭建optimism主网节点。 官方参考资料 源码࿱…...

Bounding boxes augmentation for object detection
Different annotations formats Bounding boxes are rectangles that mark objects on an image. There are multiple formats of bounding boxes annotations. Each format uses its specific representation of bouning boxes coordinates 每种格式都使用其特定的边界框坐标…...

【计算机网络学习之路】HTTP请求
目录 前言 HTTP请求报文格式 一. 请求行 HTTP请求方法 GET和POST的区别 URL 二. 请求头 常见的Header 常见的额请求体数据类型 三. 请求体 结束语 前言 HTTP是应用层的一个协议。实际我们访问一个网页,都会像该网页的服务器发送HTTP请求,服务…...
java之字符串常用处理函数
在Java中,你可以使用Collections.sort()方法对字符串中的字符进行排序。这个方法会按照字母顺序对字符进行排序。 以下是一个例子: import java.util.Arrays; import java.util.Collections; public class Main { public static void main(…...

【XILINX】ERROR:Place:1136 - This design contains a global buffer instance
记录一个ISE软件使用过程中遇到的问题及解决方案。 芯片:spartan6 问题 ERROR:Place:1136 - This design contains a global buffer instance, , driving the net,>, that is driving the following (first 30) non-clock load pins. This is not a recommended…...

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)
CSI-2 协议详细解析 (一) 1. CSI-2层定义(CSI-2 Layer Definitions) 分层结构 :CSI-2协议分为6层: 物理层(PHY Layer) : 定义电气特性、时钟机制和传输介质(导线&#…...
渲染学进阶内容——模型
最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...

对WWDC 2025 Keynote 内容的预测
借助我们以往对苹果公司发展路径的深入研究经验,以及大语言模型的分析能力,我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际,我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测,聊作存档。等到明…...
OkHttp 中实现断点续传 demo
在 OkHttp 中实现断点续传主要通过以下步骤完成,核心是利用 HTTP 协议的 Range 请求头指定下载范围: 实现原理 Range 请求头:向服务器请求文件的特定字节范围(如 Range: bytes1024-) 本地文件记录:保存已…...
vue3 定时器-定义全局方法 vue+ts
1.创建ts文件 路径:src/utils/timer.ts 完整代码: import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...

【无标题】湖北理元理律师事务所:债务优化中的生活保障与法律平衡之道
文/法律实务观察组 在债务重组领域,专业机构的核心价值不仅在于减轻债务数字,更在于帮助债务人在履行义务的同时维持基本生活尊严。湖北理元理律师事务所的服务实践表明,合法债务优化需同步实现三重平衡: 法律刚性(债…...

软件工程 期末复习
瀑布模型:计划 螺旋模型:风险低 原型模型: 用户反馈 喷泉模型:代码复用 高内聚 低耦合:模块内部功能紧密 模块之间依赖程度小 高内聚:指的是一个模块内部的功能应该紧密相关。换句话说,一个模块应当只实现单一的功能…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现指南针功能
指南针功能是许多位置服务应用的基础功能之一。下面我将详细介绍如何在HarmonyOS 5中使用DevEco Studio实现指南针功能。 1. 开发环境准备 确保已安装DevEco Studio 3.1或更高版本确保项目使用的是HarmonyOS 5.0 SDK在项目的module.json5中配置必要的权限 2. 权限配置 在mo…...
鸿蒙HarmonyOS 5军旗小游戏实现指南
1. 项目概述 本军旗小游戏基于鸿蒙HarmonyOS 5开发,采用DevEco Studio实现,包含完整的游戏逻辑和UI界面。 2. 项目结构 /src/main/java/com/example/militarychess/├── MainAbilitySlice.java // 主界面├── GameView.java // 游戏核…...
[特殊字符] 手撸 Redis 互斥锁那些坑
📖 手撸 Redis 互斥锁那些坑 最近搞业务遇到高并发下同一个 key 的互斥操作,想实现分布式环境下的互斥锁。于是私下顺手手撸了个基于 Redis 的简单互斥锁,也顺便跟 Redisson 的 RLock 机制对比了下,记录一波,别踩我踩过…...