接口(Interface)

TypeScript的核心机制之一在于它的类型检查系统(type-checker)只关注一个变量的"模型(shape)" 稍后我们去了解这个所谓的形状是什么东西这种机制我们常称为鸭子类型(duck typing),是动态类型的一种风格.在TypeScript中接口充当着命名这些类型的职责,同时也是一种强大的方式与你的代码内部或外部项目之间定义契约.

定义第一个接口

我们通过一个简单的例子来理解在TypeScript中接口是如何工作的:

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

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

在调用printLable的地方类型检查系统这个函数,它要求传入一个对象并且这个对象中有一个命名为label的属性并且被定义为字符串类型(string). 需要特别强调的是,在上面的代码中,我们传入的对象实际上并不是只有label这一个属性,但是在编译的时候TypeScript的类型检查系统只去检查传入的对象是否包含约定好的属性,并且属性的数据类型正确与否.

我们把上面的例子改写一下,这次我们使用接口来约束函数printLabel所传入的参数,接口中定义一个字符串类型命名为label的属性.

interface LabelledValue {
  label: string;
}

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

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

这次我们使用接口LabelledValue去描述上一个例子中函数printLabel所要求传入的对象,它仍然代表要求传入一个对象并且这个对象中有一个字符串类型的属性命名为label. 通过上例我们可以发现在TypeScript中使用接口并不像在其他语言中那样需要显示的去继承该接口,在这里接口只是描述了一个预先定义好的"模型(shape)",只要我们传入的这个对象中包含接口LabelledValue所定义好的属性,TypeScript的类型检查系统就认为传入的参数是合法的.

另外值得一提的是TypeScript的类型检查系统并不去检查传入的这个对象中属性的顺序,只要传入的这个对象中包含的属性能与接口中定义的属性相匹配就可以.

可选属性(Optional Properties)

在一些特定情况下,并非所有定义在接口中的属性都是有必要的. 可选属性这种模式在我们使用一些类似"option bags"的模式时是非常有用的:

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

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

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

在定义一个含有可选参数的接口时和其它的接口非常相像,只需在属性的名字后追加一个问号(?).

可选属性的一个好处是,虽然可选属性可以被忽略,但当你使用一个可选属性时,TypeScript的类型检查系统依然会监测使用的是否正确.

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

function createSquare(config: SquareConfig): {color: string; area: number} {
  var newSquare = {color: "white", area: 100};
  if (config.color) {
    newSquare.color = config.collor;  // 类型检查系统可以检测出这里的输入错误.(collor并没有被定义在接口SquareConfig中)
  }
  if (config.width) {
    newSquare.area = config.width * config.width;
  }
  return newSquare;
}

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

函数类型(Function Types)

TypeScript中的接口可以描述很多在JavaScript中可定义类型,除了描述一个对象中的属性,也可以描述函数(有点像Delegate).

为了描述一个函数类型的接口,我们为这个接口声明一个函数签名, 看起来就像声明了一个只要参数列表和返回值而没有方法体的函数.

interface SearchFunc {
  (source: string, subString: string): boolean;
}

当定义好一个函数类型的接口后我们可以像使用其他接口那样去使用它. 下面的例子将像你展示如何声明上面这个接口的对象以及为它分配一个与之匹配的函数.

var mySearch: SearchFunc;
mySearch = function(source: string, subString: string) {
  var result = source.search(subString);
  if (result == -1) {
    return false;
  }
  else {
    return true;
  }
}

当为一个函数类型的接口赋值时,TypeScript的类型检查机制只会去检查这个给定函数的参数列表和返回值是否符合要求而并不检查参数的名称是否一致,所以我们可以把上面的列子改写成如下所示:

var mySearch: SearchFunc;
mySearch = function(src: string, sub: string) {
  var result = src.search(sub);
  if (result == -1) {
    return false;
  }
  else {
    return true;
  }
}

