ts简单知识点

126 阅读9分钟

扩展标签类型

HTMLDivElement, 代表div

HTMLUListElement,代表 li

HTMLImageElement,代表图片

第一次使用时下载

npm i typescript -g



有时要装淘宝 nrm use taobao

初始化ts配置文件

tsc --init


tsconfig.json 配置文件解释

   1. ES6配置
    {
      "target": "ESNext",    ts转换为js的目标版本
      "module": "ES6",       ts转换为js的模块化方式
    }
   2.  ES5配置
    {
         "target": "ES5",    ts转换为js的目标版本
         "module": "AMD",       ts转换为js的模块化方式
    }
        3. node的ts配置
          {
           "target": "ES5",    ts转换为js的目标版本
           "module": "commonjs",       ts转换为js的模块化方式
          }   
    "module": "AMD",   使用模块化开发时转换为JS的那种模块化方式  javascript ES5-->AMD/CMD 
     ES6-->ES6模块化  Nodejs  ES5--->Commonjs   ES6--->ES6模块化

"rootDir": "./ts",   需要将那个文件夹下的ts文件转换为js,TS的源文件根路径  就是指你写的那些
ts代码,在哪里放的

"declaration": true,   描述文件生成.d.ts  可以在代码提示时显示方法的参数和返回值等详细数据
类型 必须使用数组方法中显示数据类型如数组是字符串

"declarationMap": true, .d.ts的映射文件,可以根据这个提示找到源文件内容 鼠标移到它身上显示
连接

"sourceMap": true,   生成一个.js.map文件可以在运行时,根据js在浏览器中找到对应的ts相关代码
的位置 鼠标移到它身上显示连接 很重要

"outDir": "./js",  将TS代码转换为JS代码放入某个文件夹中,JS的目标文件夹

"lib": ["DOM","DOM.Iterable","ES2015"],   当使用ES5模块化时,使用了ES6一些东西必须添加下
面的模块才能使用

"DOM.Iterable" Dom迭代器




tsc -w 监听rootDir路径下的ts(就是将ts变为js文件),如果编辑修改就会自动转换到outDir路径下
的js



当使用ES5模块化时 引入文件不需要加文件的扩展名

但是使用ES6模块化时 引入文件必须加入文件的 js 扩展名

以下是node 的配置还有图片
   @types/node ts的nodeAPI库  npm i @types/node

   @types/express 是typescript的express的API

   express 是js默认express框架

  @types/mysql 是typescript的mysql的API

  mysql 是js默认的mysql库
  
  

图片.png

AMD与ES5 在HTML中操作 图片.png

ES6在HTML中操作 图片.png

模块化说明

           一, 前端模块化

             1.  ES5模块化

                ES5模块化包括  AMD模块

                  所有路径都不能带扩展名

                 导出

                  默认导出1个

                  define(function(){

                    定义模块

                    return 模块

                  })




                 默认导出多个

                  define(function(){

                    定义模块1

                    定义模块2

                    定义模块3

                    return {模块1,模块2,模块3}

                  })




                  导出的模块有依赖

                  define([依赖模块路径1,依赖模块路径2...],function(依赖模块1,依赖模块2...){

                    定义模块

                    return 模块

                  })




                 导入

                  require([路径1,路径2...],function(路径1的模块,路径2的模块...){




                  })




                  require([路径1,路径2...],function(路径1的模块,{模块a,模块b..}...){




                  })

             2.   ES6

                 导出

                  export default 模块

                  export 模块




                  导入

                    import 模块名 from 路径

                    import {模块1,模块2} from 路径







           二, nodejs模块化

                Commonjs

                  导出

                    module.exports=

                    exports.模块名=

                  导入

                    var 模块=require(路径)

                    var {模块1,模块2..}=require(路径)

                    var {模块1=别名,模块2..}=require(路径)




            4.    ES6

                 导出

                  export default 模块

                  export 模块




                  导入

                    import 模块名 from 路径

                    import {模块1,模块2} from 路径

                    import {模块1 as 别名,模块2} from 路径
                    
                    
                    
                    
                    
                    
                    

ts基础内容

     1.  ts变量写法
        定义变量时 let 变量名:类型=值

        let a: number = 1

        console.log(a);//1



        2.ts函数写法
        //function 函数名 (参数1:类型,参数2:类型) :返回值的类型
        //{
        //}


        2.1  function fn(a: number, b: number): number {

            return a + b

        }

        console.log(fn(1, 2));//3



       3.ts中的类写法
        class 类{

            属性:类型=值

            // 构造函数后不能写入返回类型

            constructor(参数:类型){


            }

            实例化方法(参数:类型...):返回值类型

            {


            }

            // set访问器属性不能设置返回类型

            set 访问器属性(value:类型){


            }

            // get不能设置参数和参数类型

            get 访问器属性():返回值类型{

            }

            // 访问器属性set的参数类型必须和get的访问器属性返回值的类型一致

        }



       
     3.1   class Box {

            n: number = 1

            _count: number = 0

            constructor(num: number) {




            }

            set count(value: number) {

                this._count = value

            }

            get count(): number {

                return this._count

            }

            play(n: number): number {

                return n + 1

            }

        }
        
        var a = new Box(2)// 这个2没关系

        a.count=6

        console.log(a.count);//6

        console.log(a.play(5));//6

