美文网首页
【TS DOC】接口

【TS DOC】接口

作者: 大Q本Q | 来源:发表于2019-06-28 11:41 被阅读0次

    接口作用

    描述一个对象的取值规范;
    通俗的说:规定一个对象有哪些属性,属性的类型是什么

    注:下文接口统一取名:my_interface;简写: MIF

    定义 与使用 interface

    // 定义一个名为MIF的接口,
    // 这个接口有一个属性为id,id的类型是number
    interface MIF {
        id:number
    }
    

    使用方法一:

    
    let info = <MIF>{};
    info.id = 88;                              // 正确
    info.ii = 88;                               // 错误
    

    使用方法二:

    let info1 : MIF = { id: 88 };               // 正确
    let info2 : MIF = { ii:88 };                // 错误:参数名错误
    let info2 : MIF = { id:88, title:'ss' };    // 错误:带有未定义参数
    

    可选属性属性名后加?

    // 带?的属性名,赋值时是可选的,不是必备的
    interface MIF {
        id:number,
        name?:string
    }
    let info1 : MIF = {id:88};                          // 正确:未带可选参数
    let info2 : MIF = {id:88, name:'ss'};               // 正确:带有可选参数
    let info3 : MIF = {id:88, name:'ss', detail:'dd'};  // 错误:带有未定义参数
    

    只读属性属性名前加readonly

    interface MIF {
        readonly id:number
    }
    let info1 : MIF = {id:3};  // 创建并赋值
    info1.id = 8;                       // 错误:因为id是只读属性,定以后无法修改
    

    注意:
    readonly用于对象的属性
    const用于变量常量

    未明确命名的属性 [prop_name:string] : any

    interface MIF {
        id:number
    }
    let info :MIF = {id:1, name:'dd',age:32};    // 错误:因为name和age未定义
    
    interface MIF {
        id:number,
        [prop_name:string]:any
    }
    let info :MIF = {id:1, name:'dd',age:32};    // 正确
    

    函数类型 (参数名1:类型,参数名2:类型):输出定义

    // 定义接口 
    interface MIF {
        (sort: string, size: number): {id:number}[]
    }
    // 使用接口
    let func : MIF;
    // 定义函数(参数顺序与接口一致;但参数名可以不同)
    func = (sort:string, size:number) =>[{id:1},{id:2}];     // 正确:参数顺序与参数名都一致
    func = (order:string, length:number) =>[{id:1},{id:2}];  // 正确:参数顺序一致, 参数名可以不同
    

    注:参数顺序必须与接口一致;但参数名可以不同

    可索引类型 [idx:number] : 索引结果类型

    数字索引

    interface MIF {
        [idx:number]:string
    }
    
    let arr :MIF;
    arr = ['a','b','c','d'];
    arr[2];      // 正确:输出'c'
    

    字符串索引

    interface MIF {
        [index:string]:string
    }
    
    let obj :MIF;
    obj = {name:'n'};
    arr.name;      // 正确:输出'n'
    

    只读索引

    interface MIF {
        readonly [index:number]:string
    }
    
    let arr : MIF;
    arr = ['a','b','c']
    arr[1] = 'd';      // 错误:因为只读索引无法修改
    

    类Class接口

    interface MIF {
        full_name:string;
        setName(name:string);
    }
    
    class PERSON implements MIF {
        full_name:string
        setName(full_name:string){ this.full_name = full_name;}
        constructor(first_name:string, last_name:string){
            this.full_name = first_name + last_name
        }
    }
    
    let p:MIF = new PERSON('W',"J");
    p.setName('WanJin');
    

    class类内部变量/方法分成成员与私有,
    interface只能检测成员,不能检测私有
    但是实例时的传参是传给contructor的,contructor是私有的,所以无法直接被interface检测

    解决方法如下:

    1. 写类和类的接口,用来校验类的成员变量/方法
    2. 给实例化new专门写一个方法,在new以前,先把实例化时的参数进行校验
    // class类的校验,用来校验类的成员属性与方法
    interface MIF_class {
        name:string;
        getName();
    }
    
    // 类
    class USER implements MIF_class{
        constructor(name:string){
            this.name = name;
        }
        name
        getName(){}
    }
    
    //////// 以上只校验了class的成员属性/方法//////
    //////// 以下用来校验实例时传给contructor的参数//////
    
    // 参数是需要传给class的参数,
    // 返回实例
    interface MIF_creator {
        new (name:string):MIF_class
    }
    
    // 生成实例的方法
    function create_class(ctor:MIF_creator,name:string):MIF_class {
        return new ctor(name)
    }
    
    console.log(create_class(USER,'WJ'))
    

    接口继承 extends

    interface MIF_person {
        name:string
    }
    
    interface MIF_student{
        student_id:number
    }
    
    interface MIF_champion extends MIF_person, MIF_student{
        scores:number
    }
    
    let student : MIF_champion = {
        name:'WJ',
        student_id:11,
        scores:100
    }
    

    接口继承类注意:接口继承的父级不是接口,是类

    class C_Base {
        private state: any;
    }
    
    // 接口MIF继承自!!!类!!!
    // 注意:继承自类,而不是接口
    // MIF继承CLASS_BASE后,会将CLASS_BASE的所有属性方法(私有/成员)都继承,并校验所有属性方法
    // 最后的结果是:MIF会校验 select、state
    interface MIF extends C_Base {
        select(): void;
    }
    
    
    // 错误:因为C1内部没有state属性
    class C1 implements MIF {
        select() { }
    }
    
    // 正确:因为C2继承C_Base后,就有select和state,可以通过MIF校验
    class C2 extends C_Base implements MIF {
        select() { }
    }
    

    混合类型

    // 接口描述的对象,本身是一个函数;
    // 然后在函数上挂载了1个属性age,和一个方法setAge
    interface MIF {
        (name:string):string;
        
        age:number;
        setAge(age:number):void
    }
    // 对象student本身是函数
    let student = <MIF>function (name:string) {
        return 'My name is '+name;
    }
    // student上又挂载了属性age与方法setAge
    student.age = 18;
    student.setAge = function(age){return this.age = age;}
    
    
    student('WJ')
    student.setAge(24)
    student.age
    

    相关文章

      网友评论

          本文标题:【TS DOC】接口

          本文链接:https://www.haomeiwen.com/subject/naxrcctx.html