接口(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. HTML5 面试中最常问到的 10 个问题

    1. HTML5 新的 DocType 和 Charset 是什么?HTML5 现在已经不是 SGML 的子集,DocType 简化为:                  <!doctype h ...

  2. 解读eXtremeComponents代码结构--转载

    原文地址:http://blog.csdn.net/lark3/article/details/1937466 大致整理了去年写的东西,罗列如下: ec是一系列提供高级显示的开源JSP定制标签,当前的 ...

  3. CentOS 6 下安装Python 3

    可以下载各个版本的python:https://www.python.org/ftp/python/ 配置安装 下载最新的安装包(截止2013/11/05),还是3.3.2版本. #wget http ...

  4. Python基础【第十一篇】文件操作(file()、open()方法和fileinput模块)

    一.file/open 内置函数 file函数的方法: 注:file 和 open的用法和功能相同这里只对file进行分析 file(‘filename’,’mode’) file(‘filename ...

  5. Linux编程简介

    Linux编程可以分为Shell(如BASH.TCSH.GAWK.Perl.Tcl和Tk等)编程和高级语言(C语言,C++语言,java语言等)编程,Linux程序需要首先转化为低级机器语言即所谓的二 ...

  6. javascript中new Date浏览器兼容性处理

    看下面的代码 <script type="text/javascript"> var dt1 = new Date('2016-3-4 11:06:12'); aler ...

  7. <你不知道的JavaScript>读书笔记

    近几天看了一本不错的 JavaScript 的书,是 Kyle Simpson 写的 <You Don't know JS>.这本书是 Kyle Simpson 在 Github 上的开源 ...

  8. Java内存分配全面浅析(转)

           原文引自CSDN:        本文将由浅入深详细介绍Java内存分配的原理,以帮助新手更轻松的学习Java.这类文章网上有很多,但大多比较零碎.本文从认知过程角度出发,将带给读者一个 ...

  9. 利用sys.dm_db_index_physical_stats查看索引碎片等数据(转)

    我们都知道,提高sql server的数据查询速度,最有效的方法,就是为表创建索引,而索引在对数据进行新增,删除,修改的时候,会产生索引碎片,索引碎片多了,就需要重新组织或重新生成索引,以达到索引的最 ...

  10. Oracle之初始创建scott/tiger来测试

    在redhat5.5(32bit)上安装好oracle11g数据库软件,然后安装一个数据库,再然后登录数据库,创建scott/tiger测试 首先登录数据库,这里登录时是没有启动数据库的 [oracl ...