ts的基础类型写法

             1.  number 只能赋值为基础数据类型number的数值,不能赋值数值对象类型

                var a:number=1;

                Number 数值类型的对象函数

                Number既可以赋值为基础的number类型,也可以赋值为数值对象类型

                var b:Number=2;


             1.1  let a=new Number(3)

                console.log(a); //Number {3} 大写的Number 就是对象类型

                a=2

                console.log(a); //2

                a="cdscsc" // 出错但可以打印 a是数值类型

                console.log(a);


                a=3.4e+2

                console.log(a); //340

                a=0xFF;

                console.log(a);//255

                a=0o57

                console.log(a);//47




               2. 字符串

                var a:string="a";

                var b:String="b";


                a="a";

                a='a';

                a=`a`;




               3. 布尔值

                var a:boolean=true;

                var b:Boolean=false;




             4.   undefined

                var a:undefined;

                a=undefined;




           4.1  或者 这个变量可以是number类型也可以是undefined

                或者 用一个"|"

                var a:number|undefined

                console.log(a);//undefined

                a=2

                console.log(a);//2




           5.   null  一般会和Object联合使用|

                用来表示对象的属性的属性值不存在

                var a:null=null

                console.log(a); //null

                var obj:object|null={a:1,b:2}

                console.log(obj);// {a: 1, b: 2}

                obj=null
                
          6、 symbol(Symbol) 唯一类型

            var s:Symbol=Symbol("a");

            var s1:symbol=Symbol("b");


         7、 ES2020 bigint

            var a:bigint=34567898765789876n;


         8、 正则类型

            var reg:RegExp=/a/g;


         9、 日期类型

            var date:Date=new Date();
                

ts数组类型

  1.   Array<元素的类型>

    var arr:Array<number>=[1,2,3,4]

    var arr:Array<number|string>=[1,2,"a","b"];




  1.1  元素类型[]

    var arr:number[]=[1,2,3,4,5];

    (元素类型|元素类型)[]

    var arr:(number|string)[]=[1,2,3,4,"a"]




 1.2   二维数组

    var arr:Array<Array<number>>=[[1,2,3],[4,5,6]]

    var arr:number[][]=[[1,2,3],[4,5,6]];



  2.  枚举 遍历时候读取不到他,正常读取可以

    enum COLOR{RED,GREEN,BLUE};// 当没有设置枚举类型的值时,默认从0开始

    enum COLOR{RED=2,GREEN,BLUE};// 当没有设置枚举类型的值时,如果设置前面的一个枚举类型的
    值,并且是数值,后面的值也会递增

    enum COLOR{RED,GREEN=5,BLUE};// 当没有设置枚举类型的值时,如果设置前面的一个枚举类型的
    值,并且是数值,后面的值也会递增

    如何值设在中间,后面的递增,前面的为0

    console.log(COLOR.RED); // 0



    enum COLOR{RED,GREEN="a",BLUE=6};// 当没有设置枚举类型的值时,如果设置摸个类型值为字符
    串,后面的枚举类型必须也要设置值

    enum COLOR{RED="red",GREEN="green",BLUE="blue"};// 当没有设置枚举类型的值时,如果设
    置摸个类型值为字符串,后面的枚举类型必须也要设置值


    enum COLOR{RED,GREEN="green",BLUE="blue"};// 枚举类型的值只能设置为数值或者字符串


    console.log(COLOR.BLUE);

    如果枚举类型值是数值类型,可以通过值的反射获取到对应的枚举类型属性名

    console.log(COLOR[0]);//RED

    enum COLOR { RED = 2, GREEN, BLUE };

    console.log(COLOR[3]) // GREEN
    
    
    

元组

    let arr:Array<number>=[1,2,3]

    规定每个下标对应的元素的类型,这个就是元组

    var arr:[string,Number,boolean]=["asac",2,true]

    console.log(arr); //(3) ['asac', 2, true]
    
    

ts另外的属性

 1.  any  就是可以赋值任意类型值  

     var a:any=1;

        a="a";

        a={a:1};

        a:null




2. never 永远不会正确的内容

    function fn():never

    {

       // console.log(123);// 写正常的不行

       throw new Error("a"); // 这是显示报错,只能写这种

    }

    fn()

    console.log(fn());





