TypeScript完全解读入门进阶课程(26课时)
2020-05-03 12:31 cascle 阅读(683) 评论(0) 收藏 举报typescript playground可以实时编译
第一章. 环境搭建
1.npm init
2.npm install typescript tslint
3.tsc --init,生成tsconfig.json配置文件
4.nmp install webpack webpack-cli webpack-dev-server -D
5.build下写webpack.config.js
6.npm install ts-loader -D
7.npm install cross-env -D
8.npm install clean-webpack-plugin -D
9.npm install html-webpack-plugin -D
10.ts-lint --init
webpack-dev-server --config 【文件路径】 start运行,webpack --config 【文件路径】打包。通过cross-env设置环境变量为dev或者pro
第二章. 基础类型
boolean
number
string
数组,[]/Array<>/(string | number)[]
元组, [tpye1, type2]
枚举,enum, 枚举类型[值]打印枚举名
any
void
null/undefined,即是类型也是值,undfined可以赋值给void类型,是其他类型的子类型
never,不存在的值的类型,抛异常和死循环;任意类的子类
object
断言,类型转换,两种写法。<type>/as type。tsx只能用as
let 变量名:变量类型 = 值
`${变量名}`:字符串拼接,取得字符串
第三章. Symbol
独一无二的值
使用Symbol,在tsconfig.json里配置lib引入es6
创建Symbol,用函数Symbol(),可传字符串为参数
toString转为字符串,Boolean(symbol)转为布尔
作为对象的属性名,放中括号里。[symbol_var]
symbol值作为对象属性,无法用遍历key的方法获取,只能用Reflect.ownKeys获取
两个静态方法,一个是for,一个keyFor
for获取的是已有的Symbol对象,没找到返回新的
keyFor返回用for创建的对象的参数
11个内置的Symbol值
hasInstance:instanceof使用时调用的方法
isConcatSpreadable:设置数组和其他数组合并时是否会被扁平化
species:允许子类覆盖对象的默认构造函数
match:字符串上调用match方法时调用相应方法
replace:replace方法的回调函数
search:seaerch方法的回调函数
split:split方法的回调函数
iterator:数组的迭代器
toPrimitive:转为原始类型时调用
toStringTag:toString的回调
unscopables:with语句里无法获取的属性
第四章. 接口
interface关键字定义
里边的字段名最后加?代表可选属性,调用时可以不传参数
如果函数要求的参数个数与实际传入的对象不匹配,有三个办法:
1.传入的时候类型转换
2.索引签名,用[prop:string]:any来设置
3.类型兼容性,把参数付给一个变量
readonly限定为只读属性
函数用(参数):返回类型的格式定义
索引类型:[key名:类型]值类型
接口继承:extends继承
混合类型:函数和字段都定义在接口里。定义一个函数,给他加属性,就可以转换为一个接口
第五章. 函数
函数类型
使用类型别名定义函数:type 函数名 = (参数列表)=》返回值
参数
可选参数
可选参数在必选参数后边,最后问好结尾
默认参数
参数列表里设置值
剩余参数
...args,参数放进数组里;反过来在函数体里是拆解
重载
函数不同类型参数可以有多个签名,但是有一个实现,参数是any。function定义函数签名,方便不同类型的函数对应一个实现
第六章. 泛型
泛型约束函数参数的类型
定义:<T>函数定义
调用:函数名<类型>()
泛型约束:T具有某种特点,比如 extends, keyof(索引类型)
第七章. ES中的类
es6:
class{
constructor(){}
}
构造函数:constructor。函数的返回值是new关键字的返回值
创造类对象必须用new
set和get函数:set和get放在变量同名函数前,取值与赋值时自动调用
class表达式:定义类像给函数变量赋值一样,a = class{}
静态方法:static修饰,不能被对象调用,只能用类名调用
实例属性其他写法:除了用this调用,可以在constructor之外定义 属性
类默认没有静态属性,只能额外用Ponit.y来定义y这个静态属性
私有方法:默认没有。从名字约定上,__开头的是私有的;方法在类外部定义,对象就没办法继承了;通过Symbol定义函数
私有属性:#加在变量名前面
new.target属性:用new调用构造函数时被赋值为类名
继承:extends关键字
getPrototypeOf:获取原型对象
super:可以作为函数,也可以作为对象使用
函数:父类的constructor,子类必须调用一次,才能用this;super调用里this指向子类
对象:普通方法,父类原型对象;静态方法,父类
prototype和__proto__:
__proto__:指向构造函数的prototype属性
es6可以继承原生类型
第八章. TS中的类
修饰符
public
private
protected:子类可以调用父类方法不能访问属性,修饰constructor方法就只能被子类继承不能被new
readonly:修饰属性为只读的
参数属性:在构造函数上加修饰符,直接定义相应属性
静态属性:方法或者属性只能用类名调用
可选类属性:属性名后边加?
存取器:和es6没区别
抽象类:abstract修饰class或者函数(函数没有方法体),属性/存取器
实例类型:类即是对象也是类型。不同名字的类对象可以互相赋值,判断类型要用instanceOf之类的
类与接口:
接口属性之间可以用任意符号隔开
类用implements实现接口
接口检测的是类的实例
接口继承类的成员,不包括其实现,protected和private的成员也会继承,接口只能被这个类或者他的子类实现
泛型使用类类型:class的类型可以用在泛型里
// 类的泛型约束 function create<T>(c: {new():T}) { return new c(); }
上面new()代表的是构造函数,代表类类型
第九章.枚举
数字,字符串两种枚举
定义:
enum 枚举名{
常量列表
}
访问:枚举名.枚举常量;枚举名[‘枚举常量’]
枚举用表达式赋值后,后面的值必须初始化
异构枚举:枚举列表里既包含数字又包含字符串
枚举成员类型:枚举里的常量用来作为类型定义变量,枚举常量要是数字或者字符串或者自增
联合枚举:变量被枚举类型修饰,只能是枚举常量里的一个
运行时枚举:枚举是一个对象,在转换之后仍然可以使用枚举对象
const枚举:const修饰enum,枚举对象直接被编译为常量而不是对象的属性
第十章. 类型推论和兼容性
类型推论:
根据值,不指定类型也给变量一个类型
多类型联合:数组可以多种类型数据,类型为numbr | string这样的
上下文类型:根据函数签名推断出回调函数参数
兼容性:
如果赋值对象可以满足被赋值对象的字段,那就可以部分赋值或者类型转换后赋值,支持递归赋值
函数兼容性:
参数个数:右边函数参数个数必须小于等于左边函数的参数个数,可以省略参数
参数类型:要匹配
可选参数和剩余参数:多个参数与…兼容,可有可选参数
参数协变:参数联合类型与单个类型兼容
返回值类型:单个返回类型的函数可以赋值给联合类型返回值的函数
函数重载:不同函数声明,一个函数体用any代替类型。函数重载要一模一样才能兼容
类:比较的是实例的成员;private和protected影响兼容性,不能兼容,除非派生
枚举:数字枚举,字符串枚举和数值/字符串互相兼容,枚举之间不兼容
泛型:类型参数影响使用了类型参数的部分,不影响整体类
第十一章. 高级类型
第十二章. 模块和命名空间
es6:
export:导出变量,单个导出或者{}里一起导出,export 名 as 别名,不能导出常量,不能在块级作用域,定义的时候就要加
import:import { 变量 as 别名} from 文件名,引入的非对象是只读的。import可以直接引入一个js文件,并且提升到文件头部;*引入所有export的;用逗号隔开单个变量和{},引入default和其他的
export default:只能有一个,导出的东西不需要准确命名引入,可以先定义后导出,导出的是一个叫default的;不可以接一个变量定义而已直接一个值
export和import的复合写法:先引入后导出,export的是default然后import;export其他模块的内容
动态import:import()函数,返回Promise
nodejs:
exports:export.变量名,导出一个对象
module.exports:不用导出对象,直接获取变量后者函数
require方法:导入,获得对象
ts:
模块:外部模块。
export,可以先定义后导出,可以as命名别名
import:导入可以as 别名,是个对象;直接imort一个文件,无法用,只能执行代码
export=和import xx = require()可以连用
命名空间:之前叫内部模块。
namespace:定义命名空间,里边的东西不export无法使用
引入:///<reference path="文件路径"/>
拆分为多个文件:相同namespce定义在不同文件
别名:给namespace重命名, import 新名 = 命名空间.命名空间
不推荐使用命名空间
模块解析:
相对和非相对模块:非相对模块是baseUrl,相对是/,./,../
模块解析策略:node和classical,modeResolution来设置,没设根据module来看
模块解析配置项:baseUrl:编译后所有文件放一个路径里;paths:默认查找路径,一般设置第三方type文件;rootDirs:构建路径列表,为根目录;--noResolve:不要将命令行没有加入的文件编译
第十三章. 声明合并
声明类型,可以创建三种东西,命名空间,类型,值
合并接口:
同名接口合并,内容类型重复不能不一样;同名函数重载
合并命名空间:
不expert,同名空间里定义的内容互相不能访问
不同类型合并:
命名空间和类:同名类定义在前面,结果是包含命名空间导出内容作为静态属性的类
命名空间和函数:
类似类
命名空间和枚举:
类似类
第十四章. 装饰器
打开tsconfig里的experimentalDecorators为true
装饰器:@名字,名字必须是个函数或者调用函数求值后是个函数
多个装饰器可以应用于同一个实体,先调用装饰器工厂,再从下往上调用
不同实体装饰器执行顺序:对象,静态,构造,类
类装饰器:装饰器参数是类,在构造对象的时候执行。返回值如果是个类,替换掉原来的类
方法装饰器:三个参数,第一个参数是原型对象(实例函数)或构造函数(静态函数),第二个参数是成员名字,第三个参数是成员属性描述符;返回的值是属性描述符对象
访问器装饰器:不能同时装饰get set,参数和方法装饰器一模一样
属性装饰器:两个参数,第一个参数是原型对象(实例函数)或构造函数(静态函数),第二个参数是成员名字;判断是否有某个名字的属性
参数装饰器:三个参数,第一个参数是原型对象(实例函数)或构造函数(静态函数),第二个参数是成员名字,第三个参数是参数索引位置
第十五. Mixins混入
两个类或者对象的内容混合在一起,js用Object.assign
对象的混入:
Object.assign生成交叉类型,A & B
类的混入:
getOwnPropertyNames获取自有属性,赋值给目标类prototype
目标类可以把源类当成接口继承
第十六章. 其他重要更新
第十七章. 声明文件
已有的js库类型:
全局库:
模块化库:
UMD库:
处理库声明文件:
模块插件/UMD插件:
修改全局的模块:
使用依赖:
快捷外部模块声明:
第十八章. tsconfig.json配置详解
第十九章. 封装并发布一个库
第二十章. 写声明文件
浙公网安备 33010602011771号