• TypeScript学习笔记--接口


    接口 interface

    此接口非彼接口,在ts中只是对象的一种,用来定义对象的类型

    什么是接口

    在面向对象语言中,接口(Interfaces)是一个很重要的概念,它是对行为的抽象,而具体如何行动需要由类(classes)去实现(implement)。
    ts的接口-interfaces经常用于对对象的形状,特点进行描述。

    小试牛刀

    interface Person{
      id:number,
      name:string,
      isMale:boolean
    }
    
    let peter:Person = {
      id:123456,
      name:'peter',
      isMale:true
    }
    

    从例子可以看到,所谓的接口,还是按照对象形式+类型定义的方式,然后在定义变量时运用起来,并添加其约束。
    一般声明接口时,首字母大写

    接口定义

    在用interface声明变量时,若没有其他的特殊情况,比如任意属性,可选属性,只读属性等,数量不能多也不能少,顺序倒是无所谓,多了未知的属性不行,少了已知的属性也不行,否则会报错。

    interface Person{
      id:number,
      name:string,
      isMale:boolean
    }
    
    let peter:Person = {
      id:123456,
      name:'peter',
    } // 报错,缺少属性isMale
    
    let tom:Person = {
      name:'tom',
      id:1111111,
      isMale:false,
      age:20
    } // 报错,age不在Person属性中
    

    可选属性

    可选属性,意思就是不是必须要填写的属性,就在该属性后面加上?即可。仍然不允许添加未定义的属性

    interface Animal{
      type:string,
      color?:string
    }
    
    let tiger:Animal = {
      type:'cat',
      color:'yellow'
    }
    let lion:Animal = {
      type:'dog'
    }
    let shark:Animal = {
      type:'fish',
      isBig:true
    }// 报错,isBig不在Animal类型中
    

    只读属性

    只读属性,意思就是,在第一次创建后,就不能再赋值。
    只读的约束存在于第一次给对象赋值的时候,而不是第一次给只读属性赋值的时候

    interface Flower{
      readonly name:string,
      color:string
    }
    
    let red_flower:Flower = {
      name:'red_flower',
      color:'red'
    }
    red_flower.name = 'green_flower' // 报错,无法分配到“name”,因为它是常数或只读属性。
    

    任意类型

    在js中,对象就有无限声明赋值的特性,ts也可以设置接口的任意类型来无限声明赋值。使用 [propName: string]或者[propName: number] 定义了任意属性取 string或number 类型的值。

    interface Person_1{
      id:number
      name:string,
      [propName:string]:string,
    } //报错 类型“number”的属性“id”不能赋给字符串索引类型“string”
    let Lily:Person_1 = {
      id:12345,
      name:'Lily',
      age:18,
    } // 报错,不能将类型“number”分配给类型“string”。
    

    一旦定义了任意属性,那么确定属性和可选属性的类型都必须是它的类型的子集,就拿上面的例子说,一旦声明了任意类型为string,那么就不能定义属性number和boolean了,同样的道理,在应用的时候,未知的属性也必须是string类型。
    解决这个办法就将任意类型的类型设置为any或者unknown,或者采用联合类型。除非有万不得已的情况,不建议采用此方法

    interface Person_1{
      id:number
      name:string,
      isMale:boolean,
      [propName:string]:unknown,
    }
    let Lily:Person_1 = {
      id:12345,
      name:'Lily',
      isMale:false,
      age:18,
      like:'dance'
    }
    

    TypeScript支持两种索引签名:字符串和数字。 可以同时使用两种类型的索引, 简称:可索引类型。

    可以描述那些能够“通过索引得到”的类型,比如a[10]或ageMap["daniel"]。 可索引类型具有一个 索引签名,它描述了对象索引的类型,还有相应的索引返回值类型。
    都是说明属性是字符串还是数字,一般对象中字符串居多,数组数字居多,在数组中,可以通过数字索引类型获取对应的值。
    ,但是数字索引的返回值必须是字符串索引返回值类型的子类型。 这是因为当使用 number来索引时,JavaScript会将它转换成string然后再去索引对象。 也就是说用 100(一个number)去索引等同于使用"100"(一个string)去索引,因此两者需要保持一致。

    interface StringArray {
      [index: number]: string;
    }
    
    let myArray: StringArray;
    myArray = ["Bob", "Fred"];
    
    let myStr: string = myArray[0];
    

    函数接口

    给接口定义一个调用签名。 它就像是一个只有参数列表和返回值类型的函数定义。参数列表里的每个参数都需要名字和类型。

    interface encrypt {
      (key: string, value: string): string;
    }
    
    // 对传入的参数以及返回值进行约束
    let md1: encrypt = function (key: string, value: string): string {
      return key + value;
    }
    console.log(md1('张三', '初一一班'));
    

    继承接口

    所谓的继承,就是一个接口能够拥有另一个接口的属性和类型,并且在拥有的基础上再添加自己的属性和类型。
    继承不可以覆盖父接口的属性和类型
    继承接口可以继承多个父接口

    interface Person{
      id:number,
      name:string,
      isMale:boolean
    }
    interface Male extends Person {
      isMale:boolean,
      hobby:string,
      eat:(val:string)=>string
    }
    let Got:Male = {
      isMale:true,
      id:1111,
      name:'Got',
      hobby:'basketball',
      eat:(apple)=>{
        return apple
      }
    }
  • 相关阅读:
    什么叫委托
    什么是继承
    什么叫多态
    委托的了解
    什么是数组
    工作记录之 oracle去重的三个方法
    实例分析J2ME网络编程的两种方法
    在无线J2ME设备上实现超文本传输协议
    java与C、C++进行通信的一些问题
    如何配置Wiindows live writer
  • 原文地址:https://www.cnblogs.com/sqh17/p/13570387.html
Copyright © 2020-2023  润新知