『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属性。

请添加图片描述

请添加图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JDBC常见的几种连接池使用(C3P0、Druid、HikariCP 、DBCP)(附上代码详细讲解)

Hi i,m JinXiang ⭐ 前言 ⭐ 本篇文章主要介绍JDBC常见的几种连接池使用&#xff08;C3P0、Druid、HikariCP 、DBCP&#xff09;以及部分理论知识 &#x1f349;欢迎点赞 &#x1f44d; 收藏 ⭐留言评论 &#x1f4dd;私信必回哟&#x1f601; &#x1f349;博主收将持续更新学…

【实用经验】如何根据CVE编号找到安全补丁

找到对应补丁页面 例如查找编号为 CVE-2019-0708 的漏洞&#xff0c;访问下面链接即可&#xff0c;替换末尾编号可获取其他漏洞更新补丁。 https://msrc.microsoft.com/update-guide/vulnerability/CVE-2019-0708根据实际情况点击右侧补丁链接即可跳转下载 最后根据实际情况下…

高级搜索——ST表,离线RMQ问题

文章目录 前言可重复贡献问题ST表的定义ST表的存储结构ST表的预处理预处理的实现 ST表的区间查询对于k的获取区间查询的实现 OJ链接 前言 对于查询区间最值的方法&#xff0c;我们常用的就是线段树&#xff0c;树状数组&#xff0c;单调队列&#xff0c;而树状数组更适合用于快…

10款必备设计的工具汇总

在当今数字时代&#xff0c;在线绘图软件已经成为创造、设计和表达创造力的重要工具。无论你是专业设计师还是创意爱好者&#xff0c;这些在线绘图软件都将帮助你实现创造力的无限可能性。本文将介绍10个画图设计软件&#xff0c;并分析功能特点、优点&#xff0c;帮助您找到最…

基于Browscap对浏览器工具类优化

项目背景 原有的启动平台公共组件库comm-util的浏览器工具类BrowserUtils是基于UserAgentUtils的&#xff0c;但是该项目最后一个版本发布于 2018/01/24&#xff0c;之至今日23年底&#xff0c;已有5年没有维护更新&#xff0c;会造成最新版本的部分浏览器不能正确获取到浏览器…

机器学习 sklearn 中的超参数搜索方法

✅作者简介&#xff1a;人工智能专业本科在读&#xff0c;喜欢计算机与编程&#xff0c;写博客记录自己的学习历程。 &#x1f34e;个人主页&#xff1a;小嗷犬的个人主页 &#x1f34a;个人网站&#xff1a;小嗷犬的技术小站 &#x1f96d;个人信条&#xff1a;为天地立心&…

【Docker二】docker网络模式、网络通信、数据管理

目录 一、docker网络模式&#xff1a; 1、概述 2、docker网络实现原理&#xff1a; 3、docker的网络模式&#xff1a; 3.1、bridge模式&#xff1a; 3.2、host模式&#xff1a; 3.3、container模式&#xff1a; 3.4、none模式&#xff1a; 3.5、自定义网络模式&#xf…

c语言指针详解下

指针下 1 指针与字符串 int main01(){//指针与字符串char a[] "helloworld";//定义了一个字符数组,字符数组内容为helloworld\0//定义一个指针用来保存数组首元素的地址char * p a;printf("%s\n",p);//%s打印一个字符串,要的是首个字符的地址printf(…

MySql概述及其性能说明

MySQL是一种开源的关系型数据库管理系统&#xff0c;由瑞典MySQL AB公司开发&#xff0c;现属于Oracle公司。MySQL是最流行的开源数据库之一&#xff0c;被广泛地应用于Web开发中。MySQL提供了一个高度稳定可靠的数据存储解决方案&#xff0c;同时也可以很容易地跨平台运行。My…

软件中提示找不到msvcp140.dll无法继续执行代码,运行打开软件怎么弄

今天打开CAD提示找不到msvcp140.dll&#xff0c;这是一个很常见的问题&#xff0c;可能是由于系统缺少这个重要的动态链接库文件导致的。本文将介绍五个解决方法&#xff0c;以及msvcp140.dll文件的作用和丢失原因。 一、msvcp140.dll文件的作用 msvcp140.dll是Microsoft Vis…

一对多聊天

服务端 import java.io.*; import java.net.*; import java.util.ArrayList; public class Server{public static ServerSocket server_socket;public static ArrayList<Socket> socketListnew ArrayList<Socket>(); public static void main(String []args){try{…

基于互一致性学习的半监督医学图像分割

Mutual consistency learning for semi-supervised medical image segmentation 基于互一致性学习的半监督医学图像分割背景贡献半监督学习 其它缓解过拟合的方法实验方法损失函数Thinking 基于互一致性学习的半监督医学图像分割 Medical Image Analysis 81 (2022) 102530 背…