掌握 TypeScript 核心:从基本类型到面向对象编程,理论详解与Vue3实践运用

在这里插入图片描述

TypeScript 是一种开源的编程语言,由微软公司开发,于2012年10月首次公开发布。 TypeScript 是 JavaScript 的超集,这意味着任何合法的 JavaScript 代码都是有效的 TypeScript 代码。它在 JavaScript 的基础上添加了静态类型系统、类、接口、模块等高级特性和严格的类型检查机制,旨在提高大型应用的可维护性和开发效率。

一、核心特性

1、静态类型系统

类型声明:TypeScript 最显著的特性之一是其静态类型系统。通过在变量声明、函数参数、返回值、对象属性等处使用类型注解,开发者可以明确指定数据的类型。类型系统在编译阶段进行静态类型检查,能够提前捕获潜在的类型错误,增强代码的可靠性。TypeScript 支持丰富的内置类型(如 stringnumberbooleananyunknownnullundefinedvoidnever 等)以及用户自定义类型(如接口、类型别名、元组、枚举、泛型等)。

基本类型
let myNumber: number = 42; // 数字
let myString: string = 'Hello, world!'; // 字符串
let myBoolean: boolean = true; // 布尔值
let myNull: null = null; // null
let myUndefined: undefined = undefined; // undefined
let myAny: any = 'This can be anything'; // any类型,允许赋值任意类型
数组类型
let numbers: number[] = [1, 2, 3]; // 数组元素类型为number
let strings: Array<string> = ['a', 'b', 'c']; // 使用Array<T>类型
元组(Tuple)
let pair: [string, number] = ['Alice', 30]; // 具有固定长度和已知类型的数组
枚举(Enum)
enum Color { Red, Green, Blue }
let color: Color = Color.Red; // 使用枚举成员
void
function sayHello(): void {console.log('Hello!');
}let nothing: void = undefined; // 或者 null
never
function throwError(message: string): never {throw new Error(message);
}function infiniteLoop(): never {while (true) {}
}
类型断言

当TypeScript无法准确推断类型时,可以使用类型断言来明确指定类型:

let someValue: any = '42';// 类型断言
let strLength: number = (someValue as string).length; // 强制断言为字符串
let strLengthAlt: number = (<string>someValue).length; // 老式语法(尖括号形式)

2、强类型与类型推断

TypeScript 是强类型语言,要求变量在使用前必须被正确初始化,并且在程序运行期间不能改变其类型。虽然需要显式或隐式地指定类型,但 TypeScript 也具备类型推断能力,可以根据上下文自动确定变量、函数参数或返回值的类型,减少手动编写类型注解的工作量。

let greeting = "Welcome"; // 类型推断为 string
const sum = (x, y) => x + y; // 类型推断为 (x: number, y: number) => number

3、类与面向对象编程

TypeScript 支持基于类(Class)的面向对象编程,包括类的定义、继承、抽象类、访问修饰符(public、private、protected)、构造函数、析构函数、getter/setter、静态成员、实例成员、方法重载等。这使得开发者可以利用封装、继承和多态等原则组织复杂的代码结构。

class Person {constructor(public name: string, protected age: number) {}introduce(): void {console.log(`My name is ${this.name} and I am ${this.age} years old.`);}static greeting(): string {return 'Hello from the Person class!';}
}class Student extends Person {school: string;constructor(name: string, age: number, school: string) {super(name, age);this.school = school;}introduce(): void {super.introduce();console.log(`I study at ${this.school}.`);}
}

TypeScript支持函数声明、函数表达式以及箭头函数,并可以为参数和返回值指定类型:

// 函数声明
function add(a: number, b: number): number {return a + b;
}// 函数表达式
const subtract = function (x: number, y: number): number {return x - y;
};// 箭头函数
const multiply = (c: number, d: number): number => c * d;// 可选参数和默认参数
function calculateArea(radius?: number = 1): number {return Math.PI * radius ** 2;
}

TypeScript中的条件控制语句(if-else、switch-case)和循环结构(for、for-of、for-in、while、do-while)与JavaScript完全相同,只是配合TypeScript的类型系统,变量在这些结构中的类型会被正确推断或检查。

