当前位置: 首页 > news >正文

【TypeScript学习】TypeScript基础学习总结一

学习TypeScript基础的一些总结回顾。跟着tianyu老师学的课程,大部分内容跟课件一致

1. TypeScript与JavaScript相较
  1. TS需要严格声明数据的类型,提升了代码的规范性但同时也减少了代码的灵活性;
  2. TS具备静态类型检测的能力,即在代码编译运行前能够对代码的一些错误进行检查提醒,减少代码运行时发生错误的概率;
  3. 相同的功能下TS的代码量多于JS,但是TS在后期更易于维护

浏览器并不能直接运行TypeScript,TS在运行之前需要预编译成JS代码

3.TypeScript的类型

ts具有主动推断类型的能力,如果定义一个变量为数字,ts会将这个值推断成number类型;如果只定义了一个变量但是不赋值,ts会将其推断成any类型

(1)基本类型

TypeScript包含JavaScript中的数据类型

  • number
  • string
  • boolean
  • symbol
  • undefined
  • null
  • BigInt
  • object (Array, function, Error, Date…)

基本数据类型中需要区分一下stringStringnumberNumberbooleanBoolean 是不一样的, 通常使用小写,大写是对应的包装对象

(2) TypeScript新增数据类型

1. any: 表示数据可以是任意类型,ts放弃了对声明为any的变量的类型检查, 因此声明为any的变量可以赋任意类型的值,同样也可以赋值给任意类型

let a: any
a = 1
a = 'hello'
a = false
// 以上赋值都是可以的
let an: any
an = 'hello'let num: number
num = an
console.log(typeof num); // string
console.log(num); // 'hello'

