第五章 接口

接口

一、介绍

  • TypeScript 的核心原则之一是对值所具有的结构进行类型检查。 它有时被称做“鸭式辨型法”或“结构性子类型化”。 在 TypeScript 里,接口的作用就是为这些类型命名和为你的代码或第三方代码定义契约

二、接口初探

interface LabelledValue {
    label: string;
}

function printLabel(labelledObj: LabelledValue) {
    console.log(labelledObj.label);
}

let myObj = { size: 10, label: "Size 10 Object" };
printLabel(myObj);

三、可选属性

interface SquareConfig {
    color?: string;
    width?: number;
}

function createSquare(config: SquareConfig): { color: string; area: number } {
    let newSquare = { color: "white", area: 100 };
    if (config.color) {
        newSquare.color = config.color;
    }
    if (config.width) {
        newSquare.area = config.width * config.width;
    }
    return newSquare;
}

let mySquare = createSquare({ color: "black" });

四、只读属性

  • readonly
interface Point {
    readonly x: number;
    readonly y: number;
}
  • ReadonlyArray类型
let a: number[] = [1, 2, 3, 4];
let ro: ReadonlyArray<number> = a;
ro[0] = 12; // error!
ro.push(5); // error!
ro.length = 100; // error!
a = ro; // error!
  • readonly vs const
  • 最简单判断该用 readonly 还是 const 的方法:是看要把它做为变量使用还是做为一个属性。 做为变量使用的话用 const,若做为属性则使用 readonly。

五、额外的属性检查

interface SquareConfig {
    color?: string;
    width?: number;
}

function createSquare(config: SquareConfig): { color: string; area: number } {
    // ...
}

// error: 'colour' not expected in type 'SquareConfig'
let mySquare = createSquare({ colour: "red", width: 100 });

六、函数类型

  • 接口能够描述 JavaScript 中对象拥有的各种各样的外形。 除了描述带有属性的普通对象外,接口也可以描述函数类型。
  • 为了使用接口表示函数类型,我们需要给接口定义一个调用签名。 它就像是一个只有参数列表和返回值类型的函数定义。参数列表里的每个参数都需要名字和类型。
//使用接口表示函数类型
interface SearchFunc {
    (source: string, subString: string): boolean;
}

//使用这个函数类型的接口,创建一个函数类型的变量,并将一个同类型的函数赋值给这个变量
let mySearch: SearchFunc;
mySearch = function(source: string, subString: string) {
    let result = source.search(subString);
    return result > -1;
};

七、可索引的类型

  • 与使用接口描述函数类型差不多,我们也可以描述那些能够“通过索引得到”的类型,比如 a[10]或 ageMap["daniel"]。 可索引类型具有一个 索引签名,它描述了对象索引的类型,还有相应的索引返回值类型。
interface StringArray {
    [index: number]: string;
}
let myArray: StringArray;
myArray = ["Bob", "Fred"];
let myStr: string = myArray[0];

//字符串索引签名能够很好的描述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!

八、类类型

  • 实现接口
//与C#或Java里接口的基本作用一样,TypeScript也能够用它来明确的强制一个类去符合某种契约。
interface ClockInterface {
    currentTime: Date;
}

class Clock implements ClockInterface {
    currentTime: Date;
    constructor(h: number, m: number) {}
}

//你也可以在接口中描述一个方法,在类里实现它,如同下面的setTime方法一样
interface ClockInterface {
    currentTime: Date;
    setTime(d: Date);
}

class Clock implements ClockInterface {
    currentTime: Date;
    setTime(d: Date) {
        this.currentTime = d;
    }
    constructor(h: number, m: number) {}
}
//PS:接口描述了类的公共部分,而不是公共和私有两部分。 它不会帮你检查类是否具有某些私有成员

九、继承接口

//和类一样,接口也可以相互继承
interface Shape {
    color: string;
}

interface Square extends Shape {
    sideLength: number;
}

let square = <Square>{};
square.color = "blue";
square.sideLength = 10;

//一个接口可以继承多个接口,创建出多个接口的合成接口
interface Shape {
    color: string;
}

interface PenStroke {
    penWidth: number;
}

interface Square extends Shape, PenStroke {
    sideLength: number;
}

let square = <Square>{};
square.color = "blue";
square.sideLength = 10;
square.penWidth = 5.0;

十、混合类型

//一个对象可以同时做为函数和对象使用,并带有额外的属性
interface Counter {
    (start: number): string;
    interval: number;
    reset(): void;
}

function getCounter(): Counter {
    let counter = <Counter>function(start: number) {};
    counter.interval = 123;
    counter.reset = function() {};
    return counter;
}

let c = getCounter();
c(10);
c.reset();
c.interval = 5.0;

十一、接口继承类

  • 当接口继承了一个类类型时,它会继承类的成员但不包括其实现。 就好像接口声明了所有类中存在的成员,但并没有提供具体实现一样。 接口同样会继承到类的 private 和 protected 成员。 这意味着当你创建了一个接口继承了一个拥有私有或受保护的成员的类时,这个接口类型只能被这个类或其子类所实现(implement)
class Control {
    private state: any;
}

interface SelectableControl extends Control {
    select(): void;
}

class Button extends Control implements SelectableControl {
    select() {}
}

class TextBox extends Control {}

// 错误:“Image”类型缺少“state”属性。
class Image implements SelectableControl {
    select() {}
}

class Location {}

原文地址:https://www.cnblogs.com/zfc2201/p/8157597.html