4、接口与类型约束

接口(Interfaces)是 TypeScript 中用于定义对象形状的重要工具,它们描述了一组属性和方法的结构。接口可以用于类的实现、函数参数类型、对象字面量类型检查等场合,确保代码符合预期的数据结构。此外,TypeScript 还支持接口的继承、合并、索引签名、可选属性、只读属性等特性。

interface IPerson {name: string;age: number;greet(): void;
}class Employee implements IPerson {name: string;age: number;constructor(name: string, age: number) {this.name = name;this.age = age;}greet(): void {console.log(`Hi, I'm ${this.name} and I'm ${this.age} years old.`);}
}

5、泛型(Generics)

泛型允许定义可重用的函数、接口或类,它们可以处理多种不同类型的值:

function identity<T>(arg: T): T {return arg;
}interface Container<T> {value: T;add(item: T): void;
}class Queue<T> {private data: T[] = [];enqueue(item: T): void {this.data.push(item);}dequeue(): T | undefined {return this.data.shift();}
}

6、模块化

TypeScript 支持两种模块系统:CommonJS(使用 requiremodule.exports)和 ES6 模块(使用 importexport)。模块化允许将代码分解为独立、可复用的部分,并通过明确的导入导出语句管理依赖关系,提升代码组织性和可维护性。

// 导出
export const PI = 3.14;export class Circle {constructor(public radius: number) {}get area(): number {return PI * this.radius ** 2;}
}// 导入
import { PI, Circle } from './math';const circle = new Circle(5);
console.log(circle.area);

为了使用现有的JavaScript库或未包含类型信息的第三方模块,可以编写声明文件来提供类型信息:

// example.d.ts
declare module 'exampleLib' {export function doSomething(input: string): number;export class SomeClass {constructor(param: boolean);public method(): void;}
}

类型别名(Type Alias)

type Name = string;
type Point = [number, number];
type Callback = (value: any) => void;

7、装饰器(Decorators)

TypeScript 提供了实验性的装饰器(Decorator)特性,这是一种特殊类型的声明,可以修改类、属性、方法或参数的行为。装饰器是函数,接收被装饰的声明作为参数,并返回一个新的声明或修改原有的声明。它们常用于元编程、AOP(面向切面编程)场景,以及框架中进行组件的增强和配置。

// 装饰器示例
function log(target: any, key: string, descriptor: PropertyDescriptor) {const originalMethod = descriptor.value;descriptor.value = function(...args: any[]) {console.log(`Calling "${key}" with`, args);const result = originalMethod.apply(this, args);console.log(`"${key}" returned`, result);return result;};return descriptor;
}class MathUtils {@logadd(a: number, b: number): number {return a + b;}
}const utils = new MathUtils();
utils.add(1, 2); // 输出:Calling "add" with [1, 2], "add" returned 3

8、编译与工具链

TypeScript 代码不能直接在浏览器或 Node.js 环境中执行,需要经过编译器(tsc)将其转换为等效的 JavaScript 代码。编译过程中,TypeScript 会执行静态类型检查,并根据指定的目标版本(如 ES5、ES6 等)生成相应的 JavaScript 代码。同时,TypeScript 编译器支持多种编译选项,如模块系统选择、是否启用严格模式、是否生成源码映射文件等。

TypeScript 社区拥有丰富的生态系统,包括编辑器插件(如 Visual Studio Code 的 TypeScript 支持)、构建工具(如 Webpack、Rollup)、包管理器(npm、yarn)、测试框架(Jest、Mocha)、格式化器(Prettier)、代码检查工具(ESLint)等,为开发流程提供了全面的支持。

9、跨平台与广泛应用

TypeScript 使用 Apache 2.0 开源许可协议,可在 Windows、macOS、Linux 等主流操作系统上安装和使用。由于其对 JavaScript 的兼容性以及对现代 JavaScript 特性(如 ES6+)的良好支持,TypeScript 已被广泛应用于前端、后端、跨平台移动端(如 React Native、Ionic)以及云原生开发(如 Serverless 函数)等领域。许多知名项目和框架,如 Angular、React、Vue.js、Node.js 应用等,均支持或推荐使用 TypeScript 进行开发。

