最新公告
  • 欢迎您光临网站无忧模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • TypeScript入门:对象类型的接口

    正文概述 掘金(jenvyxu)   2021-01-15   467

    接口的定义

    接口可以约束函数、对象、类的结构和类型,接口使用interface去定义

    interface Myinterface {
      //...
    }
    

    如何使用

    如果后端返回一个列表,如何判断后端返回来的结果符合前端定义的接口呢?

    // 定义一个List接口
    interface List {
        id: number;
        name: string;
    }
    // 使用List接口定义Result接口
    interface Result {
        data: List[]
    }
    // render接收后端返回来的result,result要满足Result接口
    function render(result: Result) {
        result.data.forEach((value) => {
            console.log(value.id, value.name)
        })
    }
    // 这个result满足Result接口
    let result = {
        data: [
            {id: 1, name: 'A', sex: 'male'},
            {id: 2, name: 'B', age: 10}
        ]
    }
    render(result)
    

    如果result是下面的值,也满足Result接口,只要result的属性满足接口的必要条件就可以通过ts的类型检查,就是说result中list的属性除了要满足Result中定义的属性,还可以添加更多的属性,就像下面的代码,添加sex: 'male'属性

    let result = {
        data: [
            {id: 1, name: 'A', sex: 'male'},
            {id: 2, name: 'B'}
        ]
    }
    

    注意如果直接把上面对象字面量作为参数传递给render函数是会报错的

    TypeScript入门:对象类型的接口

    TypeScript入门:对象类型的接口

    有三种办法解决上面的报错警告:

    1. 把字面量对象赋值给一个变量,把变量传给render函数
    let result = {
        data: [
            {id: 1, name: 'A', sex: 'male'},
            {id: 2, name: 'B'}
        ]
    }
    render(result)
    
    1. 使用类型断言(as),明确告诉编译器这是一个满足Result接口的对象
    render({
      data: [
          {id: 1, name: 'A', sex: 'male'},
          {id: 2, name: 'B'}
      ]
    } as Result)
    // 不建议使用下面这种,会在React中产生歧义
    render(<Result>{
      data: [
          {id: 1, name: 'A', sex: 'male'},
          {id: 2, name: 'B'}
      ]
    })
    
    1. 使用字符串索引签名,使用任意的string索引List,得到任意的结果
    interface List {
        id: number;
        name: string;
       [x: string]: any;
    }
    

    意思就是使用任意的string索引List,得到任意的结果,这样list就可以添加任意的属性来

    如果render添加一个逻辑判断list是否有age属性

    function render(result: Result) {
        result.data.forEach((value) => {
            console.log(value.id, value.name)
            if (value.age) {
                console.log(value.age)
            }
        })
    }
    

    那么接口List应该添加一个可选属性age?

    interface List {
        id: number;
        name: string;
        age?: number;
    }
    

    如果给id加一个readonly, 那么id是只读的,不可以修改

    interface List {
        readonly id: number;
        name: string;
        age?: number;
    }
    // 修改result里面list的id就会报错
    

    不确定接口属性个数

    如果不确定接口属性的个数,就可以使用有索引属性的接口,既可以用数字,也可以用字符串去索引

    1. 数字索引
    interface StringArray {
        [index: number]: string
    }
    let chars: StringArray = ['a', 'b']
    

    意思是用任意的数字去索引StringArray得到字符串,相当于定义一个字符串类型的数组

    1. 字符串索引
    interface Names {
        [x: string]: string;
        // y: number; 不能在字符串索引结果为字符串的接口后面加类型为number的属性,string的话就没问题
        [z: number]: string;
    }
    

    用任意的字符串去索引Names,得到的结果是字符串,但是不能在后面去声明一个number类型的属性y: number,因为两种索引签名是可以混用的,如果在后面加上[z: number]: string,那么既可以用字符串去索引Names也可以用数字去索引Names注意数字索引的返回值一定要是字符串索引返回值的子类型,因为ts编译时会进行类型转换,将number转换成string,这样就能保持js的兼容性。

    interface Names {
        [x: string]: string;
        [z: number]: number; // number类型不是string的子类型,会报错
    }
    
    interface Names {
        [x: string]: any;
        [z: number]: number; // number类型是any的子类型,可以通过
    }
    

    下载网 » TypeScript入门:对象类型的接口

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元