zoukankan      html  css  js  c++  java
  • Typescript的接口

    typescript文档

    https://www.tslang.cn/docs/handbook/jsx.html

    接口的作用:

      在面向对象的编程中,接口是一种规范的定义,它定义了行为和动作的规范,在程序设计里面,接口起到一种限制和规范的作用。接口定义了某一批类所需要遵循的规范,接口不关心这些类的内部状态数据,也不关心这些类里面方法的具体实现细节,只规定这批类里必须提供某些方法,提供这些方法的类就可以满足实际需要。typescript中的接口类似于java,同时增加了更灵活的接口类型,包括属性、函数、可索引和类等。

    • 接口约束json结构,首先创建一个空目录,终端输入:tsc --init,修改json文件, 创建一个index.html文件,最后创建一个index.ts文件,修改vscode配置,自动生成js
      // ts中定义方法,其实通过参数的传递及格式要求,就是一种接口约束
      function printLabel(name:string):void{ // 参数的约束
          console.log(name)
      }
      printLabel("Ok")
      
      // ts 中自定义方法传入参数对 json进行约束
      function printLabel_1(labelInfo:{label:string}):void{ // 参数的约束
          console.log(labelInfo.label)
      }
      printLabel_1({label:"Nice"}) // 传入带有label的对象
      
      //1、 ts 实现批量方法的传入参数的约束,可以使用接口
      
      interface fullName {   // 定义接口
          // 对象必须要携带以下参数
          firstName:string;
          secondName:string;
      }
      
      function printLabel_2(name:fullName):void{ // 参数的约束
          console.log(name.firstName + "--" + name.secondName)
      }
      
      var obj = {  // 推荐这样写,外部写对象,再传入,这样可以添加额外的age,不会报错
          age:20,
          firstName:"wu",
          secondName:"yu",
      }
      printLabel_2({firstName:"wang",secondName:"li"}) // 传入带有label的对象
      printLabel_2(obj)
      
      function printLabel_3(name:fullName):void{ // 也可以实现这个接口
          console.log(name.firstName + "--" + name.secondName)
      }
      
      
      //2、可选接口属性
      interface fullName1 {   // 定义接口
          // 对象必须要携带以下参数
          firstName:string;
          secondName?:string;  // 通过?使其成为可选参数,不是必须要这个参数
      }
      
      function printLabel_4(name:fullName1):void{ // 也可以实现这个接口
          if (name.secondName){
              console.log(name.firstName + "--" + name.secondName)
          }else{
              console.log(name.firstName+"没有secondName")
          }    
      }
      
      printLabel_4({firstName:"xi",secondName:"he"})
      printLabel_4({firstName:"lisi"}) 
    • 函数类型接口: 对方法接入的参数以及返回值进行约束,接口约束函数
      // 函数类型接口, 实现加密函数
      interface encrypt {
          (key:string,value:string):string  // 之前的是约束参数的,这里是约束函数的
      }
      
      var md5:encrypt = function(key:string,value:string):string{  // 约束函数
          // 模拟操作
          return key+value
      }
      
      var sha1:encrypt = function(key:string,value:string):string{  // 约束函数
          // 模拟操作
          return key+value+"加密"
      }
      
      // 接口约束函数
      alert(md5("name","张三"))  
    • 可索引接口,数组、对象的约束
      //1、 中数组约束
      interface UserArr {
          [index:number]:string  // 通过接口越是数组的类型,索引是数值类型,值为value
          // [index:number]:any  // 通过接口越是数组的类型,索引是数值类型,值为any
      }
      
      var arr:UserArr=['1212','1233','aaa']
      alert(arr[1])  // 1233
      alert(arr[2])  // aaa
      
      //2、 对对象的约束
      interface userObj {
          [index:string]:string
      }
      
      var obj:userObj = {
          name:"wang",
          xing:"li",
          // age:20,  // 错误
      }  
    • 类类型接口和抽象类有点相似
      interface Animal {
          name:string     // 类属性接口约束
          eat(str:string):void  // 类方法接口约束
      }
      
      class Dog implements Animal {
          name:string;
          constructor(name:string){
              this.name = name
          }
          eat(){   // 必须实现eat方法否则报错,可不传name
              console.log(this.name+'吃粮食')
          }
      }
      var d = new Dog("小黑")
      d.eat()
    • 接口的扩展,也就是说接口可以继承接口
      interface Animal1 {
          eat():void;
      }
      
      interface Person extends Animal1 {  // 继承Animal1接口
          work():void;
      }
      
      class Web implements Person {  // 类继承Person,就需要实现各自的接口
          public name:string;
          constructor(name:string){
              this.name = name
          }
      
          eat(){
              console.log(this.name+"馒头喜欢")
          }
      
          work(){
              console.log(this.name+"正在工作")
          }
      }
      
      var w = new Web("小李")
      w.eat();
      w.work();
      
      class Programmer {
          public name:string;
          constructor(name:string){
              this.name = name;
          }
      
          coding(code:string) {
              console.log(this.name+code)
          }
      }
      
      
      // 复杂结构的类的继承+接口扩展
      class Web_1 extends Programmer implements Person {  // 类继承Person,就需要实现各自的接口
          constructor(name:string){
              super(name)
          }
      
          eat(){
              console.log(this.name+"馒头喜欢")
          }
      
          work(){
              console.log(this.name+"正在工作")
          }
      }
      
      var w1  = new Web_1("小王")
      w1.coding('ts代码')
      w1.eat();

    案例

    1、书写一个ajax的方法实现接口约束

    // 约束ajax的传入参数配置
    interface Config{
        type:string;
        url:string;
        data?:string;
        dataType:string;
    }
    
    function ajax(config:Config){
        var xhr = new XMLHttpRequest();
        xhr.open(config.type,config.url,true);
        xhr.send(config.data);
        xhr.onreadystatechange = function() {
            if (xhr.readyState==4 && xhr.status==200){
                console.log("success")
    
                if (config.dataType=='json'){
                    console.log(JSON.parse(xhr.responseText))
                }else{
                    console.log(xhr.responseText)
                }
            }
        }
    }
    
    ajax({
        type:'get',
        url:'http://a.itying.com/api/productlist',
        dataType:'json'
    })
  • 相关阅读:
    Asynchronous AOF fsync is taking too long (disk is busy?). Writing the AOF buffer without waiting for fsync to complete, this may slow down Redis.
    DHCP "No subnet declaration for xxx (no IPv4 addresses)" 报错
    Centos安装前端开发常用软件
    kubernetes学习笔记之十:RBAC(二)
    k8s学习笔记之StorageClass+NFS
    k8s学习笔记之ConfigMap和Secret
    k8s笔记之chartmuseum搭建
    K8S集群集成harbor(1.9.3)服务并配置HTTPS
    Docker镜像仓库Harbor1.7.0搭建及配置
    Nginx自建SSL证书部署HTTPS网站
  • 原文地址:https://www.cnblogs.com/double-W/p/12873328.html
Copyright © 2011-2022 走看看