
01-ts环境
强类型语言
弱类型语言
动态类型
静态类型
配置环境
新建文件夹,vscode打开文件夹,打开终端
初始化(默认)=>生成一个package.json
文件
npm init -y
全局安装typescript (好处:在任意地方都可以用tsc,也可以不全局安装)
如果安装报错 怎么办?
npm i typescript -g
查看帮助信息
tsc -h
创建配置项tsc =>生成tsconfig.json
文件
tsc --init
新建一个src文件夹目录,再建一个index.ts
文件
编译ts文件,编译生成一个js文件
tsc ./src/index.ts
安装webpack打包工具
npm i webpack webpack-cli webpack-dev-server -d
//要区分开发环境和生产环境,两种环境的配置是不同的
安装ts-loader
npm i ts-loader typescript -d
安装html-webpack-plugin
npm i html-webpack-plugin -d
编写模板文件index.html
build一般是生产环境 打包后会生成dist文件
npm run build
04-ts类型
Boolean
let a:boolean = false;
Array
let arr:number[]=[1,2]
//函数
let add =(a:number.y:number)=>x+y;
let com:(x:number,y:number) =>number;
com = (a,b) =>a+b;
//对象
let obj:{x:number.y:number}={x:1,y:2}
obj.x=3;
//symbol
let s1:symbol=Symbik();
let s2=Symbol();
console.log(s1===s2);
//undefined
let un:undefined=undefined;
//void 。没有任何返回值 (void可以让任意值返回为undifined)
let npReturn=()=>{};
//any
let x
//never 永远不会有返回值或者死循环
let error = ()=>{
throw new Error('error')
};
let endLess =()=>{
while(true){
}
}
//枚举类型:一组有名字的常量集合,反向映射
//数字枚举
enum Role{
Reporter,
Owner,
Guest
}
console.log(Role.Owner)
//字符串枚举
enmu Answer{
Success="恭喜成功了",
Fail=“抱歉失败了”
y
}
//异构枚举
//枚举成员
06 ts接口
//接口
interface List{
id:number,
name:string
}
//接口
interface Result{
data:List[]
}
//渲染函数
function render(result:Result){
result.data.forEach((value)=>{
console.log(value.id,value.name)
})
}
//假设从后端接收的数据
let reeult ={
data:[
//如果后端传入字段意外的字段 不会报错的
{id:1,name:'A',sex:'male'},
{id:2,name:'B'}
]
}
//传入的对象满足接口的必要条件就是允许的,多余的字段看可以通过ts的检查
render(result);
//特使
//如果直接传入字面量,ts会对多余的字面量进行检查
render({
data:[
{id:1,name:'A',sex:'male'},//sex:'male'异常
{id:2,name:'B'}
]
})
//结果异常的方法
(1)把对象字面量传给一个变量,如上:
(2) 适应断言 render<result>{
data:[
{id:1,name:'A',sex:'male'},
{id:2,name:'B'}
]
}
//不建议,react不支持
(3)声明接口使用可选模式,声明变量后加?号
//数字索引
用任意的数字去索引StingArray都会得到一个string
interface StingArray{
[index:number]:string
}
//字符串索引接口
interface Name{
//用任意的sting去索引Name只能返回sting
<!--[x:sting]:sting;-->
//也可以用任意的数字索引Name
[x:sting]:any;
[z:number]:string
}
//对象类型接口 三种方式
//(1)
let add:(x:number,y:number)=>number
//(2)
interface add {
(x:number,y:number):number
}
// (3)
type Add=((x:number,y:number)=>number;
let add:Add=(a,b) =>a+b
interface Lib{
():void;
version:string;
doSomething():void;
}
function getLib(){
let lib:Lib =(()=>{}) as lib;
lib.version ='1.0';
lib.doSomething =() =>{};
return lib;
}
let lib1 = getLib();
liba();
lib1.doSomething();
let lib2 =getLib();
TS的类包过了es6的类
class Dog{
constructor(name:string){
this.name=name;
}
public name:string ='dog';//公有成员
run(){}
private pri(){}//私有成员
protected pro(){}//受保护状态,只能在子类中调用
readonly legs:number = 4;//只读状态
static food:string='bones' //静态声明
}
console.log(Dog.prototype);
//实例
let dog =new Dog('dog');
console.log(dog);
//dog.pri()//私有不能调用
//dog.pro()//不能调用
console.log('Dog.food')
console.log('dog.food')//错误
//继承
class Husk extends Dog{
constructor(name:sting,color:string){
super(name);
this.coloe =color;
//this.pri()//私有不能调用
this.pro();
}
color:string;
}
//可以被继承
console.log('Husk.food')
11-抽象类与多态
abstct class Animal{
//方法的复用
eat(){
console.log('eat')
}
abstract sleep():void;
}
//抽象类不能实例化
//let animal = new Animal();
class Dom extend Animal{
constructor(name:string){
super();
this.name-name;
}
name:string;
run(){}
sleep(){
console.log('dog sleep')
}
}
let dog = new Dog("wangwang")
//多态
class Cat extend Aninal(){
sleep(){
console.log('Cat sleep')
}
}
let cat =new Cat();
let animals:Animal[] =[dog,cat]
animals.forEach(i = >{
i.sleep();
})
class WorkFlow{
step1(){
return this;
}
step1(){
return this;
}
}
new WorkFlow.step1().step2()
class WorkFlow extends WorkFlow{
next(){
return this
}
}
new MyFlow().next().step1().next().step2();
接口只能类的约束公有成员
接口也不能约束构造函数
泛型接口和泛型函数
- 01- 函数重载、联合类型
- 02-泛型:不预先确定的素具类型,具体的类型在使用的时候才能确定 用的any类型
- 好处:函数和类可以轻松地支持多种类型。增强程序的扩展性
- 不必写多条函数重载,冗长的联合声明,增强代码可读性
- 灵活控制类型之间的约束
泛型类与泛型约束
class Log<T>{
rub(vslur:T){
console.log(value)
return value
}
}
let log1 = new log<number>
log1.run(1);
let log2 = new log();
log2.run('1');
interface Length{
length:number
}
function log<T extend Length>(value:T): T{
console.log(value,value.length)
return value
}
log([1])
log('123')
log({length:1})
类型检查机制
- 作用:辅助开发。提高开发效率
- 类型断言 as 不能乱用
类型推断(做优化)、兼容性(可选参数和剩余参数(1)参数个数(2)参数类型)、保护
交叉类型(&)与联合类型 索引类型
映射类型(非同态)
- 本质是一种预先定义的泛型接口,通常会结合索引类型获取对象的属性和属性值,从而将一个对象映射成我们想要的结构
interface Obj{
a:string;
b:number;
c:boolean;
}
type ReadonlyObj = Readonly<Obj>
type PartialObj = Partial<Obj>;
type PickObj =Pick<Obj,'a'|'b'>
//第二种表达式
type RecordObj = Record<'x'|'y',Obj>
条件类型
分布式条件类型:是在类型的条件下
type TypeName<T> =
T extends string ? "string";
T extends number ? "number";
...
工程篇
22-29
ES6与commonJS的模块系统(ES6和node的引入/到处的区别,以及不能混用)
使用命名空间(全局,不可在同一个模块中使用,也没必要)
理解声明合并(ts特有,不同的文件中的同名也可合并)
- 命名空间函数也可以合并 命名和枚举也可以合并
interface A{
x:bnumber;
// y:bnumber;
foo(bar:number):number;//5
foo(bar:'a':number);//2
}
interface A{
y:bnumber;
foo(bar:string):string;//3
foo(bar:number[]):number[];//4
foo(bar:'b'):number;//1
}
//合并
let a:A={
x:1,
y:1,
foo(bar:any){
return bar
}
}
编写声明文件
npm i jquery
npm - @type/jquery -D
配置tsconfig
编译工具:ts-loader到Bable
- Bable与ts-loader的主要区别:
- 更适合与Babel。使用Babel的转义和缓存
- 不需要安装额外的插件,就可以把类型检查放在独立进程中进行
30-39
typeScript官方转向ESlint的原因
- TSLint执行规则的方式存在一些结构问题,从而影响性能,而修复问题会破坏先有的规则
- ESLint的性能更好,并且社区用户通常拥有ESLint的规则配置(比如针对React和Vue的规则),而不会拥有TSLint的规则配置
代码检查工具:从TSLint到ESLint
使用Jest进行单元测试
创建项目(react)
- 安装react
- 安装react的声明文件
npm i react react-dom
npm i -D @types/react @types/react-dom
- 处理安装的脚手架为最新版本
- 创建一个名为ts-react-app的react项目文件
- npm运行
npx create-react-app ts-react-app --typescript
npm start
创建组件
Hello.tsx
文件
import React from 'react';
import { Button } from 'antd';
interface Greeting {
name: string;
firstName: string;
lastName: string;
}
const Hello = (props: Greeting) => <Button>Hello {props.name}</Button>
// const Hello: React.FC<Greeting> = ({
// name,
// firstName,
// lastName,
// children
// }) => <Button>Hello {name}</Button>
Hello.defaultProps = {
firstName: '',
lastName: ''
}
export default Hello;
-react的高阶组件(能力强大应用广泛)与Hooks(react的未来)
事件处理和数据请求
setupProxy.js
文件
列表渲染与路由
router
目录下的index.ts
Redux与类型
redux
目录下的rootReducer.ts
等
服务器端环境配置
- (在nodejs环境中使用ts)
- 全局安装express
- 然后用express创建一个项目
- 将js文件改为ts(入口文件引入也要改)
(1)npm i -g express-generator
(2)express ts-express
(3)cd 进入生成的新的文件 再npm i 再安装ts
列表的CRUD
- 数据库的操作 显示数据库的信息
mysql -u root -p
40-47
导出Excel
1.导出文件
搭建Vue开发环境
- 在vue中使用ts
npm i vue
npm i -D vue-loader vue-template-compiler css-loader
2.在webpack中修改module的rules配置
组件封装
组件发布
npm login
npm - vue-employee-query@1.0.2
共存策略
1.实现代码迁移 不影响原有的代码的基础上新增ts代码编程
宽松策略
1.重命名
npm - shelljs @types/shelljs ts-node -D
新建rename.JS.ts
import * as shelljs from 'shelljs';
shelljs.find('src')
.filter(file => file.match(/\.jsx?$/))
.forEach(file => {
let newName = file.replace(/\.j(sx?)$/, '.t$1');
shelljs.mv(file, newName);
});
2.修改规则 tsconfig.json文件
严格策略
1,修改 tsconfig.json文件内配置规则
结束总结
基础篇
类型基本概念
语言特性
类型检查机制
工程篇
工程配置
开发生态演化过程
实战篇
主流框架(react、vue)实践
迁移策略
1.世界充满了不确定性
2.不必关注某一种语言或者工具的兴衰,要看前端发展的趋势
3.大势:JavaScript一直在向语言象线的右上角挣扎
4.关键:学习类型思维,补齐前端短板
5.TypeScript -> 标准 ? -> ES标准
ts的优势:
提升代码质量
增强代码可维护性
提升开发效率
重塑类型思维等
成本:
思维转换
对接现有开发生态
项目迁移
接口、声明文件的维护等
网友评论