【前端】深入浅出 - TypeScript 的详细讲解

TypeScript 是一种静态类型编程语言,它是 JavaScript 的超集,添加了类型系统和编译时检查。TypeScript 的主要目标是提高大型项目的开发效率和可维护性。本文将详细介绍 TypeScript 的核心概念、语法、类型系统、高级特性以及最佳实践。
在这里插入图片描述

1. TypeScript 基础
1.1 什么是 TypeScript

TypeScript 是由 Microsoft 开发的一种开源编程语言,它扩展了 JavaScript,增加了静态类型系统和类、接口等面向对象的特性。TypeScript 代码在编译时会被转换为纯 JavaScript 代码,可以在任何支持 JavaScript 的环境中运行。

1.2 安装 TypeScript

要开始使用 TypeScript,首先需要安装 TypeScript 编译器。可以通过 npm(Node.js 包管理器)来安装:

npm install -g typescript

安装完成后,可以使用 tsc 命令来编译 TypeScript 文件:

tsc myFile.ts
1.3 基本语法

TypeScript 的基本语法与 JavaScript 非常相似,但增加了一些类型注解。

1.3.1 变量声明

在 TypeScript 中,可以使用 letconst 关键字来声明变量,并指定其类型。

let message: string = "Hello, TypeScript!";
const pi: number = 3.14;
1.3.2 函数声明

函数可以有参数类型和返回类型注解。

function add(a: number, b: number): number {return a + b;
}
1.3.3 类型推断

TypeScript 支持类型推断,编译器可以根据赋值语句推断变量的类型。

let message = "Hello, TypeScript!"; // 类型推断为 string
2. 类型系统
2.1 基本类型

TypeScript 支持以下基本类型:

  • boolean
  • number
  • string
  • null
  • undefined
  • any
  • void
  • never
  • object
  • array
  • tuple
  • enum
2.1.1 数组

数组类型可以通过在元素类型后面加上 [] 来表示。

let numbers: number[] = [1, 2, 3];
2.1.2 元组

元组是具有固定类型的数组。

let tuple: [string, number] = ["TypeScript", 2012];
2.1.3 枚举

枚举类型用于定义一组命名的常量。

enum Color { Red, Green, Blue }
let color: Color = Color.Red;
2.2 复杂类型
2.2.1 对象类型

可以使用接口(Interface)或类型别名(Type Alias)来定义对象类型。

interface Person {name: string;age: number;
}type Person = {name: string;age: number;
};let person: Person = { name: "Alice", age: 30 };
2.2.2 泛型

泛型允许你在定义函数、接口或类的时候,不预先指定具体类型,而在使用的时候再指定类型。

function identity<T>(arg: T): T {return arg;
}let result = identity<string>("Hello");
2.3 联合类型和交叉类型
2.3.1 联合类型

联合类型表示一个值可以是几种类型之一。

let value: string | number = "Hello";
value = 42;
2.3.2 交叉类型

交叉类型是将多个类型合并为一个类型。

interface A {a: string;
}interface B {b: number;
}let ab: A & B = { a: "Hello", b: 42 };
3. 高级特性
3.1 类和接口
3.1.1 类

TypeScript 支持类,可以定义属性、方法和构造函数。

class Animal {name: string;constructor(name: string) {this.name = name;}move(distance: number = 0) {console.log(`${this.name} moved ${distance}m.`);}
}let dog = new Animal("Dog");
dog.move(10);
3.1.2 接口

接口用于定义对象的结构。

interface Animal {name: string;move(distance: number): void;
}class Dog implements Animal {name: string;constructor(name: string) {this.name = name;}move(distance: number) {console.log(`${this.name} moved ${distance}m.`);}
}let dog: Animal = new Dog("Buddy");
dog.move(10);
3.2 装饰器

装饰器是一种特殊类型的声明,可以被附加到类声明、方法、访问器、属性或参数上。装饰器使用 @expression 这种形式,其中 expression 求值为一个函数,该函数会在运行时被调用,被装饰的声明信息做为参数传入。

3.2.1 类装饰器

类装饰器用于修改或增强类的行为。

function readonly(target: any, propertyKey: string, descriptor: PropertyDescriptor) {descriptor.writable = false;
}class Example {@readonlyname: string = "Example";@readonlygetName(): string {return this.name;}
}let example = new Example();
console.log(example.getName()); // Output: Example
example.name = "NewName"; // TypeError: Cannot assign to read only property 'name' of object '#<Example>'
3.2.2 方法装饰器

方法装饰器用于修改或增强类的方法。

function enumerable(value: boolean) {return function (target: any, propertyKey: string, descriptor: PropertyDescriptor) {descriptor.enumerable = value;};
}class Example {@enumerable(false)getName(): string {return "Example";}
}for (let key in new Example()) {console.log(key); // No output
}
3.3 模块