3.  void  voidundefined类似 void表示没有结果

    var a:void=undefined// 这样写只能写

    console.log(a);


 一般来说void用于函数执行后不返回值的时候

 3.1   function fn():void{

        // console.log("a");// 在里面打印会在控制台显示

       // return a  写返回 值出错

    }

    console.log(fn());



  3.2  function fn(a:number):number{



        return a  // 这个没事

    }

    fn(2)
    
4.  object  不建议使用 因为随意设置值会出错

    var obj:object={a:1};

    var obj1:Object={b:2};

    obj.a=2;

    console.log(obj.a)

    delete obj.a;
    
4.1  [key:string]:number  key属性名必须是字符串类型 属性值必须number数值型
    可以随意给对象中增加或者删除键名,但是键名必须是字符型,值必须是数值型
    var obj:{[key:string]:number}={a:1,b:2};    
    

断言

  断言  强制假设类型

    1、在需要断言的内容后面写上 as 断言的类型

    2、在需要断言的内容前面写上<断言的类型>



    1.平常
    function fn(){
        关于dom对象初始化时,有两种情况1.存在:HTMLDivElement,不存在undefined
      就是这个  var div:HTMLDivElement|undefined=document.querySelector("div");
      或这个 prev:HTMLLIElement|undefined;
      
      下面的情况就是你想清除dom对象(前提你已经获取了,然后再次使用时清除)就把undefined换成
      null
      
        var div:HTMLDivElement|null=document.querySelector("div");

        if(div){

            div.style.width="50px";

            div.style.height="50px";

            div.style.backgroundColor="red";

        }

    }



  2.断言
    function fn(){

        // 获取到的内容断言为HTMLDivElement

        // var div:HTMLDivElement=document.querySelector("div") as HTMLDivElement;

        var div:HTMLDivElement=<HTMLDivElement>document.querySelector("div");

        div.style.width="50px";

        div.style.height="50px";

        div.style.backgroundColor="red";

    }

    fn();
    
    
    

重载

   1. function fn(a:number,b:number):number;

   2. function fn(a:string,b:string):string;

   3. function fn(a:Array<number>,b:Array<number>):Array<number>;
   和为4 这就是重载,函数的多种写法的集合
    function fn(a:number|string|Array<number>,b:number|string|Array<number>):number|
    string|Array<number>

    {

        if(Array.isArray(a) && Array.isArray(b)){

            return a.concat(b)

        }else if(typeof a==="string" && typeof b==="string"){

            return a+","+b;

        }else if(typeof a==="number" && typeof b==="number"){

            return a+b;

        }

        throw new Error("错误参数类型")//参数给的不对就会出错



    }

    console.log(fn(1,2));
    
    
    
    a参数可以是number或者boolean或者数组或者对象,函数执行完成会转换为字符串

    function toStrings(a:number):string;

    function toStrings(a:boolean):string;

    function toStrings(a:Array<any>):string;

    function toStrings(a:object):string;

    function toStrings(a:number|boolean|Array<any>|object):string

    {

        return ""

    }

在ts中函数也有命名函数、匿名函数、箭头函数

    a:number 必填参数,数值类型

    b:number|string=1 默认值参数,数值类型或者字符串类型

    c?:number=1 可选参数,数值类型

    ...arg:Array<number> 剩余参数都是数值型数组

例子1    function fn(a:number,b:number|string=1,c?:number,...arg:Array<number>){

        console.log(a,b,c,arg)

    }

    fn(1);

    fn(1,2);

    fn(1,2,3);

    fn(1,2,3,4);

    fn(1,2,3,4,5);




    ...arg:[string,number,string] 剩余参数都是元组类型

  例子2  function fn(a:number,b:number|string=1,...arg:[string,number,string]){

        console.log(a,b,arg);

    }

    fn(1,2,"a",3,"b");

    fn(1,2);




    不返回值,就是没有返回值的函数

    function fn():void

    {




    }

  有返回值的
    function fn():number{

        return 1;

    }




    function fn():number|string{

        return 1;

    }

    不能再返回值类型中使用?




    匿名函数

    var fn=function(a:number,b:number):void

    {




    }




    fn(1,2)




    箭头函数 在ts中使用箭头函数,不能省略() ,{}

    var fn=(a:number,b:number):void=>{

        console.log(a+b);

    }

    var fn=(a:number):number=>{

        return a+1;

    }
    
    
  // 匿名函数或者箭头函数定义接口类型
  
  
  (a:number,b:number) 是函数的参数类型
   =>void 是函数的返回类型 ,这样后面的参数就不需要写类型了
   匿名函数
   var fn:(a:number,b:number)=>void=function(a,b){
    }
    箭头函数
   var fn:(a:number,b:number)=>number=(a,b)=>a+b;