时间: 2024-08-29 10:17:52

第五章 接口的相关文章

第十五章 接口和集合

1.  接口的关键字:interface 2.  接口的特性: 1)接口属性都是静态常量 2)方法都是抽象方法 3)实现类必须实现接口的所有方法 4)实现类可以实现多个接口 5)接口不能被实例化,没有构造方法 6)接口中的方法不能私有化 3.  实现的关键字:implements 4.  子类和父类是is a 的关系     实现类和接口是has a 的关系 5.  集合:可以存放一组不同或相同类的数据. 6.  接口: collection List Set 类        Arraylis

C#图解教程 第十五章 接口

接口 什么是接口 使用IComparable接口的示例 声明接口实现接口 简单接口示例 接口是引用类型接口和as运算符实现多个接口实现具有重复成员的接口多个接口的引用派生成员作为实现显式接口成员实现 访问显式接口成员实现 接口可以继承接口不同类实现一个接口的示例 接口 什么是接口 接口是指定一组函数成员而不实现它们的引用类型.所以只能类和结构来实现接口. 这种描述比较抽象,直接来看个示例. 下例中,Main方法创建并初始化了一个CA类的对象,并将该对象传递给PrintInfo方法. class

“全栈2019”Java第八十五章:实现接口中的嵌套接口

难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第八十五章:实现接口中的嵌套接口 下一章 "全栈2019"Java第八十六章:嵌套接口可以多继承吗? 学习小组 加入同步学习小组,共同交流与进步. 方式一:关注头条号Gorhaf,私信"Java学习小组". 方式二:关注公众号Gorhaf,回复"Java学习小组

深入浅出Zabbix 3.0 -- 第十五章 Zabbix 协议与API

今天是六.一儿童节,祝小朋友们节日快乐!发完此文就带我家小朋友出去玩耍了. 第十五章 Zabbix 协议与API 本章将介绍和开发相关的Zabbix协议和API的内容,通过对Zabbix协议和API的深入了解,你可以利用Zabbix协议编写客户端程序并将其嵌入的产品或系统中,并将数据发送到Zabbix server,这在无法安装Zabbixagent等程序的场景(例如专用的嵌入式系统)中非常有用.你也可以利用Zabbix API开发自己的业务系统,或灵活的与现有系统整合集成. 15.1 Zabb

C和指针 (pointers on C)——第十五章:输入输出函数

第十五章 输入输出函数 这一章读完的第一感觉就是"呵呵". 如果说上过C语言课,基本上scanf()/printf()算是用的比较熟练了.尤其是那些抽象的格式说明.还有scanf()为什么要加括号. 读过本书前面的内容的话,getchar(),putchar(),gets(),puts()这些应该也问题不大. 再如果的话,你学过计算机图形学,你玩过OpenGL,听说过双缓存机制,那么fflush()也肯定弄明白了. 再加上FILE的操作,输入输出定位刷新删除改名,流的概念. 这一章就会

Java Persistence with MyBatis 3(中文版) 第五章 与Spring集成

MyBatis-Spring是MyBatis框架的子模块,用来提供与当前流行的依赖注入框架Spring的无缝集成. Spring框架是一个基于依赖注入(Dependency Injection)和面向切面编程(Aspect Oriented Programming,AOP)的Java框架,鼓励使用基于POJO的编程模型.另外,Spring提供了声明式和编程式的事务管理能力,可以很大程度上简化应用程序的数据访问层(data access layer)的实现.在本章中,我们将看到在基于Spring的

大道至简第五章阅读笔记

这次第五章的内容谈到了工程的实质内容,那就是做工程做项目的过程.在一个项目中,理解了客户的需求之后就该分析具体的实施计划,很多人总是会做瀑布模型然后按照模型的样子去做完过程的每一个阶段,但是每个阶段又是做过场一样,说起来是有这个步骤,有这一项的规划,但真正的实质内容并没有多少,这样的过场真的是没有什么意义,只是空有其表罢了,做一个项目,我们面对的的客户,我们在最后是要把成型的,有用的,能达到客户要求的项目拿出来的,所以说实现才是我们最终的目的,无论我们要做的是一个小的工具还是一个大的项目,做工程

《android深入探索》第五章心得

看了本书第五章,我了解到了: 使用开发板的原因: 是学习嵌入式技术的主要设备. arm的开发板可基于X86架构的PC在CPU指令及二进制指令格式上都有所不同,且若linux驱动要访问硬件(LCD.Wifi.蓝牙等),并且这些硬件在PC上很难进行模拟,所以就要在带有这些硬件的开发板上进行调试和测试. 与手机类似,比手机更容易安装嵌入式系统,有很多扩展的端口,容易开发定制硬件. S3C6410开发板:三星公司推出的一款低功耗.高性价比的RISC精简指令集处理器,基于ARM11内核,提供了优化的2.5

软件设计(第五章)

1.软件系统 2.分解为子系统或包 识别出所有的子系统,包括:确定如何把系统分为主要的子系统,并清楚定义子系统如何使用其他子系统. 子系统之间的交互:一个子系统去调用另外一个子系统的子程序:一个子系统包含另一个子系统中的类:一个子系统继承自另外一个子系统中的类: 常用的子系统:业务规则,用户界面,数据库访问,对系统的依赖性 3.分解为类 识别出系统中所有的类 定义这些类与系统的其余部分打交道的细节 4.分解为子程序 把每个类细分为子程序,将第3步中定义的类接口,细化为类的私用子程序 5.子程序内