模块用于组织和封装代码,防止命名冲突。

3.3.1 导入和导出

可以使用 importexport 关键字来导入和导出模块。

// math.ts
export function add(a: number, b: number): number {return a + b;
}export function subtract(a: number, b: number): number {return a - b;
}// app.ts
import { add, subtract } from './math';console.log(add(1, 2)); // Output: 3
console.log(subtract(5, 3)); // Output: 2
3.3.2 默认导出

可以使用 default 关键字来导出默认值。

// math.ts
export default function add(a: number, b: number): number {return a + b;
}// app.ts
import add from './math';console.log(add(1, 2)); // Output: 3
4. 类型推断和类型断言
4.1 类型推断

TypeScript 可以根据上下文自动推断变量的类型。

let message = "Hello, TypeScript!"; // 类型推断为 string
4.2 类型断言

类型断言允许你覆盖编译器的类型推断,强制指定一个类型。

let someValue: any = "This is a string";let strLength: number = (someValue as string).length;
let strLength2: number = (<string>someValue).length;
5. 工具类型

TypeScript 提供了一些内置的工具类型,用于在类型级别进行操作。

5.1 keyof

keyof 操作符用于获取对象类型的所有键的联合类型。

interface Person {name: string;age: number;
}type K = keyof Person; // "name" | "age"
5.2 typeof

typeof 操作符用于获取变量的类型。

let message: string = "Hello, TypeScript!";
type MessageType = typeof message; // string
5.3 Pick

Pick 工具类型用于从一个类型中选择一部分属性。

interface Person {name: string;age: number;location: string;
}type NameAndAge = Pick<Person, "name" | "age">;
5.4 Record

Record 工具类型用于创建一个对象类型,其键和值的类型分别为两个参数。

type PageInfo = Record<string, string>;let page: PageInfo = {title: "Home",url: "/",
};
6. 配置文件

TypeScript 项目通常使用 tsconfig.json 文件来配置编译选项。

{"compilerOptions": {"target": "ES6","module": "commonjs","strict": true,"esModuleInterop": true,"outDir": "./dist"},"include": ["src/**/*"],"exclude": ["node_modules"]
}
6.1 常用编译选项
  • target:指定编译后的 JavaScript 版本。
  • module:指定模块系统的类型。
  • strict:启用严格类型检查。
  • esModuleInterop:允许从 CommonJS 模块中导入 ES 模块。
  • outDir:指定编译输出目录。
  • include:指定包含的文件路径。
  • exclude:指定排除的文件路径。
7. 最佳实践
7.1 保持类型一致性

在大型项目中,保持类型的一致性非常重要。可以通过定义通用的接口和类型别名来确保类型的一致性。

interface User {id: number;name: string;email: string;
}function createUser(user: User): User {// ...
}
7.2 使用严格模式

启用严格模式可以捕获更多的类型错误,提高代码质量。

{"compilerOptions": {"strict": true}
}
7.3 使用 TypeScript 与框架结合

TypeScript 可以与各种前端框架和库结合使用,如 React、Vue 和 Angular。这些框架和库通常提供了 TypeScript 的类型定义文件,可以方便地进行类型检查。

7.3.1 React with TypeScript
import React from 'react';interface Props {name: string;
}const HelloWorld: React.FC<Props> = ({ name }) => {return <div>Hello, {name}!</div>;
};export default HelloWorld;
7.3.2 Vue with TypeScript
<template><div>Hello, {{ name }}!</div>
</template><script lang="ts">
import { defineComponent } from 'vue';interface Props {name: string;
}export default defineComponent({props: {name: {type: String,required: true,},},setup(props: Props) {return {name: props.name,};},
});
</script>
8. 示例代码

以下是一些综合示例,展示了如何在 TypeScript 中使用不同的特性和最佳实践。

8.1 基本类型和函数
let message: string = "Hello, TypeScript!";
let pi: number = 3.14;function add(a: number, b: number): number {return a + b;
}console.log(add(1, 2)); // Output: 3
8.2 类和接口
interface Animal {name: string;move(distance: number): void;
}class Dog implements Animal {name: string;constructor(name: string) {this.name = name;}move(distance: number) {console.log(`${this.name} moved ${distance}m.`);}
}let dog: Animal = new Dog("Buddy");
dog.move(10);
8.3 泛型
function identity<T>(arg: T): T {return arg;
}let result = identity<string>("Hello");
console.log(result); // Output: Hello
8.4 装饰器
function readonly(target: any, propertyKey: string, descriptor: PropertyDescriptor) {descriptor.writable = false;
}class Example {@readonlyname: string = "Example";@readonlygetName(): string {return this.name;}
}let example = new Example();
console.log(example.getName()); // Output: Example
example.name = "NewName"; // TypeError: Cannot assign to read only property 'name' of object '#<Example>'
8.5 模块
// math.ts
export function add(a: number, b: number): number {return a + b;
}export function subtract(a: number, b: number): number {return a - b;
}// app.ts
import { add, subtract } from './math';console.log(add(1, 2)); // Output: 3
console.log(subtract(5, 3)); // Output: 2
9. 总结