二、Vue3+TypeScript项目实践

在Vue项目中使用TypeScript可以显著提升代码的可维护性和类型安全性。以下是一些具体的实践例子,展示了如何在Vue项目中有效地运用TypeScript:

1、创建Vue3+TypeScript项目

使用Vue CLI创建一个新的Vue3项目,并选择TypeScript预设:

vue create my-project --preset vue-cli/preset-typescript

这将创建一个包含TypeScript配置和支持的Vue 3项目结构。

2、使用Vue 3 Composition API与TypeScript

在Vue 3中,Composition API提供了更好的类型推断和严格类型约束。以下是一个使用Composition API和TypeScript的例子:

// src/components/Counter.vue<script lang="ts">
import { defineComponent, ref } from 'vue';export default defineComponent({setup() {const count = ref(0);function increment() {count.value++;}function decrement() {count.value--;}return {count,increment,decrement};}
});
</script><template><div><button @click="decrement">-</button><span>{{ count }}</span><button @click="increment">+</button></div>
</template>

在这个例子中:

  • defineComponent 函数用于定义一个Vue组件。
  • ref 函数用于创建一个响应式变量 count,并指定其初始值为 0
  • incrementdecrement 函数用于更新 count 的值。
  • setup 函数返回一个对象,其中包含暴露给模板的数据(count)和方法(incrementdecrement)。

3、使用类组件与装饰器

虽然Composition API是Vue 3推荐的写法,但依然可以使用类组件结合装饰器进行开发。借助vue-class-componentvue-property-decorator库,可以简化类组件的编写:

npm install --save-dev vue-class-component vue-property-decorator
// src/components/HelloWorld.vue<script lang="ts">
import { Component, Vue, Prop } from 'vue-property-decorator';@Component
export default class HelloWorld extends Vue {@Prop({ required: true }) readonly msg!: string;computedCount(): number {return this.msg.length;}
}
</script><template><div><p>Message length: {{ computedCount }}</p><p v-if="msg">{{ msg }}</p></div>
</template>

这里:

  • 使用 @Component 装饰器标记类为Vue组件。
  • @Prop() 装饰器用于定义接受父组件传递的属性 msg,并设置为必填。
  • readonly 关键字确保属性仅在构造函数中初始化,不能在类的其他地方赋值。
  • computedCount 是一个计算属性,返回 msg 的长度。

4、使用Vue Router与TypeScript

在TypeScript项目中使用Vue Router时,可以为路由定义明确的类型:

// src/router/index.tsimport { createRouter, createWebHistory, RouteRecordRaw } from 'vue-router';
import Home from '@/views/Home.vue';const routes: RouteRecordRaw[] = [{path: '/',name: 'Home',component: Home},// 其他路由...
];const router = createRouter({history: createWebHistory(process.env.BASE_URL),routes
});export default router;

5、使用Vuex与TypeScript

在TypeScript项目中使用Vuex,需要定义模块的类型和状态、 mutations、 actions、 getters:

