这是我参与「第四届青训营」笔记创作活动的的第8天
为什么
- 静态类型+弱类型
- 动态类型:执行时匹配类型
- 静态类型:提前(编译时)匹配类型
- 弱类型:执行时类型可以转换
- 可读可维护,包含与兼容所有Js特性,支持渐进式引入和升级
基本语法
基础数据类型
- 通过var x : type = data定义
- string、number、boolean、null、undefined
对象数据类型
- var obj : type = {xxx}
函数
-
function add(x:number,y:number):number{xxx};
-
function add(x:number,y:number)=>number{xxx};
-
interface IMult{
(x:number,y:number):number;
}
const mult :Imult = (x,y)=>x*y;
-
函数可以重载(同名不同参)
数组
- type IArr1 = number[];
- type IArr2 = Array<string|number>
- type IArr3 = [number,number]//元组
其他类型
- any任意
- void空
- enum枚举类型,支持正反映射
- 泛型
泛型
-
不预先指定具体类型,使用时再指定
-
数组Array< T >
-
class iMan< T >{
instance T
}
-
< T extends string >限制泛型必须符合字符串
-
< T = number >指定默认类型
别名和断言
-
type xxx = Array<{
key:string,
[objkey:string]:any
}>
用xxx指代类型
-
通过as关键字断言结果是正确的类型以此通过编译
字面量
使用|指定固定取值
- var x = 1|2|3,只能取1,2,3
高级类型
联合交叉类型
type IBookList = Array<{
author:string;
} &({
type:"history";
range:string;
}|{
type:"story";
theme:string;
})>
//A|B表示值是几种类型之一
//A&B表示多种类型堆叠到一起
类型保护与守卫
function getISIA(arg:IA|IB):arg is IA{
return !!(arg as IA).a
}
-
返回一个类型谓词,生效于子作用域
-
当然也可以通过typeof或instanceof来进行保护和守卫
高级类型
type IPartial<T extends Record<string,any>> = {
[P in keyof T]?:T[P]
}
type IKey =keyof {a:string;b:number}
- 关键字keyof返回对象中key组成的字符串字面量
- in相当于取值字符串字面量中的一种可能,配合泛型则表示每个key
- ?表示可选
type IDelayCall = <T extends ()=>any>(func:T)=>ReturnType<T>;
type IReturnType<T extends (...args:any)=>any> = T extends (...args:any)=>infer R ? R:any
- extends 跟随泛型出现表示类型推断(匹配),可类比为三元表达式
- T === 判断类型?类型A:类型B
- infer出现在类型推断中,表示定义类型变量,可用于指代类型
- 本例中意思是如果命中T就是命中的R,否则是any
关于TS,我的想法
- ts本身是为了约束规范而出现的
- 如果用的好,TS就是个很好地工具
- 然而再好的约束也应该有良好的编程习惯作为辅助,否则ts只会阻碍编码