TypeScript 是一种强大的静态类型编程语言,它扩展了 JavaScript,增加了类型系统和类、接口等面向对象的特性。通过理解 TypeScript 的核心概念、语法、类型系统、高级特性以及最佳实践,开发者可以更高效地使用 TypeScript 构建高质量的大型项目。本文详细讲解了 TypeScript 的各个方面,希望对你理解和使用 TypeScript 有所帮助。

附录

  • TypeScript 官方文档:TypeScript 文档
  • TypeScript Playground:TypeScript Playground
  • MDN Web 文档:TypeScript 简介

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

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

相关文章

【Linux】Linux环境基础开发工具使用(下)

【Linux】Linux环境基础开发工具使用(下) &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;Linux&#x1f34a; &#x1f33c;文章目录&#x1f33c; 4. Linux编辑器--gcc /g的使用 4.1 背景知识 4.2 gcc如何完成 4.2.1 预处理 4.2.2 编…

GPU性能测试,环境搭建笔记,transformers/huggingface_hub改国内源,BertLayer import 报错

代码&#xff0c;以及测试方案使用的是沐神的代码 github的代码&#xff1a; 1. 环境搭建 首先是安装torch 这是我的pytorch版本 pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu124使用pip指令安装transformers transformers…

PR剪辑视频去重消重色彩叠加特效模板

采用现代设计&#xff0c;灵感来自鲜艳的色彩和动态的灯光效果。包含颜色控制选项&#xff0c;能够轻松地调整效果以匹配您的视频风格。具有图像和视频替换功能。 易用性&#xff1a;适合所有经验水平的用户&#xff0c;包括初学者。 调色板自定义&#xff1a;完全控制颜色以匹…

采购管理软件选择攻略:别忽视这些注意事项

企业在选择采购管理软件时必须谨慎&#xff0c;因为这直接关系到简化采购流程、成本控制、风险降低和效率提升等多个方面。面对内众多的软件选项和竞争目标&#xff0c;采购团队可能难以做出正确的选择。别担心&#xff0c;本文将提供一些建议和注意事项。 采购管理软件的重要性…

关于 npm 更新镜像源问题

npm&#xff08;Node Package Manager&#xff09;&#xff0c;是一个NodeJS包管理和分发工具&#xff0c;已经成为了非官方的发布Node模块&#xff08;包&#xff09;的标准。&#xff09; 查看当前npm版本 npm -v 10.9.0 执行以下命令报错 npm install --registryhttp…

【OceanBase 诊断调优】—— OceanBase 数据库统计信息被禁用,状态为 broken 的原因和解决方法

问题现象 因为人为因素导致部分统计信息函数未安装&#xff0c;自动统计信息触发执行长期失败。重新安装统计信息相关函数后&#xff0c;发现仍然无法正常自动统计信息收集&#xff0c;统计信息状态为 broken。 问题原因 统计信息 JOB 收集失败次数达到 16 次会直接禁用 JOB …

2024腾讯云双十一必抢清单:省钱、省心、省力的购买攻略

一、前言 大家好&#xff0c;我是 Neo&#xff01;一年一度的双十一购物狂欢节又到了&#xff01;在这个特别的日子&#xff0c;腾讯云也推出了超值的优惠活动。最近我正好在做自己的小程序项目&#xff0c;需要用到服务器&#xff0c;特意关注了这次活动&#xff0c;看看有没…

业财税深度融合,金鹰国际集团以数字化打造硬实力

数字经济时代&#xff0c;企业数字化转型已成必然&#xff0c;越来越多的企业踏浪前行&#xff0c;加速探索全领域的数字化转型&#xff0c;获得竞争优势。数字化技术的快速发展也加速了税收征管改革进程&#xff0c;财务数字化成为企业转型升级的有力抓手&#xff0c;助力优化…

Spring Boot 多环境开发配置详解:Profiles 的使用指南

目录 前言1. Profiles 简介1.1 什么是 Profiles&#xff1f;1.2 Profiles 的应用场景 2. 单文件配置方式2.1 使用三横杠 --- 分隔配置2.2 指定哪个环境的配置生效 3. 多文件配置方式3.1 配置文件的创建与命名3.2 多文件配置的优点 4. Profiles 分组管理4.1 Profile 分组的配置4…