当为一个函数类型的接口赋值时,类型检查机制会逐个检查这个给定函数的参数列表中每个参数出现的位置与函数签名中对应位置的参数类型是否相同. 同时也会检查函数的返回类型是否匹配,在上面的例子中我们期待的返回类型是布尔类型(true或false),如果我们赋值一个返回值为数字或字符串类型的函数,TypeScript将会警告我们说返回类型与接口SearchFunc中定义返回类型不匹配(return type doesn't match the return type described in the SearchFunc interface).

TypeScript学习指南第二章--接口(Interface)的更多相关文章

  1. Spring学习指南-第二章-Spring框架基础(完)

    第二章 Spring框架基础 面向接口编程的设计方法 ​ 在上一章中,我们看到了一个依赖于其他类的POJO类包含了对其依赖项的具体类的引用.例如,FixedDepositController 类包含 ...

  2. TypeScript学习指南第一章--基础数据类型(Basic Types)

    基础数据类型(Basic Types) 为了搭建应用程序,我们需要使用一些基础数据类型比如:numbers,strings,structures,boolean等等. 在TypeScript中除了Ja ...

  3. TypeScript学习指南--目录索引

    关于TypeScript: TypeScript是一种由微软开发的自由和开源的编程语言.它是JavaScript的一个超集,而且本质上向这个语言添加了可选的静态类型和基于类的面向对象编程. TypeS ...

  4. Typescript 学习笔记六:接口

    中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...

  5. Knockout应用开发指南 第二章:监控属性(Observables)

    原文:Knockout应用开发指南 第二章:监控属性(Observables) 关于Knockout的3个重要概念(Observables,DependentObservables,Observabl ...

  6. 《DOM Scripting》学习笔记-——第二章 js语法

    <Dom Scripting>学习笔记 第二章 Javascript语法 本章内容: 1.语句. 2.变量和数组. 3.运算符. 4.条件语句和循环语句. 5.函数和对象. 语句(stat ...

  7. The Road to learn React书籍学习笔记(第二章)

    The Road to learn React书籍学习笔记(第二章) 组件的内部状态 组件的内部状态也称为局部状态,允许保存.修改和删除在组件内部的属性,使用ES6类组件可以在构造函数中初始化组件的状 ...

  8. [HeadFrist-HTMLCSS学习笔记]第二章深入了解超文本:认识HTML中的“HT”

    [HeadFrist-HTMLCSS学习笔记]第二章深入了解超文本:认识HTML中的"HT" 敲黑板!!! 创建HTML超链接 <a>链接文本(此处会有下划线,可以单击 ...

  9. 《JS权威指南学习总结--第二章词法结构》

    第二章词法结构 内容要点: 一.注释 1. //表示单行注释 2. /*这里是一段注释*/ 3.一般编辑器里加注释是:选中要加注释的语句,按 ctrl+/ 二.直接量 所谓直接量,就是程序中直接使用的 ...

随机推荐

  1. SurfaceView的使用

    1.概念 SurfaceView是View类的子类,可以直接从内存或者DMA等硬件接口取得图像数据,是个非常重要的绘图视图.它的特性是:可以在主线程之外的 线程中向屏幕绘图上.这样可以避免画图任务繁重 ...

  2. Adroid_Spinner_ArrayAdapter

    XML布局文件 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmln ...

  3. Ant构建和部署项目(转)

    原文地址: http://www.blogjava.net/amigoxie/archive/2007/11/09/159413.html Ant是一个Apache基金会下的跨平台的构件工具,它可以实 ...

  4. 让ubuntu使用root帐号并让winscp以root身份登录

    ubuntu 服务器默认的root账号是没有激活的,需要用初装的用户账号给root设置管理密码: $ sudo passwd root  //用sudo修改root帐户 Password: //输入密 ...

  5. OQL对象查询语言

    在用mat工具分析内存使用情况查询OutOfMemory原因时,OQL会有很大帮助,所以先在这里总结一下. 基本语法: select <javascript expression to sele ...

  6. android之APP+JNI+Drv框架

    以LED为例 APP: JNI之java JNI之c DRV 项目组成:1.应用部分 1.1 APK(android工程) 1.1.1 java(功能) 1.1.2 xml(界面) 1.1.3 JNI ...

  7. CMD/AMD

    AMD 规范在这里:https://github.com/amdjs/amdjs-api/wiki/AMDCMD 规范在这里:https://github.com/seajs/seajs/issues ...

  8. Floyd-Warshall算法详解(转)

    Floyd-Warshall算法,简称Floyd算法,用于求解任意两点间的最短距离,时间复杂度为O(n^3).我们平时所见的Floyd算法的一般形式如下: void Floyd(){ int i,j, ...

  9. Android数据存储方式之SharedPreferences

    Android平台给我们提供了一个SharedPreferences类,它是一个轻量级的存储类,特别适合用于保存软件配置参数.使用SharedPreferences保存数据,其背后是用xml文件存放数 ...

  10. SQLSERVER2000以上 Ad Hoc Distributed Queries的启用与关闭

    SQLSERVER2000以上的版本在查询分析器中查询ACCESS数据时提示:“ 訊息 15281,層級 16,狀態 1,行 1SQL Server 已封鎖元件 'Ad Hoc Distributed ...