TypeScript - 利用GPT辅助学习
TypeScript
- 一、基础
- 1. 安装 TypeScript
- 2. 创建你的第一个 TypeScript 文件
- 3. 编译 TypeScript 代码
- 4. 变量声明与类型注解
- 5. 函数与类型注解
- 6. 总结
- 二、进阶
- 常用类型
- 1. 类型别名
- 2. 对象类型
- 3. 类型断言
- 4.`typeof` 操作符
- 高级类型
- 1. 类
- 2. 交叉类型
- 3. 泛型与 `keyof`
- 4. 索引签名类型与 索引查询类型
- 5 映射类型
- 6.总结
- 三、文件类型
- 1. `.ts` 文件 — TypeScript 的“主战场”
- 用途:编写程序代码的地方。
- 示例:
- 2. `.d.ts` 文件 — 类型声明的超级英雄
- 用途:为 JS 提供类型信息
- 示例:
- 3.`.ts` 与 `.d.ts` 文件的关键区别
- 4.如何使用 `.d.ts` 文件
- 5.总结:TS 里的 `.ts` 和 `.d.ts` 文件
本篇由GPT辅助学习TypeScript而来的,仅为简单学习所创,若有疑惑还请去 TypeScript官网进一步了解
一、基础
1. 安装 TypeScript
在开始之前,你需要在你的电脑上安装 TypeScript 编译器。只需要几个步骤,就能拥有它。
步骤 1:安装 Node.js 和 npm 如果你还没有安装 Node.js,快去官网下载安装。Node.js 附带的 npm(包管理器)是我们接下来安装 TypeScript 的工具。
步骤 2:通过 npm 安装 TypeScript
npm install -g typescript
这样就将 TypeScript 安装到了你的机器上。-g 表示全局安装,可以在任何地方使用 tsc 命令。
步骤 3:检查安装是否成功
安装完后,输入以下命令检查 TypeScript 版本:
tsc --version
如果看到版本号,就表示安装成功!🎉
2. 创建你的第一个 TypeScript 文件
步骤 1:创建文件
用你喜欢的文本编辑器(如 VS Code、Sublime Text 等),创建一个文件,命名为 hello.ts。这个 .ts 后缀标志着这是一个 TypeScript 文件。
步骤 2:编写代码
在 hello.ts 文件里,写一些简单的 TypeScript 代码:
let message: string = "Hello, TypeScript!";
console.log(message);
3. 编译 TypeScript 代码
在命令行中,切换到包含 hello.ts 的目录,然后运行以下命令将 TypeScript 代码编译成 JavaScript:
tsc hello.ts
运行后,你会看到同目录下生成了一个 hello.js 文件,内容类似这样:
var message = "Hello, TypeScript!";
console.log(message);
步骤 3:运行 JavaScript 代码
你可以使用 Node.js 来运行编译后的 JavaScript 文件:
node hello.js
你应该会看到控制台输出:
Hello, TypeScript!
4. 变量声明与类型注解
在 TypeScript 中,变量的类型不再是模糊不清的了。你可以在声明变量时指定它们的类型。这是 TypeScript 的超级武器之一!
基本类型
let age: number = 30; // 数字类型
let names: string = "TypeScript"; // 字符串类型
let isActive: boolean = true; // 布尔类型
数组
数组的类型可以用 [] 来表示:
let numbers: number[] = [1, 2, 3]; // 数字数组
let fruits: string[] = ["apple", "banana", "cherry"]; // 字符串数组
或者使用 Array<type>:
let numbers: Array<number> = [1, 2, 3];
元组
元组是一个固定长度和类型的数组:
let person: [string, number] = ["Alice", 25]; // 元组,第一个元素是字符串,第二个是数字
任意类型
有时候,你不确定变量的类型,可以使用 any 来表示:
let anything: any = "Hello"; // 类型可以是任何类型
anything = 42; // 现在是数字了
anything = true; // 现在是布尔类型了
字面量
用于约束变量的值为特定字符串、数字或布尔值的类型。
let direction: "up" | "down" = "up"; // 只能是 "up" 或 "down"
direction = "down"; // OK
direction = "left"; // 错误:不能赋值 "left"
枚举类型(Enums)
枚举用于定义一组具名的常数,通常用于表示一组有限的状态或选项。
enum Direction {Up = "UP",Down = "DOWN",Left = "LEFT",Right = "RIGHT",
}let move: Direction = Direction.Up; // 使用枚举
未知类型
如果你想声明一个不确定的变量类型,但又想要一些检查,可以使用 unknown,它比 any 更安全:
let value: unknown = "hello";
value = 42; // 也可以是数字
5. 函数与类型注解
函数也可以定义参数类型和返回类型。这就是 TypeScript 的类型检查功能,能提前警告你代码中的潜在问题。
函数声明
function greet(name: string): string {return `Hello, ${name}!`;
}let greeting = greet("TypeScript");
console.log(greeting); // 输出 "Hello, TypeScript!"
可选参数
你也可以设置参数为可选的,只需要在参数后加一个问号:
function greet(name: string, age?: number): string {if (age) {return `Hello, ${name}! ${age} `;}return `Hello, ${name}!`;
}console.log(greet("Alice")); // 输出 "Hello, Alice!"
console.log(greet("Bob", 18)); // 输出 "Hello, Bob! 18"
6. 总结
你现在已经有了一个 TypeScript 文件,成功安装了 TypeScript 编译器,并了解了如何声明变量、定义类型和编写简单的函数。是不是感觉有点厉害了?😎
接下来,你可以探索更多高级功能,如 类、接口、泛型、模块 等等,但今天我们就先从基础开始,让你顺利地飞起来!🚀
二、进阶
让我们继续扩展 TypeScript 的神奇世界,一口气包括更多常用类型、类型别名、函数类型、对象类型等,也涵盖一些高级类型,让你的 TypeScript 技能更上一层楼。准备好了吗?我们开始!🚀
常用类型
1. 类型别名
类型别名(Type Aliases)用来给一个类型取个别名,可以让你的代码更简洁易懂。
type StringOrNumber = string | number; // String 或 Number 类型
let data: StringOrNumber = "hello"; // 可以是 string 或 number
data = 42; // 也可以是数字
2. 对象类型
对象类型(Object Types)是用来描述对象的结构,确保对象中的每个属性都有合适的类型。
type Person = {name: string;age: number;
};const person: Person = {name: "Alice",age: 30,
};
let person:{name: string;age: number;} ={name: "Alice",age: 30,
}
3. 类型断言
类型断言(Type Assertions)告诉 TypeScript 编译器,开发者“知道”某个变量的确切类型,通常用于从更宽泛的类型转换为更精确的类型。
let message: any = "Hello, TypeScript!";
let strLength: number = (message as string).length; // 类型断言为 string
4.typeof 操作符
typeof 用于获取变量的类型,通常用于与 类型保护 和 类型推论 配合使用。
let name = "Alice";
let nameType: typeof name = "Bob"; // 类型为 string
高级类型
1. 类
类(Class)是面向对象编程的重要组成部分,TypeScript 中的类提供了更多的功能和类型检查。
class Animal {name: string;constructor(name: string) {this.name = name;}speak() {console.log(`${this.name} makes a sound.`);}
}class Dog extends Animal {speak() {console.log(`${this.name} barks.`);}
}const dog = new Dog("Buddy");
dog.speak(); // 输出 "Buddy barks."
在 TypeScript 中,两个类型如果结构相同,它们是兼容的。
interface Animal {name: string;
}class Dog {name: string;constructor(name: string) {this.name = name;}
}let dog: Dog = new Dog("Buddy");
let animal: Animal = dog; // 兼容,因为 Dog 类符合 Animal 接口的结构
2. 交叉类型
交叉类型(Intersection Types)是将多个类型合并为一个类型,合并后的类型包含了所有类型的成员。
type Person = {name: string;age: number;
};type Employee = {jobTitle: string;
};type EmployeePerson = Person & Employee; // 交叉类型const employee: EmployeePerson = {name: "Alice",age: 30,jobTitle: "Developer",
};
3. 泛型与 keyof
泛型(Generics)允许你定义可以接受任意类型的函数、类、接口等,确保类型安全。
function identity<T>(arg: T): T {return arg;
}let result = identity<string>("Hello!"); // 类型是 string
let numResult = identity<number>(42); // 类型是 number
keyof 用来提取某个对象的所有键,并形成一个类型。
interface Person {name: string;age: number;
}type PersonKeys = keyof Person; // "name" | "age"
4. 索引签名类型与 索引查询类型
索引签名类型(Index Signature Types) 允许你定义可以动态访问的对象类型。
interface Dictionary {[key: string]: string;
}const dict: Dictionary = {hello: "world",foo: "bar",
};
索引查询类型(Index Access Types) 允许你查询对象类型的某个属性的类型。
type NameType = Person["name"]; // 类型是 string
5 映射类型
映射类型(Mapped Types)允许你根据某个类型创建一个新类型,常用于批量修改对象的属性。
type ReadOnly<T> = {readonly [K in keyof T]: T[K];
};interface Person {name: string;age: number;
}const person: ReadOnly<Person> = { name: "Alice", age: 30 };
// person.name = "Bob"; // 错误,属性是只读的
也可以结合 in 操作符来创建新的类型。
type PartialPerson = {[K in keyof Person]?: Person[K]; // 将 Person 中的所有属性变为可选
};
6.总结
现在你已经有了 TypeScript 的常用类型、类型别名、函数类型、对象类型等的全面了解,还可以更深入地理解高级类型如类、交叉类型、泛型、映射类型等。通过这些强大的特性,TypeScript 能够帮助你编写更加灵活、安全且可维护的代码。是不是已经迫不及待要开始动手写更复杂的 TypeScript 项目了呢?🎉
三、文件类型
TypeScript 是个聪明的小家伙,它通过 .ts 和 .d.ts 两种文件类型让我们编写代码时更加得心应手!让我们一个个捋顺清楚,看看它们之间的“微妙”区别吧!🚀
1. .ts 文件 — TypeScript 的“主战场”
.ts 文件就是 TypeScript 的本体,里面包含了你写的所有实现代码。你写的函数、类、变量,甚至所有的类型注解都在这里。可以说它是 TypeScript 的灵魂,是我们“战斗”的地方!💥
用途:编写程序代码的地方。
- 你最常用的文件类型——这里写代码!
- 可以写任何可执行的 TypeScript 代码——函数、类、对象、你想要的一切都在这里!
- 编译成 JavaScript,跑在浏览器或 Node.js 环境中。🎯
示例:
// hello.ts — 你开始写的第一行 TypeScript 代码!🎉function greet(name: string): string {return `Hello, ${name}!`; // 就这么简单,带着热情!
}console.log(greet("Alice")); // 输出: Hello, Alice!
小贴士:
- 运行
tsc hello.ts之后,你会发现编译器生成了hello.js文件,这个文件就是最终执行的 JavaScript 代码。 - 你可以通过
node hello.js来运行它,看看效果如何!🌟
2. .d.ts 文件 — 类型声明的超级英雄
.d.ts 文件就像是 TypeScript 的“隐形助手”——它不会参与执行,但却能让你的代码在幕后更有条理。它专门用来给你的 JavaScript 提供类型信息,帮助 TypeScript 理解“这个东西应该是什么类型”!😎
用途:为 JS 提供类型信息
- 为外部库(那些没有内置 TypeScript 类型的 JavaScript 库)提供类型定义。👑
- 你可以用它来描述 JavaScript 代码的结构,确保 TypeScript 编译器能够正确识别并提供类型检查。📚
- 不包含实际实现代码,只是类型的“地图”。✨
示例:
假设你在用某个 JavaScript 库,里面有个 greet 函数,但它没有 TypeScript 类型信息。怎么办?没关系,来个 .d.ts 文件吧!
// greet.d.ts — 类型定义开始!declare function greet(name: string): string; // 只定义函数签名,没有实现!
这个 .d.ts 文件告诉 TypeScript:“嘿,greet 函数是存在的,而且它接受一个字符串参数并返回一个字符串!”这样 TypeScript 就能通过这个类型信息来为你提供智能提示和类型检查了!✨
3..ts 与 .d.ts 文件的关键区别
| 特性 | .ts 文件 | .d.ts 文件 |
|---|---|---|
| 目的 | 编写 TypeScript 可执行代码,编译成 JavaScript 运行 | 提供类型声明,告诉 TypeScript 其他代码的结构和类型 |
| 内容 | 包含实现代码(函数、类、逻辑等) | 仅包含类型定义,没有实现代码 |
| 编译 | 编译成 .js 文件 | 不编译成 JavaScript 文件,仅用于类型检查 |
| 场景 | 编写程序的核心逻辑、功能等 | 为第三方库提供类型定义,或为 JavaScript 代码添加类型定义 |
4.如何使用 .d.ts 文件
- 为第三方库添加类型定义
你在使用一个没有 TypeScript 类型定义的 JavaScript 库时,怎么办?别担心!只需要通过 @types 包来引入它们的类型声明文件!🎉
举个例子,如果你在用 Lodash(一个 JavaScript 的工具库),并且想用它的类型定义:
npm install @types/lodash
这个命令会安装 Lodash 的类型声明文件,TypeScript 就会知道 Lodash 是怎样工作的,让你享受到类型检查和代码补全的好处!👏
手动为 JavaScript 写声明文件
如果你自己有一些 JavaScript 文件,也可以自己写 .d.ts 文件来为它们添加类型信息。比如你写了一个 utils.js 文件,你可以写一个 utils.d.ts 来描述它的类型:
// utils.d.tsdeclare function formatDate(date: Date): string; // 格式化日期的函数
declare function sum(a: number, b: number): number; // 加法函数MyButton: typeof MyButton;
这样 TypeScript 就知道了 formatDate 和 sum 函数的类型,不用再怕类型错误了!💪
5.总结:TS 里的 .ts 和 .d.ts 文件
.ts文件:你的主战场,里面的代码会被编译为 JavaScript 并运行。它包含了你所有的功能实现,类型注解,甚至你的勇气!🚀.d.ts文件:类型声明的超级英雄,它让 TypeScript 知道其他 JavaScript 文件的类型结构,确保你的代码在没有实际实现的情况下也能进行类型检查。🦸♂️
这两种文件的结合,让 TypeScript 能够发挥最大的优势,既保证代码的灵活性,又确保类型安全。记住,.ts 文件用来写逻辑,.d.ts 文件用来给外部代码“写传单”!😏
相关文章:
TypeScript - 利用GPT辅助学习
TypeScript 一、基础1. 安装 TypeScript2. 创建你的第一个 TypeScript 文件3. 编译 TypeScript 代码4. 变量声明与类型注解5. 函数与类型注解6. 总结 二、进阶常用类型1. 类型别名2. 对象类型3. 类型断言4.typeof 操作符 高级类型1. 类2. 交叉类型3. 泛型与 keyof4. 索引签名类…...
VMware虚拟机迁移到阿里云
VMware虚拟机迁移到阿里云是一个涉及多个步骤的过程,具体如下: 使用阿里云的服务器迁移中心(SMC)进行P2V或V2V迁移。如果是小型应用,可以通过制作镜像文件然后上传至阿里云OSS,并基于该镜像创建ECS实例。对…...
【STM32-学习笔记-15-】MAX7219点阵屏模块
文章目录 MAX7219点阵模块一、MAX7219Ⅰ、 概述Ⅱ、功能特点Ⅲ、引脚功能Ⅳ、典型应用电路Ⅴ、内部组成结构Ⅵ、时序图Ⅶ、寄存器 二、STM32控制点阵屏Ⅰ、程序框图Ⅱ、程序编写①、MAX7219.c②、MAX7219.h③、MAX7219_Img.h④、main.c MAX7219点阵模块 一、MAX7219 Ⅰ、 概述…...
高并发内存池_CentralCache(中心缓存)和PageCache(页缓存)申请内存的设计
三、CentralCache(中心缓存)_内存设计 (一)Span的创建 // 页编号类型,32位下是4byte类型,64位下是8byte类型 // #ifdef _WIN64 typedef unsigned long long PageID; #else _WIN32 typedef size_t PageI…...
elementUI Table组件实现表头吸顶效果
需求描述 当 table 内容过多的时候,页面上滑滚动,表头的信息也会随着被遮挡,无法将表头信息和表格内容对应起来,需要进行表头吸顶 开始编码💪 环境:vue2.6、element UI step1: 给el-table__h…...
语言模型的价值定位与技术突破:从信息处理到创新认知
标题:语言模型的价值定位与技术突破:从信息处理到创新认知 文章信息摘要: 当前语言模型的核心价值主要体现在信息综合与处理能力上,用户友好的交互界面是其成功关键。在模型计算机制方面,推理能力的实现包括chain-of-…...
微信小程序使用上拉加载onReachBottom。页面拖不动。一直无法触发上拉的事件。
1,可能是原因是你使用了scroll-view的标签,用onReachBottom触发加载事件。这两个是有冲突的。没办法一起使用。如果页面的样式是滚动的是无法去触发页面的onReachBottom的函数的。因此,你使用overflow:auto.来使用页面的某些元素滚动…...
Spring Boot 快速创建项目
目录 一. 创建项目 编辑 二. 项目目录 三. 运行项目 (1) 启动项目 (2) 输出HelloWorld 一. 创建项目 我们以idea专业版为例创建Spring项目: 步骤: (1) File --> New --> Project (2) 配置项目基本信息 (3) 依赖: 需要什么就勾选什么. 我们这里就只勾选一个Spri…...
kafka学习笔记5 PLAIN认证——筑梦之路
在Kafka中,SASL(Simple Authentication and Security Layer)机制包括三种常见的身份验证方式: SASL/PLAIN认证:含义是简单身份验证和授权层应用程序接口,PLAIN认证是其中一种最简单的用户名、密码认证方式&…...
直驱式风电储能制氢仿真模型matlab/simulink
接着还是以直驱式风电为DG中的研究对象,上篇博客考虑的风电并网惯性的问题,这边博客主要讨论功率消纳的问题。 考虑到风速是随机变化的,导致风电输出功率的波动性和间歇性问题突出;随着其应用规模的不断扩大以及风电在电网中渗透率…...
excel批量提取批注
打开excel ALTF11 插入代码 Function GetComment(rng As Range) As StringOn Error Resume NextDim commentText As StringcommentText rng.Comment.TextcommentText Replace(commentText, "rina.farriani:", "")GetC…...
高性能PCIE硬件加密卡:满足大数据时代的安全需求
在大数据时代,数据的海量增长和快速流动带来了前所未有的安全挑战。如何确保数据的机密性、完整性和可用性,成为企业和组织必须面对的重要问题。高性能PCIE硬件加密卡作为一种专业的数据安全解决方案,凭借其卓越的性能和安全性,正…...
C语言小项目——通讯录
功能介绍: 1.联系人信息:姓名年龄性别地址电话 2.通讯录中可以存放100个人的信息 3.功能: 1>增加联系人 2>删除指定联系人 3>查找指定联系人的信息 4>修改指定联系人的信息 5显示所有联系人的信息 6>排序(名字&…...
uni-app连接EventSource
前言 uniapp默认是不支持event-source,这里是借助renderjs进行SSE连接 正文 引入event-source-polyfill 这里演示的是直接将代码下载到本地进行引入 下载地址 把里面的eventsource.min.js文件放到项目中的static文件夹 项目封装event-source.vue组件 <templ…...
Spring Boot 实战:轻松实现文件上传与下载功能
目录 一、引言 二、Spring Boot 文件上传基础 (一)依赖引入 (二)配置文件设置 (三)文件上传接口编写 (一)文件类型限制 (二)文件大小验证 ࿰…...
火狐浏览器Firefox一些配置
没想到还会开这个…都是Ubuntu的错 一些个人习惯吧 标签页设置 常规-标签页 1.按最近使用顺序切换标签页 2.打开新标签而非新窗口(讨厌好多窗口) 3.打开新链接不直接切换过去(很打断思路诶) 4.关闭多个标签页时不向我确认 启动…...
[STM32 HAL库]串口中断编程思路
一、前言 最近在准备蓝桥杯比赛(嵌入式赛道),研究了以下串口空闲中断DMA接收不定长的数据,感觉这个方法的接收效率很高,十分好用。方法配置都成功了,但是有一个点需要进行考虑,就是一般我们需要…...
C++入门 详细版
欢迎来到干货小仓库!! 一分耕耘一分收获,离自己的目标越来越近。 passion!passion!!passion!!! 1.命名空间 由于C语言无法避免名字或者函数重复等问题,当有多…...
MIAOYUN信创云原生项目亮相西部“中试”生态对接活动
近日,以“构建‘中试’生态,赋能科技成果转化”为主题的“科创天府智汇蓉城”西部“中试”生态对接活动在成都高新区菁蓉汇隆重开幕。活动分为成果展览、“中试”生态主场以及成果路演洽谈对接三大板块。在成果展览环节,成都元来云志科技有限…...
网络编程 | UDP组播通信
1、什么是组播 在上一篇博客中,对UDP的广播通信进行了由浅入深的总结梳理,本文继续对UDP的知识体系进行探讨,旨在将UDP的组播通信由浅入深的讲解清楚。 组播是介于单播与广播之间,在一个局域网内,将某些主机添加到组中…...
day52 ResNet18 CBAM
在深度学习的旅程中,我们不断探索如何提升模型的性能。今天,我将分享我在 ResNet18 模型中插入 CBAM(Convolutional Block Attention Module)模块,并采用分阶段微调策略的实践过程。通过这个过程,我不仅提升…...
Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...
ABAP设计模式之---“简单设计原则(Simple Design)”
“Simple Design”(简单设计)是软件开发中的一个重要理念,倡导以最简单的方式实现软件功能,以确保代码清晰易懂、易维护,并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计,遵循“让事情保…...
Java 二维码
Java 二维码 **技术:**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...
JVM虚拟机:内存结构、垃圾回收、性能优化
1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...
springboot整合VUE之在线教育管理系统简介
可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生,小白用户,想学习知识的 有点基础,想要通过项…...
Ubuntu Cursor升级成v1.0
0. 当前版本低 使用当前 Cursor v0.50时 GitHub Copilot Chat 打不开,快捷键也不好用,当看到 Cursor 升级后,还是蛮高兴的 1. 下载 Cursor 下载地址:https://www.cursor.com/cn/downloads 点击下载 Linux (x64) ,…...
android RelativeLayout布局
<?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"match_parent"android:gravity&…...
Python 高效图像帧提取与视频编码:实战指南
Python 高效图像帧提取与视频编码:实战指南 在音视频处理领域,图像帧提取与视频编码是基础但极具挑战性的任务。Python 结合强大的第三方库(如 OpenCV、FFmpeg、PyAV),可以高效处理视频流,实现快速帧提取、压缩编码等关键功能。本文将深入介绍如何优化这些流程,提高处理…...
算术操作符与类型转换:从基础到精通
目录 前言:从基础到实践——探索运算符与类型转换的奥秘 算术操作符超级详解 算术操作符:、-、*、/、% 赋值操作符:和复合赋值 单⽬操作符:、--、、- 前言:从基础到实践——探索运算符与类型转换的奥秘 在先前的文…...