emp.dll文件丢失的几种方法-常见问题

emp.dll文件在Windows系统中扮演着重要的角色&#xff0c;其作用不仅限于单一的应用程序或游戏。以下是emp.dll在系统中的几种作用&#xff1a; 图形渲染与游戏支持&#xff1a;emp.dll可能集成了高效的渲染引擎&#xff0c;支持复杂的3D图形和动画&#xff0c;为玩家提供沉浸…

永久免费!星火大模型接口源码分享(支持上下文、连续对话和历史对话保存)

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 星火大模型 📒🌟 接口功能📜 源码分享🎯 使用方法⚓️ 相关链接 ⚓️📖 介绍 📖 你是否在寻找一款国产的、永久免费的大模型接口?想要在自己的项目中轻松集成强大的自然语言处理能力?今天,将为你分享一份免费的星…

小型内衣洗衣机哪个牌子好?五大超值优等品速来围观!

小型洗衣机的存在无疑是懒人的福音&#xff0c;它帮助了许多忙碌的人们解决了洗衣烦恼。尤其对于年龄较小的婴幼儿需要勤换衣、洗衣的时候&#xff0c;它的功能就显得尤为重要了&#xff0c;同时还能够用于清洗大人的内衣裤、袜子这一系列的贴身衣物。小型洗衣机通常用于宿舍、…

取代产品岗,又一新兴岗位在崛起!这才是产品经理未来5年最好的就业方向!

这是我入行产品经理的第1007天&#xff1a; 每天都是整理需求、开会、写文档、协调资源 被开发、运营diss一通&#xff0c;顺便为产品“背个锅” 熬夜加班做出来的产品&#xff0c;业务团队还是不愿意用…… 更让人头秃的是&#xff0c;干了3年&#xff0c;好像到了“职…

打造自己的RAG解析大模型:(可商用)智能文档服务上线部署

通用版面分析介绍 版面解析是一种将文档图像转化为机器可读数据格式的技术&#xff0c;广泛应用于文档管理和信息提取等领域。通过结合OCR、图像处理和机器学习&#xff0c;版面解析能够识别文档中的文本块、图片、表格等版面元素&#xff0c;最终生成结构化数据&#xff0c;大…

Spring

1、Spring框架中单例bean是线程安全的吗&#xff1f; 不是线程安全的。当多用户同时请求一个服务时&#xff0c;容器会给每个请求分配一个线程&#xff0c;这些线程会并发执行业务逻辑。如果处理逻辑中包含对单例状态的修改&#xff0c;比如修改单例的成员属性&#xff0c;就必…

MathGPT的原理介绍,在中小学数学教学的应用场景,以及代码样例实现

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下MathGPT的原理介绍&#xff0c;在中小学数学教学的应用场景&#xff0c;以及代码样例实现。MathGPT的核心架构是一个精心设计的多层次系统&#xff0c;旨在有效处理复杂的数学问题。其主要组成部分包括 数学知识图谱…

【Linux】man 手册的使用指南

man 手册的使用指南 man手册中文版上传至资源&#xff08;用心整理&#xff0c;感谢理解&#xff01;&#xff09; man手册官方下载链接&#xff1a;https://mirrors.edge.kernel.org/pub/linux/docs/man-pages/ man 手册页&#xff1a;https://linux.die.net/man/ Linux man…

机器学习分析scRNA-seq解析急性髓系白血病中的疾病和免疫过程

急性髓性白血病&#xff08;AML&#xff0c;Acute myeloid leukemia&#xff09;是一种存在于复杂微环境中的疾病。作者基于scRNA-seq分析了来自40例骨髓抽吸donor的38,410个细胞&#xff0c;包括16例AML患者和5例健康donor。然后&#xff0c;应用机器学习分类器来区分恶性细胞…

【缓存策略】你知道 Write Back(回写)这个缓存策略吗?

&#x1f449;博主介绍&#xff1a; 博主从事应用安全和大数据领域&#xff0c;有8年研发经验&#xff0c;5年面试官经验&#xff0c;Java技术专家&#xff0c;WEB架构师&#xff0c;阿里云专家博主&#xff0c;华为云云享专家&#xff0c;51CTO 专家博主 ⛪️ 个人社区&#x…

1小时构建Vue3知识体系-Vue的响应式,让数据动起来

本文转载自&#xff1a;https://fangcaicoding.cn/course/12/62 大家好&#xff01;我是方才&#xff0c;目前是8人后端研发团队的负责人&#xff0c;拥有6年后端经验&3年团队管理经验。 系统学习践行者&#xff01;近期在系统化输出前端入门相关技术文章&#xff0c;期望能…