// src/store/modules/example.tsimport { Module, VuexModule, Mutation, Action } from 'vuex-module-decorators';@Module({ name: 'example', stateFactory: true, namespaced: true })
export default class Example extends VuexModule {count = 0;@Mutationincrement(amount: number) {this.count += amount;}@Action({ rawError: true })async fetchCount(): Promise<void> {// 异步操作...this.context.commit('increment', fetchedCount);}get displayedCount(): number {return this.count * 2; // 示例计算属性}
}

以上例子展示了在Vue项目中使用TypeScript进行组件开发、状态管理、路由配置的实践。通过充分利用TypeScript的类型系统,可以提高代码的可读性、可维护性,并在开发过程中通过编译时检查预防潜在的类型错误。

总结来说,TypeScript 通过引入静态类型系统、类、接口、模块等特性,为 JavaScript 开发者提供了更严谨的编程范式、更强大的工具支持以及更高的代码质量保障。尽管它增加了一定的学习成本和开发时的类型注解工作,但在大型项目和团队协作中,TypeScript 能够显著提升代码的可读性、可维护性和开发效率,降低潜在的运行时错误,从而成为现代 JavaScript 开发的首选语言之一。

在这里插入图片描述

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

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

相关文章

【Linux】有关时间的命令(date、timedatectl)

专栏文章索引&#xff1a;Linux 有问题可私聊&#xff1a;QQ&#xff1a;3375119339 目录 一、data命令 1.介绍 2.常用参数 3.常用选项 二、timedatectl命令 1.介绍 2.常用子命令 一、data命令 1.介绍 date命令用于显示或设置系统的时间与日期&#xff0c;语法格式为&a…

Nacos 入门篇---客户端如何发起服务注册?怎么发送服务心跳的(二)

一、引言 上个章节我们简单学习和使用了下Nacos服务自动注册&#xff0c;本文就来分析下Nacos客户端自动注册服务是怎么实现的&#xff5e; 二、目录 目录 一、引言 三、Nacos 源码编译 1.1 拉取代码 1.2 运行起来 四、客户端使用版本选择 五、Nacos客户端项目启动为什么会…

java数据结构与算法刷题-----LeetCode415. 字符串相加

java数据结构与算法刷题目录&#xff08;剑指Offer、LeetCode、ACM&#xff09;-----主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/123063846 文章目录 模拟小学加法运算 模拟小学加法运算 解题思路&#xff1a;时间复…

深入浅出 -- 系统架构之分布式集群的分类

一、单点故障问题 集群&#xff0c;相信诸位对这个概念并不陌生&#xff0c;集群已成为现时代中&#xff0c;保证服务高可用不可或缺的一种手段。 回想起初集中式部署的单体应用&#xff0c;因为只有一个节点&#xff0c;因此当该节点出现任意类型的故障&#xff08;网络、硬件…

MySQL复制拓扑4

文章目录 主要内容一.启用GUID并配置循环复制1.其中&#xff0c;UUID用来唯一标识每一个服务器&#xff0c;事务的编号记录了在该服务器上执行的事务的顺序。使用SELECT server_uuid\G命令可以查看服务器的UUID&#xff0c;sever1的UUID值显示如下&#xff1a;代码如下&#xf…

区域自动气象站讲解

TH-QC10当我们每天查看天气预报&#xff0c;安排出行计划&#xff0c;或是在户外活动时关注天气变化&#xff0c;很少有人会想到这一切背后默默付出的“英雄”——区域自动气象站。这些看似不起眼的气象监测设备&#xff0c;却在我们日常生活中扮演着至关重要的角色。今天&…

单链表经典oj题 (一) 简单

1.删除指定节点数据&#xff08;非尾节点&#xff09;&#xff0c;要求时间复杂度为O(1) . - 力扣&#xff08;LeetCode&#xff09; 在之前我们将单链表删除指定节点的操作是先遍历找到pos的前一个结点&#xff0c;然后再进行删除&#xff0c;但是现在要求再O(1)时间内完成&am…

Kubernetes有状态任务

有状态任务是指执行期间需要维护一定状态或数据的任务或工作。这些任务通常需要记录并维护数据、状态、上下文或进度信息&#xff0c;并且这些信息在任务执行期间保持持久。有状态任务的解决目标是确保任务在不同的环境、节点或时间点之间维持一致的状态和标识。这种任务通常需…

2-3 AUTOSAR ASW Runable可运行实体

返回总目录->返回总目录<- 目录 一、概述 二、RTE Event 一、概述 运行实体(Runnable Entity,RE)是一段可执行的代码,其包含实际实现的函数(具体的逻辑算法或者操作)。一个软件组件可以包含一个或者多个运行实体。 Runnable就是SWC中的函数,而在AutoSAR架构在被…

Windows Server 2012 R2安装远程桌面服务

文章目录 一、打开【服务器管理器】二、点击【添加角色和功能】三、点击【下一步】四、点击【下一步】五、点击【下一步】![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/05b61a830faf477e81f858ec00bbdfff.png)六、勾选【远程桌面服务】→点击【下一步】七、点击【…

sharo反序列化漏洞

启动docker 服务 sudo service docker start 打开靶场 sudo docker run -d -p 80:8080 medicean/vulapps:s_shiro_1 输入docker虚拟机地址打开靶机sharo框架 如何利用漏洞 打开工具目录在终端中打开 输入靶机地址 打开yaki监听端口可以设置为6666 返回工具填写靶机ip和端口 …

Windows应急响应

1.排查隐藏账号 查看注册表 找到攻击者用户目录文件 排查用户异常 eventvwr.msc 分析用户登录日志 排查可疑端口 排查可疑进程 检查启动项、计划任务和服务 查看系统补丁信息 安装火绒&#xff0c;在安全工具里有火绒剑 计划任务 使用D盾对主机进行检测&#xff0c;发现隐藏账户…

中非绿色能源合作走深走实

近日&#xff0c;第十六届非洲能源大会在南非立法首都开普敦举行&#xff0c;探讨实现非洲能源转型的可持续解决方案。近年来&#xff0c;中国与非洲国家不断加强绿色能源合作&#xff0c;促进双方优势资源互补&#xff0c;逐步探索合作共赢的绿色能源合作方案。 势头良好 近年…

【201】Java8读取JSON树形结构并插入到MySQL数据库表中

我写了一个 maven 项目的 Demo&#xff0c;用来演示 JAVA8 如何读取 JSON 文件树形结构&#xff0c;并将这种树形结构保存到 MySQL 中。 json文件 city.json {"name": "山东省","sub": [{"name": "青岛市","sub"…

什么是SYN攻击,有什么办法防御SYN攻击

自进入数字化互联网时代&#xff0c;网络技术给我们带来了许多服务&#xff0c;为人们的生活增添了许多便利。但同时&#xff0c;网络安全问题也日益凸显&#xff0c;其中DDoS攻击&#xff0c;即分布式拒绝服务攻击&#xff0c;已经成为一种常见的网络威胁。这种攻击方式通过控…

Python爬取公众号封面图(零基础也能看懂)

&#x1f4da;博客主页&#xff1a;knighthood2001 ✨公众号&#xff1a;认知up吧 &#xff08;目前正在带领大家一起提升认知&#xff0c;感兴趣可以来围观一下&#xff09; &#x1f383;知识星球&#xff1a;【认知up吧|成长|副业】介绍 ❤️感谢大家点赞&#x1f44d;&…

文献速递:深度学习胰腺癌诊断--深度学习算法用于从疾病轨迹预测胰腺癌风险

文献速递&#xff1a;深度学习胰腺癌诊断--深度学习算法用于从疾病轨迹预测胰腺癌风险 麦田医学 美好事物中转站 2024-04-02 14:36 Title 题目 A deep learning algorithm to predict risk of pancreatic cancer from disease trajectories 深度学习算法用于从疾病轨迹预测…

Redis 客户端

Redis 客户端 客户端-服务器结构 Redis 同 Mysql 一样&#xff0c;也是一个客户端-服务器结构的程序&#xff0c;结构如下图&#xff1a; 注&#xff1a;Redis 客户端和服务器可以在同一个主机上&#xff0c;也可以在不同主机上 Redis 客户端的多种形态 自带的命令行客户端&…

HTML:表单

案例&#xff1a; <!DOCTYPE html> <html> <head><meta charset"UTF-8"><title>报名表</title> </head> <body><form action"demo/welcome.php" method"post">名字&#xff1a;<inpu…

【经典算法】LeetCode25:K 个一组翻转链表(Java/C/Python3,Hard)

#算法 目录 题目描述思路及实现方式一&#xff1a;递归思路代码实现Java 版本C 语言版本Python3 版本 复杂度分析 方式二&#xff1a;迭代和原地反转思路代码实现Java 版本C 语言版本Python3 版本 复杂度分析 总结相似题目 标签&#xff1a;链表、递归 题目描述 给你链表的头…