接口(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. POJ3056:The Bavarian Beer Party(区间DP)

    Description The professors of the Bayerische Mathematiker Verein have their annual party in the loca ...

  2. How to Map Distinct Value Types Using Java Generics--reference

    原文:http://www.codeaffine.com/2015/03/04/map-distinct-value-types-using-java-generics/ Occasionally t ...

  3. 斐波那契数列_java版本

    package 斐波那契数列; public class fbnq { public static void main(String[] args){ System.out.println(fibon ...

  4. 【安卓小技巧】WebView设置在本页面打开网页,而不是启动浏览器打开

    使用WebView可以巧妙的在安卓APP中嵌入HTML页面, WebView wb = (WebView) findViewById(R.id.web); //找到WebView控件 wb.setWe ...

  5. Java项目打包在CMD或者Linux下运行

    Java项目打包在CMD或者Linux下运行 1.在CMD下运行 在eclipse中将项目export成jar包,然后用压缩软件解压

  6. java基础学习总结五(递归算法、冒泡排序、查看生成API)

    一:递归算法 概念:自己调用自己的方法 示例代码如下: @Test /** * 递归求和 * 5+4+3+2+1=15 */ public void getSum() { long sum = sum ...

  7. 这五个题你懂了javascript你就入门了

    1. if (!("a" in window)) { var a = 1; } alert(a); 阅读代码:如果window不包含属性a,就声明一个变量a,然后赋值为1,最后弹出 ...

  8. .NET学习笔记(2) — IIS服务器环境搭建

    目录 一:开启Windows系统自带的IIS服务器方法 二:备注 三:常见问题     一:开启Windows系统自带的IIS服务器方法   第一步:安装IIS,控制面板->程序和功能-> ...

  9. 优雅的使用 PhpStorm 来开发 Laravel 项目

    [目录] Prerequisites plugin installation and configuration 1 Ensure Composer is initialized 2 Install ...

  10. ArrayList() 输出

    import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.Li ...