ts学习总结1

105 阅读4分钟

项目编写框架总结

webpack 需要处理图片 js 视频 css文件大量文件适合

rollup 生产环境纯js时候rollup 轻巧精简

esbuild 目前对生产环境不太好(vite是一个工具的整合,生产用rollup ,开发用esbuild)

rollup命令启动:

npm i rollup typescript rollup-plugin-typescript2 @rollup/plugin-node-resolve -D

配置rollup.config.js 如果需要想通过esmodule来(import 引入文件)编写配置文件需要 需要修改package.json 里的type为 "type": "module",

es模块下没有__filename的变量需要自己构建

手写ts 的let name定义 会于ts内置类型的name冲突,想要解决冲突可以在文件尾部export{}// 默认这是一个独立模块不影响其他变量定义

写ts规范:

基础类型 const name:string='CXK'

我们在实用基本类型的时候需要采用小写类型来标识 大写来描述实实例的类型

![]GQFM(ZLIHCRH7{EAPZC@DE.png](p1-juejin.byteimg.com/tos-cn-i-k3…?)

包装类型:

let cxk:String= new String('cxk')// 这种情况就是 类的类型 简称类类型 用来描述实例的类型 给实例添加类型

js是语法,ts是类型 学习ts是往js里添加类型

数组声明
let arr:number[]=[];
let arr:Array<number>=[]
let arr:(number|string)[]=[];
let arr:Array<number|strin>=[];
                            
元组:let tuple:[string,number,number,string]=[];
                            
普通枚举:
    例如
    enum STATUS{
        "OK",
    "NO_OK"=100,
    "NOT_FIND"
    }
    
   STATUS.OK=OK
    并且枚举没有值会根据上面的值自动累加,例如STATUS.NOT_FIND的值是101
 异构枚举:   
 例如
      enum STATUS{
        "OK"='OK',
    "NO_OK"=100,
    "NOT_FIND"
    }
    这是一个 枚举中有字符串还有数字 NOT_FIND的值就无法由NO_OK推导
    以上枚举会被编译成对象
    
常量枚举  (不会编译成对象,使用常量枚举减少编译压力): 
    
  const        enum STATUS{
        "OK"='OK',
    "NO_OK"=100,
    "NOT_FIND"
    }
    
    枚举需要大写 防止变量冲突
    
    
    
    nullundefined
   
    如果禁止非严格null检测,nullundefined可以复制给任何类型(null,undefied任何类型的子类型)
  
     void 的类型标识空类型 
    
    undefiend 可以赋予给void 都代表空,null不行    

image.png

never 永远不

例如函数无法执行完毕
````
function whileTrue():nerver{
while(true){
}
}
fuction throwError():nerver{
    throw Error();//出错函数无法执行完毕
}
    
    
例如可以这么写代码
如果逻辑缺失会被检测到
代码的完整性保护

![F}L[LXPK7GT0ZXD$KN0}34J.png](https://p9-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/02d78129e5d24ab881c8bb624b1f9cf8~tplv-k3u1fbpfcp-watermark.image?)
    
    
    
constlet 类型定义的区别

    
const a =1 默认回退到const a:1=1 a是字面量类型
 如果let a=1 会推到let a:number=1;
    看场景使用 const let使 类型推导更为规范;
    
    
  联合类型问题:
    联合类型在使用方法的时候只能采用公共方法,不然会报错,建议先定义再使用保证安全, 或者使用断言;
    let strOrNum :string |number ;
    
    断言联合类型使用:
    (strOrNum! as string).charCodeAt(0);
    或者
    (<number>strOrnNum!).toFixed(3)
    (告诉ts这里!不为空的后果开发人员自己承担)
    
    (注:这里发现 !是ts语法的 )
    
    let cxk=document.getElementByid'cxk');
    ele?.style.background='green';//问号是取值操作不能赋值
    ele.style.background='red'//感叹号标识某个变量一定存在
    
    还有一种特殊情况
    想把strOrum断言成布尔值
    (strOrNum! as unknown as boolean)
    这是双重断言不建议使用会破坏原有类型关系,不排除特殊使用场景
    
    
    可以将大类型范围断言定义成小类型范围
  type Direction ='up'|'down'|'left'|'right'
   let direction:Direction;
    let up:'down' =direction !as 'down'
    
    
    
    ts 函数导出开发规范
    
    export function xx(){
        const a=()=>{}
    }
    
    ts 开发中 函数声明的函数 不能标注啊函数类型
    通过表达式声明的函数,赋值要满足类型定义的兼容性
    
    例如
    const sun:(a:any,b:any)=>any=function(a:string,b){
    return a+b 
    }//这样可以
    
      const sun:(a:number,b:any)=>any=function(a:string,b){
    return a+b 
    }//这样就炸了
    
    函数类型的定义(a:any,b:any)=>any |(a:any,b:any):any
    
    const sum :{(a:any,b:any):any} =function(a,b){
    return a+b
    }
    进化版
    
    type ISum={(a:any,b:any):any}
    
     const sum: ISum =function(a:string,b:string){
    return a+b
    }
    
    这里可以看到a,b两参数定义了string类型 其实兼容的目标是ISum类型里的any类型
    
    const sum= function(a:string,b?:string){
    return a+b}
    
    这里的?是可选参数的意思可选参数只能从第二位放起,函数形参第一位必须要有
    
    const sum= function(a:string,b?:string='cxk'){
} 可穿参数跟 默认值同时设置是冲突的
    
    
        type ISum={(a:string,b?:string):string}
    
     const sum: ISum =function(a:string,b:string='cxk'){
    return a+b
    }
    这种属于兼容类型处理,采用的是直接定义的类型
    
    ts里尽量不采用this做函数式编程函数的上下文,会有this的类型推导问题
    
    例如
    
    function getValue(key){
    return this[key];//这里的this 推导是any 
    }
    const person={name:'cxk',age:28}
    getValue.call(person,'name')
    
    
    如果限制this类型,需要手动指定类型(手动指定很累,多一个参数需要手动加)
    
    
     function getValue(this:{name:string,age:number},key){
    return this[key];
    }
    const person={name:'cxk',age:28};
    getValue.call(person,'name')
    
    
    
    还可以根据值来获取类型
    
    const person:IPerson={name:'cxk',age:28};
    type IPerson=typeof person;//type  有一个变态提升的效果
    
    type Ikeys=keyof IPerson 

1691548394470.png

ts是类型的重载 ,js的重载是通过arguments来做的