学习Ts

172 阅读4分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

Ts类型

  • 布尔:boolean
  • 数字:number
  • 字符串:string
  • 枚举:enmu
  • 数组:Array< string > == string[]

元组(Tuple)


明确个数和类型的数组
    const state:[number,string] = [100,'nihao']

其他类型

symbol、null、undefinded 、any

unkonw

所有类型能分配unkonw,unkonw只能赋值给unkonwany

any既能接受所有类型也能赋值给所有类型

never

用户无法到达的类型

例如 抛出异常或者不会有返回值的函数

引用:never 和 void 的区别 void 可以被赋值为 null 和 undefined 的类型。 never 则是一个不包含值的类型。 拥有 void 返回值类型的函数能正常运行。拥有 never 返回值类型的函数无法正常返回,无法终止,或会抛出异常

bigInt 大数类型

number和bigInt不兼容

    const max1 = Number.MAX_SAFE_INTEGER; // 2**53-1 
    console.log(max1 + 1 === max1 + 2); //true 
    const max2 = BigInt(Number.MAX_SAFE_INTEGER);
    console.log(max2 + 1n === max2 + 2n); //false
    let foo: number; let bar: bigint; foo = bar; //error 
    bar = foo; //error

object、Object 和 {}

object

非原始类型

Object

代表所有拥有hasProperty和toString的类型

{}

和Object一样

    //number 和Number
    let num:number = 1;
    let numN:Number = 1;
    num = numN; //error
    numN = num; //right
    
    let obj:object;
    obj = number;//error
    obj = numN;//right
    obj = {}
    
    let Obj:Object;
    Obj = {}
    Obj = num;
    Obj = numN;
    Obj = obj
    Obj = {}
    //{}等同于Object
    let Object:{}
    

类型推论

定义时赋值就能推断是什么类型

    let a;//推论any
    let b = 1;//推论number
    ......

联合类型

联合类型表示取值为多种类型中的一种,未赋值时只能访问多种类型的共有的属性和方法。 ||

    let a :number||string

类型断言

手动告诉ts按照断言声明的类型来通过编译

    //第一种(尖括号可能和as)
    let someValue = 'this is string';
    let length =  (<string>songValue).length;
    //第二种
    let length = (songValue as string).length;

非空断言

断言操作对象是非nullundefinded

字面量类型

Ts支持3种字面量类型 字符串字面量类型、数字字面量类型,布尔字面量类型

    let flag: 'hello' = 'hello'
    let flag: 1 = 1let flag: false = false

类型别名

用来给一个类型起一个别名

    type Flag = number ||string
    let a:Flag;

交叉类型

将多个类型合成一个类型使用&运算符

type Flag = number||string
type Flag1 = Flag&boolean
    

类型保护

编译时通过类型检测来确保某个作用域内的变量类型

typeof 类型保护

    if(typeof input ==='string' ){
    }
    if(typeof input === 'number')

in关键字

    interface Ivalue{
        name:string
    }
    interface IName{
        age:string
    }
    function(value:Ivalue|IName){
        if('name' in value){
        
        }
        
    }

instanceof 同上

自定义类型保护

函数

指定返回值和参数的类型

函数定义

    function fn(a:number,b:string):void{
    }

函数表达式

    //定义函数类型
    type Fnc = (x:number,y:number)=>number
    let fn:Fnc = function(a,b){}

可选参数

Ts中形参和实参要一致,不一致需要配置可选参数

?

    function fn(name:string,age?:number)

默认参数

不传入实参则为默认的参数

    function fn(url:string,data:{},type:string='GET'){
    }
    fn('/login',{})//默认参数type = 'GET'

剩余参数

剩余参数必须为数组,剩余参数必须在在其他参数之后传入

    type arr1 = Array<string||number>
    function fn(name:string,age:number,...arg:arr1[])

函数重载

函数重载:使用相同的函数名,不同的参数数量或者类型实现多个方法的一种能力。

在ts中,表现为给同一个函数提供多种不同的函数类型定义

函数体在最后定义,最后定义的函数体类型要包含前面定义的函数参数和返回值类型(即重载签名相同)

    function fn(a:string,b:string):string;
    function fn(a:number,b:number):number;
    function fn(a:string|number,b:string|number):string|number|void{
        if(typeof a =='string'&&typeof b=='string'){
            return a+b;
        }
        if(typeof a=='number'&&typeof b =='number'){
            return a+b;
        }
    }
    function show(){
        let a:number;
        let b:string;
        a = fn(1,2);
        b = fn('1','2');
    }    

接口

接口既可以在面向对象编程中表示为行为的抽象,也可以用来描述对象的形状

对象的形状

    interface ISpeakable{
        speak():void,
        name:string,
        name?:string //表示属性可选
    }

行为的抽象

接口可以把一些类中共有的属性和方法抽象出来,可以用来约束实现此接口的类
一个类可以实现多个接口,一个接口也可以被多个类实现
我们用 implements关键字来代表 实现

    interface speakable{
        speak():void
    }
    interface eatable{
        eat():void
    }
    class animal implement speackable eatable{
        //必须实现接口中的所有方法
        speak();
        eat();
    }

定义任意属性类型

接口的继承

函数类型接口

用接口来定义函数

    interface count{
        (price:number):number
    }
    let coat:count = function (price:number){
        return price++;
    }
    //接口定义函数重载
    `?????`

泛型

泛型(Generics)是指在定义函数、接口或类的时候,不预先指定具体的类型,而在使用的时候再指定类型的一种特性

    //声明
   function fn<T>(value:T):T{
        return value;
   }
   function log(){
       //使用
        fn<number>(1);
   }
    //默认泛型
    function fn<T=string>(value:T):T{return value}