typescript 接口

596 阅读3分钟

接口介绍

Typescript的核心原则之一就是对值所具有的结构进行类型检查 。 接口的作用 : 1. 接口是用来描述类型要求的,定义形状。2. 抽象类,类来实现接口。

接口初识

  1. 语法

     interface 调用签名 {
         属性名 : 类型;
     }
    

    注意 : 虽然接口命名后面是一个 {} 但是并不是一个对象,里面写的相当于语句,类似class的写法

  2. 举例

     interface Lable {
         name : string;
     }
     let obj : Label = {
         name: 'bu'
     }
    

    注意: 这种情况表示obj有且只能有name一个属性,添加其他多余属性还是会报错。

    解决:添加索引标签

    interface Obj {
    name: string,
    age: number,
    [abc:string]:any
    }
    
    let obj : Obj = {
        name: 'buzhanhua',
        age: 12,
        s:'s'
    }
    

可选属性

接口里的属性不全都是必须的 , 当某些属性不确定什么时候存在是可以

带有可选属性的接口与普通的接口定义差不多,只是在可选属性名字定义的后面加一个?符号。

     interface SquareConfig {
                 color?: string;
                 width?: number;
     }

只读属性

一些对象的属性只能使用不能修改时 , 你可以在属性名前用readonly来指定只读属性

     interface Point {
               readonly x: number;
               readonly y: Array<string>;
     } 

y 显然是一个引用类型,你直接更改它的引用地址的时候是会报错的,但是你直接更改它的数组项却是被允许的,你如果想你的数组项也是只读的,可以采用下面的方式

     interface Foo{
         readonly y : ReadonlyArray<string>
     }

这样的话,对应数组的数组项也是不可改变的,而且该数组也不可赋值给别的数组

函数类型

接口可以描述JavaScript中对象拥有的各种各样的外形。除了普通对象外,接口也可以描述函数类型

  1. 语法

      interface 调用签名 {
          (参数1:参数1类型,参数2 : 参数2类型,...) : 返回值类型
      }
    
  2. 用法

       interface fn {
            (src : string , num : number) : boolean
       }
    
        let myFn : fn = function(s:string,n:number){
             console.log(s,n)
             return n+1>0
        }
    
      myFn("buzhna",2)
    

    注意

    函数的参数名不需要与接口定义的名字相匹配,typescript会逐个进行检查,要求对应位置的上的参数类型是兼容的

    函数的参数也可以不指定类型 , Typescript的类型系统会推断出参数类型

可索引类型

我们也可以通过接口描述那些能够“通过索引得到”的类型,比如 a[1] 或 a["1"]

可索引类型具有一个索引签名,用来描述对象索引的类型,还有相应索引返回值类型

     interface StringArray {
             [index: number]: string;
     }

      let myArray: StringArray;
      myArray = ["Bob", "Fred"];

     let myStr: string = myArray[0];

TypeScript支持两种索引签名:字符串和数字。 可以同时使用两种类型的索引,但是数字索引的返回值必须是字符串索引返回值类型的子类型。 这是因为当使用 number来索引时,JavaScript会将它转换成string然后再去索引对象。 也就是说用 100(一个number)去索引等同于使用"100"(一个string)去索引,因此两者需要保持一致。

接口的使用场景

类型监测

上面介绍了类型监测传递参数,和创建函数,接口还可以监测类,或者说用类实现一个接口

    interface Foo{
        name : string
        age : number
    }
    
    class MyFoo implements Foo{
        name : string = 'buzhanhua';
        age : number = 16
        say(){
            console.log(`${this.name} 今年 ${this.age}`)
        }
    }
    
    let myFoo = new MyFoo();

继承

TypeScript 是单继承的,也就是说只能使用extends 继承一个类,若是你的需求要使用两个或以上类的时候,则需要将父类当做接口进行混入mixins

另外接口是可以继承接口的,并可以多继承,使用逗号隔开

    interface People{
        name : string
    }
    
    interface Man extends People{
        sex : string
    }
    
    interface LitterBobay {
        say():void
    }
    
    interface Son extends Man ,LitterBobay {
    }
    
    let boy : Son = {
        name : 'bufan',
        sex : 'man',
        say(){
            console.log('hello')
        }
    }

接口和类的关系

关系如下图

    class Auto {
        state = 1
    }
    
    interface AutoInterface extends Auto{
    
    }
    
    class C implements AutoInterface{
        state = 2
    }
    
    class Bus extends Auto implements AutoInterface{
        
    }
    let auto : AutoInterface = {
        state:1
    }