TypeScript的基本使用
安装
npm i typescript -g
编译
tsc TS_fillename
解决TS和JS冲突问题
tsc --init
自动编译
tsc --watch
常见问题
配置文件中设置严格模式三个检查标记
"script" : false;//是否启动严格模式,是下面两种的综合
"noImplicitAny":true;//不启动则允许any类型数据的定义和使用
"scrictNullChecks":true//限制null或undefind的赋值
TS代码存在错误时不进行自动编译
tsc --noEmitOnError --watch
定义显示类型
person:string //类型后面加:(冒号
自动推断类型
类型由第一次赋值时的数据类型决定
降级编译(兼容低版本浏览器)
配置tsconfig.js中的target
//"target":"es2016"
"target":"es5"
配置文件自定义编译入口/出口路径
"rootDir":"./src"//配置文件自定义编译入口路径,
"outDir":"./dist"//配置文件自定义编译出口路径
数组定义的方法
arr : number[ ] = [1,2,3]
//数组里的元素只能是数值类型arr : Array<string> = ['w','a','n']
//数组里的元素只能是数值类型
any类型
- 当你不希望某个特定值导致类型检查错误(紧用所有的类型检查)
限制函数形参和返回值类型
对象类型数据的数据类型定义和限制
联合类型
能够增加数据类型的选择
定义-类型别名
接口
几乎所有的interface定义的类型,都可以通过Type类型别名来定义
- 接口与类型别名的区别:
- 接口和类型别名的拓展
2.向现有的类型中添加字段
类型断言
当我们不知道一个数据的类型是时,可以将数据断言成一个差不多的类型
文字类型的工作方式
数字文字类型的工作方式
布尔值类型的工作方式
方法类型的工作方式
枚举
不常用的原语
类型防护和
-
类型防护:特殊的检查
-
类型缩小:将类型细化为比声明更具体的类型的过程
真值缩小
等值缩小
in操作符缩小
instanceof操作符缩小
分配缩小
控制流分析
类型谓词
受歧视的联合类型
never类型与穷尽性检查
never类型可以分配给每个类型,但没有任何类型可以分配给never(除了never本身以外)
TS函数
- 函数类型表达式
- 调用签名
构造签名
范型函数
范型:两个值之间存在的对应关系
多个范型的定义:
范型参数的限制条件
- 使用受限值
- 指定类型参数
编写优秀通用函数的准则
1.第一种准则的体现:选择firstElement1方法
2.第二种准则的体现:选择filter1方法
3.第三个准则的体现:选择greet2方法
函数的可选参数
普通函数
1.传参数默认值
回调函数的可选参数
函数重载
将重复定义的函数和参数的形式称为函数签名
- 参数不正确问题:
- 参数类型不正确问题:
- 返回类型不正确问题
- 如何编写好的重载
函数内的this声明
箭头函数内不能定义this做参数
需要了解的其他类型
void
object
unknow
never
Function
参数展开运算符
形参展开
实参展开
参数解构
函数返回void类型注意事项
对象
匿名对象
接口命名
类型别名
属性修改器
- 可选属性
- 只读属性
- 索引签名
- 拓展类型
extents:
- 交叉类型
- 接口继承与交叉类型直接的选择
接口同名不同属性会进行并运算,而类型别名不可以(实现类型合并选interface,避免冲突选Type
- 泛型对象类型
不可取:
可取:
类型操纵
从类型中创建类型
泛型
泛型类型
泛型类
泛型约束
泛型约束中使用类型参数
泛型中国使用类类型
keyof类型操作符
typeof类型操作符
索引访问类型
条件类型
条件类型约束
在条件类型内推理
分布式条件类型
类
类的成员
类属性
readonly操作符
构造器 constructor()
类中的方法
Getters/Setters
索引签名
类的继承
implements(类继承接口)
extends(类继承其他类)
类的重写
要子类中重写的类方法需要兼容父类原方法中的数据类型兼容
父类与子类的初始化顺序
继承内置类型
成员可见性
public
protected
private
- 跨实例访问私有属性?
java、C#、C++等不允许,
但Typescript是允许的
静态成员
类里的static 区块
泛型类
类运行时的this
为了保证我们类里面的某个函数的this指向没有问题,我们可以采用
- 箭头函数(箭头函数会浪费更多的内存,因为每个类实例都将有它自己的副本,每个函数都是这样定义的;使用箭头函数不能在派生类中使用super.getName(),也就是不能在子类中通过super来调用父类这个方法了,因为在原型链中没有入口可以获得基类的方法)
- this 参数(使用的时候一定要权衡,this这个值保证在运行的时候是正确的即使我们没有经过TS检查代码,也是如此;JavaScript调用者任然可能在不知不觉的在错误中使用;每一个类在定义只有一个函数被分配,而不是每个实例会创建一个函数;基类中的方法依然可以通过super来调用,更优于箭头函数)
this类型
基于类型守卫的this
类的参数属性
- 使得当前类中就有了自己的成员,这些成员我们不需要再在类中重新单独定义,只需要在构造函数中定义就好了,它不单具备这些成员,还具备成员前面修饰符里面所具备的所有特性
类表达式
抽象类和成员
抽象类是不能被实例化的,只能作为基类被继承,继承后再子类里去实现getName()这个方法
类之间的关系
只看有没有成员类型属性,类型是否正确
模块
ES模块语法
额外的导入语法
typescript特定的ES模块语法
CommonJS语法