TypeScript入门到精通
学习ts之前,我们首先了解一下我们为什么要学ts,ts是什么?ts比js有不同呢?
TypeScript 是 JavaScript 的一个超集,是由微软开发的自由和开源的编程语言,支持 ECMAScript 6 标准(ES6 教程)。在 JavaScript 的基础上增加了静态类型检查的超集。TypeScript 设计目标是开发大型应用,它可以编译成纯 JavaScript,编译出来的 JavaScript 可以运行在任何浏览器上。
学习ts的好处:提高代码质量、可维护性和开发效率。 它适用于中大型项目、团队协作、长期维护的系统。
1.类型注解:
类型注解时给变量添加类型约束,使变量只能被赋值为约定好的类型,同时可以有相关的类型提示,:string就是类型注解,说明该变量只能被赋值为string类型
变量:
如果声明变量没有设置类型和初始值,类型可以是任意类型,默认初始值为 undefined
- string 表示文本数据 let name: string = "Alice";
- number 表示数字,包括整数和浮点数 let age: number = 30;
- boolean 表示布尔值 true 或 false let isDone: boolean = true;
- array 表示相同类型的元素数组 let list: number[] = [1, 2, 3];
- tuple 表示已知类型和长度的数组 let person: [string, number] = ["Alice", 30];
- enum 定义一组命名常量 enum Color { Red, Green, Blue };
- any 任意类型,不进行类型检查 let value: any = 42;
- void 无返回值(常用于函数) function log(): void {}
- null 表示空值 let empty: null = null;
- undefined 表示未定义 let undef: undefined = undefined;
- object 表示非原始类型 let obj: object = { name: "Alice" };
- unknown 不确定类型,需类型检查后再使用 let value: unknown = "Hello";
数组:
数组被注解为数字类型之后,有两个好处
不仅可以限制变量类型为数组而且可以限制数组成员的类型
不同的类型对应的提示数组的属性和方法也是可以不同的
// 类型[]
let arr:number[] = [1]
console.log(arr);// 数组泛型
let arr1:Array<number> =[2]
console.log(arr1);
联合类型:
可以将多个类型合并为一个类型进行注解
let a1:(string|number)[] = ['1',3]
console.log(a1);let a2:string|number[] = [1] //表示可以存放string或者number类型的数组
console.log(a2);
类型别名type:
通过type关键字可以给写起来比较复杂的类型起一个其他的名字,用来简化和复用类型
type ItemType = (string|number)[]
let a3:ItemType = [1,2]
let a4:ItemType = ['1','2']
console.log(a3);
console.log(a4);
2.函数:
函数类型就是函数添加类型注解,本质上就是给函数的参数和返回值添加类型约束
- 函数参数注解类型之后不但限制了参数的类型还限制了参数为必填
- 函数类型注解类型之后限制了该函数内部return出去的值必须满足类型需求
function add(a:number,b:number){return a+b
}
add(1,2)
返回值:
无返回值void
js中有些函数只有功能没有返回值,此时使用void进行返回值注解,明确表示函数没有返回值
注意事项:在js中如何没有返回值,默认返回的是undefined,在ts中void和undefined不是一回事,undefined在ts中是一种明确的简单类型,如果指定返回值是undefined,那么返回值必须是undefined
console.log("Task done");// 无 return
}
//函数显式返回 undefined
function doTask2(): void {return undefined;
}
//undefined 类型显式返回
function doTask4(): undefined {console.log("Task done");return undefined;
}
函数表达式(箭头函数):
函数表达式的类型注解有两种方式,参数和返回值分开注解和函数整体注解
1. 参数和返回值分开注解
const add1 = (a:number,b:number):number=>{
return a+b
}
add1(1,43)
2. 函数整体注解(只针对于函数表达式)
const add2:Add = (a,b)=>{return a+b
}
add2(1,2)
3.interface接口:
接口的可选设置 概念:通过? 对属性进行可选标注,赋值的时候该属性可以缺失,如果有值必须保证类型满足要求
interface Props{type:stringsize?:string
}let props:Props = {type:'button'
}props = {type:'success',size:'large'
}
继承:
接口的很多属性是可以进行类型复用的,使用extends实现接口继承,实现类型复用
// 定义一个接口,表示一本书的基本信息
interface Book {title: string; // 书名price: number; // 价格
}// 定义一个接口,表示打折后的书籍信息,它继承了 Book 接口
interface DiscountedBook extends Book {discountPrice: number; // 打折后的价格
}// 创建一个符合 DiscountedBook 接口的对象
let myBook: DiscountedBook = {title: "TypeScript 基础教程",price: 100,discountPrice: 80
};
4.字面量类型:
使用js字面量作为类型对变量进行类型注解,这种类型就是字面量类型,字面量类型比普通的类型更加精确
const 是字面量类型而不是string类型!!!
字面量类型在实际应用中通常和联合类型结合起来使用,提供一个精确的可选范围
// 字面量类型
type Gender = '男'|'女'
let gender:Gender = '男'
5.type注解对象:
在ts中对于对象类型注解,除了使用interface之外还可以使用类型别名来进行注解,作用相似
let gender:Gender = '男'
type Person = {name:string,age:number
}let person:Person={name:'张三',age:18
}
type+交叉类型模拟继承:
// type+交叉类型模拟继承
type GoodType = {id:string,price:number
}type DisGoodType = GoodType & {disPrice:number
}let car:DisGoodType = {id:'1',price:100,disPrice:80
}
6.类型推论和any类型:
类型断言:
在ts当中,存在类型推断机制,在没有给变量添加类型注解的情况下,ts也会给变量提供类型
function ADD(a:number,b:number){return a+b
}
const n = ADD(1,2) //会自动推断为number类型
any类型:
变量被注解为any类型之后,ts会忽略类型检查,错误的类型赋值不会报错,也不会有任何提示
let obj:any = {name:'张三'
}
obj.age = 13
obj()
const a:number = obj //不会报错any类型可以赋值给任何类型
7.类型断言:
有些时候开发者比ts本身更清楚当前的类型是什么,可以使用断言(as) 让类型更加精确和具体
同个as进行类型断言获得更加精确的类型
类型断言的注意事项:
类型断言只能够欺骗typescript编译器,无法避免运行时的错误,滥用断言类型可能会导致运行时错误
function log(foo:string|number){console.log((foo as number).toFixed(2))
}
log(100)
log('100')//报错
虽然在编译器上没有报错,但是运行的时候会报错
8.泛型:
interface:
泛型是指在定义接口,函数等类型的时候,不预先指定具体类型,而是在使用的时候再指定类型的一种特性,使用泛型可以复用并且让类型更加灵活
在接口类型的名称后面使用即可声明一个泛型参数,接口里的其他成员都能使用该参数类型
interface ResDate<T>{}
通用思路:
1. 找到可变类型的部分,通过泛型抽象为泛型参数(定义参数)
2. 在使用泛型的时候,把具体类型传入到泛型参数的位置(传参)
// 定义通用响应接口(泛型)
interface ApiResponse<T> {statusCode: number;message: string;payload: T; // 更符合业务场景的命名
}// 定义具体业务数据类型
interface UserProfile {userName: string;userAge: number;
}interface ProductDetails {productId: number;productName: string;
}// 用户数据响应示例
const userResponse: ApiResponse<UserProfile> = {statusCode: 200,message: "操作成功",payload: {userName: "张三",userAge: 18}
};// 商品数据响应示例
const productResponse: ApiResponse<ProductDetails> = {statusCode: 200,message: "数据获取成功",payload: {productId: 1,productName: "高端智能手机"}
};
type:
泛型别名:
在类型别名type的后面使用即可声明一个泛型参数,接口里的其他成员都能使用该参数的类型
type ResData<T> = {}
// 定义通用的 API 响应类型(泛型)
type ApiResponse<T> = {statusCode: number; // 符合 HTTP 状态码命名规范message: string; // 国际通用的消息字段命名payload: T; // 专业术语表示有效数据负载
}// 用户数据实体类型
interface UserProfile {userName: string; // 明确用户名称属性userAge: number; // 明确用户年龄属性
}// 商品数据实体类型
interface ProductInfo {productId: number; // 符合电商领域术语productName: string; // 统一使用 product 前缀
}// 用户数据响应示例
const userDataResponse: ApiResponse<UserProfile> = {statusCode: 200,message: "用户数据获取成功",payload: {userName: "张三",userAge: 18}
};// 商品数据响应示例
const productDataResponse: ApiResponse<ProductInfo> = {statusCode: 200,message: "商品信息查询成功",payload: {productId: 1,productName: "智能家居套装"}
};
泛型函数:
在函数名称的后面使用 即可声明一个泛型参数,整个函数中(参数,返回值,函数体)的变量都可以使用该参数的类型
function fn<T> () {}
需求,设置一个函数createArray,它可以创建一个指定长度的数组,同时将每一项都填充一个默认值(多种类型)
// 泛型函数
function createArray<T>(length:number,value:T){let res = []for(let i = 0; i<length;i++){res[i] = value}return res
}
createArray<number>(2,1)
createArray<string>(2,'hello')
泛型约束:
泛型的特点就是灵活不确定,有些时候泛型函数的内部需要访问一些特定类型数据才有的属性,此时会有类型错误,需要通过泛型约束解决
interface lengthObj{length:number
}
// 如果不继承就会报错
function logLen<T extends lengthObj>(obj:T){console.log(obj.length)
}// logLen(false) //报错--类型boolean不满足lengthObj类型
logLen(['1','2'])
logLen({length:10})
相关文章:

TypeScript入门到精通
学习ts之前,我们首先了解一下我们为什么要学ts,ts是什么?ts比js有不同呢? TypeScript 是 JavaScript 的一个超集,是由微软开发的自由和开源的编程语言,支持 ECMAScript 6 标准(ES6 教程)。在 Ja…...

三、Docker目录挂载、卷映射、网络
目录挂载 如果主机目录为空,则容器内也为空 -v表示目录挂载 冒号前面的是主机上的目录,冒号后面的是docker容器里面的地址 修改主机上的文件,发现docker容器里面的内容也随之改变。 同样修改docker容器里面的内容,主机上的文件…...

迪米特法则 (Law of Demeter, LoD)
定义:迪米特法则(Law of Demeter, LoD):一个软件实体应当尽可能少地与其他实体发生相互作用。 迪米特法则(Law of Demeter,LoD)又叫作最少知识原则(Least Knowledge Principle,LKP),…...

【R语言编程绘图-函数篇】
基础函数绘制 R语言可通过curve()函数直接绘制数学函数图形,无需预先生成数据点。例如绘制正弦函数: curve(sin, from -pi, to pi, col "blue", lwd 2)自定义函数绘制 对于用户自定义函数,需先定义函数表达式: …...

训练自己的yolo模型,并部署到rk3588上
文章目录 1. 训练自己的模型2. pt转onnx3. onnx转rknn4. 后续…… 1. 训练自己的模型 如何训练自己的yolo模型,网络上已经有足够多的教程,这里只简单的描述一下。如果已经有了自己的.pt模型,那么可以直接跳转到第二节。 此处是以检测模型的…...
Leetcode 3556. Sum of Largest Prime Substrings
Leetcode 3556. Sum of Largest Prime Substrings 1. 解题思路2. 代码实现3. 算法优化 题目链接:3556. Sum of Largest Prime Substrings 1. 解题思路 这一题毕竟只是这一次双周赛的第一题,虽然标记为medium的题目,但是思路上还是非常简单…...

