这是我参与「第五届青训营 」伴学笔记创作活动的第4天。
为什么什么是Typescript?
Typescript是静态类型、弱类型的语言。
动态类型
在代码执行时才会进行类型匹配。
静态类型
在编译阶段就能确定每个变量的类型。
好处
- 可读性强:基于语法解析TSDoc,ide增强
- 可维护性增强:在编译阶段暴露大部分错误。
- 多人合作的大型项目中,获得更好的稳定性和开发效率
JS的超集
- 包含于兼容所有Js特性,支持共存
- 支持渐进式引入与升级
基本语法
基础数据类型
string、number、boolean、null、undifined
对象类型
- 只读属性:关键字readonly加在属性名前面,约束属性不可在对象初始化外赋值
- 可选属性:“?”加在属性名与“:”之间,定义该属性可以不存在
- 任意属性:any,约束所有对象属性都必须是该属性的子类型 类型:书写建议I开头表示这是一个类型。
函数类型
ts写法1:
function fn(x:number(参数类型),y:number(参数类型)):number(返回值类型){ return x*y }
const fn:(x:参数类型,y:参数类型)=>返回值类型=(x,y)=>x*y
ts写法2:
interface IMult{ (x:number(参数类型),y:number(参数类型)):number(返回值类型); }
const mult:IMult = (x,y)=>x*y
函数重载
在同一个作用域内,有多个函数名相同,但形参列表不同,返回值无关。
数组类型
表示方法
- 类型+方括号:type arr1 = number[]
- 泛型表示:type arr2 = Array<number|string|Record<string,number>>
- 元组表示:type arr3 = [number,number,string,string]
- 接口表示:type arr4 = interface IArr4{[key:number]:any;}
补充类型
- 空类型(void):表示无赋值
- 任意类型(any):是所有类型的子类型
- 枚举类型(enum):支持枚举值到枚举名的正、反向映射
- 泛型: 不预先指定具体的类型,而在使用的时候再指定类型的一种特性。
泛型约束(extends)
例:限制泛型必须符合字符串
type arr = <T extends string>(target:T)=>T[];
关键字extends跟随泛型出现时,表示类型推断,其表达可类比三元表达式
泛型参数默认类型
例:type arr<T=string>=(target:T)=>T[]
类型别名
type关键字定义别名类型
类型断言
as关键字,断言变量是否为正确类型
高级类型
联合/交叉类型
- 联合类型:ia|ib;联合类型表示一个值可以是几种类型之一(类似或)
- 交叉类型:ia&ib;交叉类型表示多种类型叠加到一起成为一种类型,它包含了所需的所有类型的特性。
类型保护与类型守卫
类型保护
访问联合类型时,出于程序安全,仅能访问联合类型中交集部分。
类型守卫
定义一个函数,他的返回值是一个类型谓词,生效范围为子作用域。