2. unknown: 表示数据类型暂时不确定,声明为unknown的变量可以赋任意类型的值,但是不能赋值给任何类型的值除非事先确定了变量的类型(通过if判断/断言

我目前理解的断言是把a看作b的类型(string) 赋值给b, 但是a如果原来是boolean,b还是会被赋值成boolean

let a:unknown
a = 12
a = 'hello'
a = false
// 以上赋值都是可以的
console.log(typeof a); // boolean
b = a; // 这边ts的静态检查会检查出错
console.log(a,b);

规范后的写法:

let a: unknown
a = 12
a = 'hello'let b: string
// 1.逻辑判断
if(typeof a === 'string') {b = a
}
// 2.两种断言的写法:我目前理解的断言是把a看作b的类型(string) 赋值给b
// 但是a如果原来是boolean,b还是会被赋值成boolean
b = a as string
b = <string> a

3.void:表示空。 空值只有undefined与之对应。声明为void的变量只能赋值为undefined,但是意义不大。通常用于限制函数返回值, 并且不能对返回值有任何操作
返回值限定为void和返回值限定为undefined的函数区别就在于前者不能对返回值有操作

let un: void
// un = null // 会检查出错
// un = '' // 会检查出错
un = undefinedlet voidFun = (): void=>{console.log('一个返回限制为void的函数')return undefined // 要写return的话,只能写return undefined 或 return 
}

4.never:表示不是任何值, 一般是ts推断出某个值没在任何范围。用于限制函数返回值时,通常在需要抛出异常,不需要返回值的情况。

5. object和Object,两者的涵盖范围较大。用object声明的变量,可用来赋值给除基础数据类型的数据。而Object范围更大,用来表示除undefinednull的值(所有可以调用到Object的值)

  • 对象定义方法

tips: 可选链形式以及索引签名, 索引签名让对象在声明时先占个坑位,表示允许对象中定义更多其他属性

// 声明方式:属性之间可以用';'分隔,也可以用','分隔
//          当属性各占一行的时候也可以不用分隔符
//          一个对象名只能声明一次但是可以多次赋值
let student1 : {id: string;name: string;age?: number // 可选链形式,表示定义的student,可以有age属性也可以没有。但是上面两者必须要有
}
let student2 : {id: string,name: string,age?: number 
}//对象的赋值,属性之间必须用','分开
student = {id: '00001',name: 'no_name'
}// 索引签名
let student3 : {id: stringname: stringage?: number [key:string]:any // 指定属性名的类型和属性值的类型就行
}
student3 = {id: '00002',name: 'no_name2',gender: '男', // 可以多次定义未知的属性grade: '3'
}
  • 函数指定类型

在声明函数之前指定函数的参数类型和返回值类型,可减少类型推断带来的不确定性

let countSum: (x:number, y:number) => number
countSum = function (x,y){return x+y
}

我感觉常用的函数定义方式还是下面这种。但是这两的区别可能主要还是上面的方式能够实现复用,这块还没有实际体会过~~

function countSum(x:number, y:number):number {return x+y
}
  • 数组声明方式
let arr = [] // 这个是赋值,包含了声明+赋值,ts进行类型推断
let arr1: string[]
let arr2: Array<string> // 泛型

6.tuple
元组,特殊的数组,在声明中可以指定元素的类型。

let arr: [string] // 指定只有一个字符串的数组
let arr1:[string, number] // 第一个元素必须是string,第二个元素必须是number
let arr2:[string, number?]// 第一个元素必须是string,第二个元素可选为空或者number
let arr2: [string, ...number[] ] // 第一个元素必须是string,后面接任意数量的数字

7.enum
枚举类型,对声明为枚举类型的变量,会对其中的属性进行反向映射, 一般枚举类型的变量首字母大写。
(待补充:自增、字符串枚举、常量枚举)

enum Direction = {Up,Down,Left,Right
}
// 反向映射后Direction中的每个值都具有键值对形式
Direction = {Up: 0,Down: 1,Left: 2,Right: 3,0: 'Up',1: 'Down',2: 'Left',3: 'Right'
}

相关文章:

  • 数字教学时代:构建高效在线帮助中心的重要性
  • C嘎嘎入门篇:类和对象(2)
  • 基于JAVA Web的校园快递代领系统设计与实现(源码+定制+文档)
  • 基于单片机的温湿度检测判断系统
  • 无监督算法目标识别-工业异常检测模型Padim+PatchCore的C++_libtorch实现
  • 【Android】浅析六大设计原则
  • 拓扑结构的理解
  • NVIDIA G-Assist 项目:您的游戏和应用程序AI助手
  • 使用docker搭建zk集群
  • 【新闻转载】Storm-0501:勒索软件攻击扩展到混合云环境
  • 【源码+文档+调试讲解】交通信息管理系统
  • 用Python实现运筹学——Day 8: 对偶理论的经济解释
  • 论文阅读【时间序列】ModerTCN (ICLR2024)
  • 堆【数据结构C语言版】【 详解】
  • 打点 - 泛微 E-Cology WorkflowServiceXml
  • [rust! #004] [译] Rust 的内置 Traits, 使用场景, 方式, 和原因
  • 【Linux系统编程】快速查找errno错误码信息
  • 【跃迁之路】【585天】程序员高效学习方法论探索系列(实验阶段342-2018.09.13)...
  • android高仿小视频、应用锁、3种存储库、QQ小红点动画、仿支付宝图表等源码...
  • Linux学习笔记6-使用fdisk进行磁盘管理
  • Mysql5.6主从复制
  • nfs客户端进程变D,延伸linux的lock
  • OpenStack安装流程(juno版)- 添加网络服务(neutron)- controller节点
  • Python代码面试必读 - Data Structures and Algorithms in Python
  • 爱情 北京女病人
  • 安装python包到指定虚拟环境
  • 程序员最讨厌的9句话,你可有补充?
  • 更好理解的面向对象的Javascript 1 —— 动态类型和多态
  • 类orAPI - 收藏集 - 掘金
  • 理解IaaS, PaaS, SaaS等云模型 (Cloud Models)
  • 前端性能优化--懒加载和预加载
  • 扫描识别控件Dynamic Web TWAIN v12.2发布,改进SSL证书
  • 深入浅出webpack学习(1)--核心概念
  • 移动端 h5开发相关内容总结(三)
  • 在electron中实现跨域请求,无需更改服务器端设置
  • 东超科技获得千万级Pre-A轮融资,投资方为中科创星 ...
  • ​2021半年盘点,不想你错过的重磅新书
  • # 透过事物看本质的能力怎么培养?
  • #NOIP 2014#Day.2 T3 解方程
  • #Z2294. 打印树的直径
  • $(this) 和 this 关键字在 jQuery 中有何不同?
  • (C#)一个最简单的链表类
  • (八)Spring源码解析:Spring MVC
  • (二)基于wpr_simulation 的Ros机器人运动控制,gazebo仿真
  • (附源码)springboot 房产中介系统 毕业设计 312341
  • (六)什么是Vite——热更新时vite、webpack做了什么
  • (三)SvelteKit教程:layout 文件
  • (原創) 如何優化ThinkPad X61開機速度? (NB) (ThinkPad) (X61) (OS) (Windows)
  • (转)【Hibernate总结系列】使用举例
  • (转载)Google Chrome调试JS
  • ***微信公众号支付+微信H5支付+微信扫码支付+小程序支付+APP微信支付解决方案总结...
  • .NET Core Web APi类库如何内嵌运行?
  • .NET Core6.0 MVC+layui+SqlSugar 简单增删改查
  • .NET MVC之AOP
  • .NET 编写一个可以异步等待循环中任何一个部分的 Awaiter