以少学习:通过无标签数据从大型语言模型进行知识蒸馏
Learning with Less: Knowledge Distillation from Large Language Models via Unlabeled Data 发表:NNACL-Findings 2025 机构:密歇根州立大学 Abstract 在实际的自然语言处理(NLP)应用中,大型语言模型(…...
鸿蒙OSUniApp 实现带有滑动删除的列表#三方框架 #Uniapp
使用 UniApp 实现带有滑动删除的列表 在移动应用开发中,滑动删除(Swipe to Delete)是一种常见且实用的交互方式,广泛应用于消息、待办、收藏等列表场景。用户只需在列表项上左右滑动,即可快速删除或管理数据。随着 Ha…...

Qt qml Network error问题
最近在学习Qt,需要调用地图,所以用到了QML,但是却遇到了这样的问题 d://qt_project//run//main.qml: Network error 现在我展示一下我的main文件的代码: #include <QApplication> #include <QQuickView> #include &l…...
Prompt工程:解锁大语言模型的终极密钥
Prompt工程:解锁大语言模型的终极密钥 一、引言:Prompt的战略价值重构 在人工智能技术加速渗透的2025年,Prompt(提示词)作为连接人类意图与大语言模型(LLM)的核心接口,其战略地位已…...

Spring Boot微服务架构(六):伪装的微服务有哪些问题?
伪装的微服务有哪些问题? 伪装的微服务架构(即表面上模仿微服务设计,但未真正遵循其核心原则的系统)通常具备以下特征点,这些特征可能导致系统复杂度增加、维护困难或性能下降: 1. 服务间强耦合 …...

恶意npm与VS Code包窃取数据及加密货币资产
60个npm包窃取系统敏感信息 安全研究人员在npm软件包注册表中发现60个恶意组件,这些组件能够收集主机名、IP地址、DNS服务器和用户目录信息,并将其发送至Discord平台控制的终端节点。据Socket安全研究员Kirill Boychenko上周发布的报告显示,…...
Matlab快速上手五十六:详解符号运算里假设的用法,通过假设可以设置符号变量的取值范围,也可以通过假设设置变量属于集合:整数、正数和实数等
1.符号变量中假设的概念 在符号数学工具箱中,符号变量默认范围是全体复数,也就是说,符号运算是在全体复数域进行的,若需要运算中,不使用全体复数域,可以为变量设定取值范围,这就用到了假设&…...
机器学习笔记【Week1】
一、机器学习简介(Introduction) 什么是机器学习? 定义(Tom Mitchell): “A computer program is said to learn from experience E with respect to some task T and performance measure P, if its per…...

什么是3D全景视角?3D全景有什么魅力?
什么是3D全景视角?3D全景视角的全面解析。 3D全景视角,又称为3D全景技术或3D实景技术,是新兴的富媒体技术,基于静态图像和虚拟现实(VR)技术,通过全方位、无死角地捕捉和展示环境,为…...

【Mini-F5265-OB开发板试用测评】按键控制测试
本文介绍了如何使用按键控制 MCU 引脚的输出电平。 原理 由原理图可知 板载用户按键 K1 和 K2 分别与主控的 PB0 和 PB1 相连。 代码 #define _MAIN_C_#include "platform.h" #include "gpio_key_input.h" #include "main.h"int main(void) …...
Debian重装系统后
安装配置java环境 手动安装 下载openJDK:openJDK 设置替代项 sudo update-alternatives --install /usr/bin/java java /opt/jdk-21.0.2/bin/java 1 sudo update-alternatives --install /usr/bin/javac javac /opt/jdk-21.0.2/bin/javac 1 sudo update-alternat…...

每日Prompt:古花卷
提示词 主体对象 一本展开的古画卷 古画卷内呈现的内容 一片微型春秋鲁国,有古代马车,孔子乘坐周游列国,颜回、子路、子贡、曾参紧随其后 古画卷的外观状态 表面已经开裂和风化,呈现出年代感和历史感 与文字描述的首句一致&…...
[学习]C语言指针函数与函数指针详解(代码示例)
C语言指针函数与函数指针详解 文章目录 C语言指针函数与函数指针详解一、引言二、指针函数(函数返回指针)定义与语法典型应用场景注意事项 三、函数指针(指向函数的指针)定义与声明初始化与调用赋值方式调用语法 高级应用回调函数…...

夏季用电高峰如何防患于未“燃”?电力测温技术守护城市生命线
随着夏季来临用电负荷激增,电力系统面临严峻的高温考验,电力测温技术的重要性愈发凸显,电力安全是城市生命线工程的核心环节,电力测温已从"可选功能"升级为"必要的基础安全设施"。通过实时感知、智能分析和快…...
浙大版《Python 程序设计》题目集6-3,6-4,6-5,6-6列表或元组的数字元素求和及其变式(递归解法)
目录 6-3 输入格式: 输出格式: 输入样例: 输出样例: 6-4 输入格式: 输出格式: 输入样例: 输出样例: 6-5 输入格式: 输出格式: 输入样例: 输出样例: 6-6 输入格式: 输出格式: 输入样例: 输出样例: 6-3 第6章-3 列表或元组的数字元素求和 分数 20 全屏浏览 切换布局 作者 陈春晖 …...
Leetcode 3563. Lexicographically Smallest String After Adjacent Removals
Leetcode 3563. Lexicographically Smallest String After Adjacent Removals 1. 解题思路2. 代码实现 题目链接:3563. Lexicographically Smallest String After Adjacent Removals 1. 解题思路 这次的最后一题同样没有自力搞定,简直了…… 这道题还…...

【创造型模式】抽象工厂方法模式
文章目录 抽象工厂方法模式产品族与产品等级结构抽象工厂方法模式的角色和职责抽象工厂方法模式的实现抽象工厂方法模式的优缺点适用场景 抽象工厂方法模式 工厂方法模式引入了“工厂等级结构”,解决了简单工厂方法过分依赖单一工厂的问题。但是工厂方法模式存在的一…...

一台手机怎样实现多IP上网?方法有多种
在数字时代,多IP上网已成为许多手机用户的刚需。本文将详细介绍如何通过不同技术手段实现手机多IP上网,帮助读者根据实际需求选择适合的解决方案。 一、为什么一台手机要实现多IP上网 手机实现多IP上网的典型场景包括: ①防止同一IP操作多个…...
【FFmpeg+SDL】播放音频时,声音正常但是有杂音问题(已解决)
下面这个函数是SDL音频的回调函数(修改后的) void fill_audio(void *udata,Uint8 *stream,int len) {static int cc 0;cc;qDebug()<<QString::fromLocal8Bit("想要填充:%1字节").arg(len)<<cc;AudioOutput* is static_cast<AudioOutput*>(udat…...

Linux 527 重定向 2>1 rsync定时同步(未完)
rsync定时同步 配环境 关闭防火墙、selinux systemctl stop firewalld systemctl disable firewalld setenforce0 vim /etc/SELINUX/config SELINUXdisable515 设置主机名 systemctl set-hostname code systemctl set-hostname backup 配静态ip rsync 需要稳定的路由表和端…...

3DVR拍摄指南:从理论到实践
3DVR拍摄指南:从理论到实践 3D虚拟现实(Virtual Reality,简称VR)作为近年来迅速崛起的高新技术,通过电脑模拟产生一个三维空间的虚拟世界,为使用者提供视觉、听觉乃至触觉的全方位感官模拟,使用户仿佛身临…...
OSI模型中的网络协议
一、电子邮件协议:从SMTP到MIME的扩展 电子邮件系统的核心协议包括SMTP(Simple Mail Transfer Protocol)、POP3(Post Office Protocol)和IMAP(Internet Message Access Protocol),但…...
【C/C++】线程局部存储:原理与应用详解
文章目录 1 基础概念1.1 定义1.2 初始化规则1.3 全局TLS vs 局部静态TLS 2 内存布局2.1 实现机制2.2 典型内存结构2.3 性能特点 3 使用场景/用途3.1 场景3.2 用途 4 注意事项5 对比其他技术6 示例代码7 建议7.1 调试7.2 优化 8 学习资料9 总结 在 C 多线程编程中,线…...
分块查找详解
1、原理 分块查找(Block Search)是一种结合顺序查找与索引查找的算法,适用于数据分块存储且块内无序但块间有序的场景。它通过“分块-建立索引-逐层定位”提高查找效率。 分块查找的核心思想 数据分块 将数据集划分为若干块(子…...