TypeScript基础(二) -- 接口

接口

description:对值所具有的结构进行类型检查
注意:传入的对象参数实际上会包含很多属性,但是编译器只会检查那些必需的属性是否存在,并且检查其类型是否匹配(话虽如此,但是引用没有被检查的属性时还是会报错hhhhh,所以最好要做到一一对应)

// 注意:
interface LabelValue {
  label: string
}
function print(labelObj: LabelValue){
  console.log(labelObj)
}
  • 只读属性(readonly)

    interface Point{
      readonly x: number;
      readonly y: number;
    }
    
    // 数组的只读(ReadyonlyArray)
    let arr: ReadyonlyArray<number> = [1,2,3]
    arr[0] = 12; // error!
    arr.push(5); // error!
    arr.length = 100; // error!
    let a = arr; // error!  可以看到就算把整个ReadonlyArray赋值到一个普通数组也是不可以的  可以用断言重写 a = arr as number[];
    
  • 可选属性(?😃
    可选属性只意味着接口实例里可以没有这个的属性,并不意味着可以多出其他的属性(有时候不会触发额外的检查,下面会讲到)

  • 额外的检查

    interface SquareConfig {
      color?: string;
      width?: string;
    }
    function createSquare(config: SquareConfig) {
      // ...
    }
    
    // 以字面量形式传入,会触发额外的检查(检查是否有不在接口定义中的属性)
    let mySquare = createSquare({ colour: "red", width: 100 });  
    
    // 以变量形式传入,不会触发额外的检查
    let obj = { colour: "red", width: 100 }
    let mySquare = createSquare(obj);
    
    // 怎么绕开这个额外的检查呢?
    // 方法一: 以变量形式传入(如上)
    
    // 方法二: 断言
    let mySquare = createSquare({ width: 100, opacity: 0.5 } as SquareConfig);
    
    // 方法三:添加一个字符串索引签名(前提是你能够确定这个对象可能具有某些做为特殊用途使用的额外属性)
    interface SquareConfig {
      color?: string;
      width?: number;
      [propName: string]: any; // 接口定义为此形式(表示的是SquareConfig可以有任意数量的属性,并且只要它们不是color和width,那么就无所谓它们的类型是什么)
      // ps:索引签名的名称(如:{ [index: string]: { message: string } } 里的 index )除了可读性外,并没有任何意义
    }
    
  • 接口表示函数类型(就像是一个只有参数列表和返回值类型的函数定义)

    interface SearchFunc {
      (source: string, subString: string): boolean
    }
    
    let fn: SearchFunc;
    fn = (source:string) => { }   // 注意:这里只传一个参数是可以的,但只能是string类型(与接口对应)  并且,函数的参数名不需要与接口里定义的名字相匹配(source也可以写成s...)
    
  • 可索引类型

    • 可索引类型具有一个索引签名,它描述了对象索引的类型,还有相应的索引返回值类型
    • ts支持两种索引签名:字符串和数字,但是数字索引的返回值必须是字符串索引返回值类型的子类型(因为当使用 number来索引时,JavaScript会将它转换成string然后再去索引对象。 也就是说用 100(一个number)去索引等同于使用"100"(一个string)去索引,因此两者需要保持一致)
    class Animal {
      name: string;
    }
    class Dog extends Animal {
        breed: string;
    }
    
    // 错误:使用数值型的字符串索引,有时会得到完全不同的Animal!
    interface NotOkay {
        [x: number]: Animal;   // Animal不是Dog的子类型(error)
        [x: string]: Dog;
    }
    
    • 字符串索引签名能够很好的描述dictionary模式,并且它们也会确保所有属性与其返回值类型相匹配
    interface NumberDictionary {
      [index: string]: number;
      length: number;    // 可以,length是number类型
      name: string       // 错误,`name`的类型与索引类型返回值的类型不匹配
    }
    
    • 可以将索引签名设置为只读,这样就防止了给索引赋值
    interface ReadonlyStringArray {
      readonly [index: number]: string;
    }
    let myArray: ReadonlyStringArray = ["Alice", "Bob"];
    myArray[2] = "Mallory"; // error!
    
  • 类类型

    interface ClockInterface {
      currentTime: Date;
      setTime(d: Date): void;
    }
    
    // 构造器签名(检查构造函数类型)
    interface ClockConstructor {
      new (hour: number, minute: number);
    }
    
    // ts检查类型
    class Clock implements ClockInterface {
      currentTime = new Date();
      setTime(d: Date){}
      constructor(h: number, m: number){
        // 接口描述了类的公共部分,而不是公共和私有两部分。 它不会帮你检查类是否具有某些私有成员。
      }
    }
    
  • 接口继承类
    当接口继承了一个类类型时,它会继承类的成员但不包括其实现。 就好像接口声明了所有类中存在的成员,但并没有提供具体实现一样。 接口同样会继承到类的private和protected成员。 这意味着当你创建了一个接口继承了一个拥有私有或受保护的成员的类时,这个接口类型只能被这个类或其子类所实现

已标记关键词 清除标记
【为什么还需要学习C++?】 你是否接触很多语言,但从来没有了解过编程语言的本质? 你是否想成为一名资深开发人员,想开发别人做不了的高性能程序? 你是否经常想要窥探大型企业级开发工程的思路,但苦于没有基础只能望洋兴叹?   那么C++就是你个人能力提升,职业之路进阶的不之选。 【课程特色】 1.课程共19大章节,239课时内容,涵盖数据结构、函数、类、指针、标准库全部知识体系。 2.带你从知识与思想的层面从0构建C++知识框架,分析大型项目实践思路,为你打下坚实的基础。 3.李宁老师结合4大国外顶级C++著作的精华为大家推出的《征服C++11》课程。 【学完后我将达到什么水平?】 1.对C++的各个知识能够熟练配置、开发、部署; 2.吊打一切关于C++的笔试面试题; 3.面向物联网的“嵌入式”和面向大型化的“分布式”开发,掌握职业钥匙,把握行业先机。 【面向人群】 1.希望一站式快速入门的C++初学者; 2.希望快速学习 C++、掌握编程要义、修炼内功的开发者; 3.有志于挑战更高级的开发项目,成为资深开发的工程师。 【课程设计】 本课程包含3大模块 基础篇 本篇主要讲解c++的基础概念,包含数据类型、运算符等基本语法,数组、指针、字符串等基本词法,循环、函数、类等基本句法等。 进阶篇 本篇主要讲解编程中常用的一些技能,包含类的高级技术、类的继承、编译链接和命名空间等。 提升篇: 本篇可以帮助学员更加高效的进行c++开发,其中包含类型转换、文件操作、异常处理、代码重用等内容。
©️2020 CSDN 皮肤主题: 深蓝海洋 设计师:CSDN官方博客 返回首页