TypeScript - Interfaces

简介

关注于数据值的 ‘shape’的类型检查是TypeScript核心设计原则。这种模式有时被称为‘鸭子类型’或者‘结构子类型化’。 。 在TypeScript中接口interfaces的责任就是命名这些类型,而且还是你的代码之间或者是与外部项目代码的契约。

初见Interface

理解interface的最好办法,就是写个hello world程序:


1

2

3

4

5

6

function printLabel(labelledObj: {label: string}) {

  console.log(labelledObj.label);

}

 

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

printLabel(myObj);

在这里类型检查系统会检查printLabel这个函数,printLabel函数要求传入一个包含一个label的字符串属性。上例可以了解我们传入的对象可以有多个属性,但是类型检查系统只会检查printLabel所要求的label属性是否满足其要求。

接下来我们可以进一步简化,声明一个interface来描述一个具有label字符串属性的对象:


1

2

3

4

5

6

7

8

9

10

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的字符串属性。可以看见我们利用‘shape’(行)描述了printLabel的传入参数要求。

可选的Properties

有时不是所有定义在interface中的属性都是必须的。例如流行的”option bags”模式(option配置),使用者可以之传入部分定制化属性。如下面“option bags”模式:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

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"});

带有可选属性的interface定义和c#语言很相似,以’?‘紧跟类型后边表示。

interface的可选属性可以限制那些属性是可用的,这部分能得到类型检查,以及智能感知。例如下例:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

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.

  }

  if (config.width) {

    newSquare.area = config.width * config.width;

  }

  return newSquare;

}

 

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

函数类型

Interfaces为了描述对象能接收的数据形(shapes)的返回。对于interface不仅难呢过描述对象的属性,也能描述函数类型。

下面是定义的interface signature是一个接收两个string的输入参数,并返回boolean的函数类型:


1

2

3

interface SearchFunc {

  (source: string, subString: string): boolean;

}

我也可以使用函数类型的interface去描述我们的数据。下面演示如何将一个相同类型的函数赋值给interface:


1

2

3

4

5

6

7

8

9

10

var mySearch: SearchFunc;

mySearch = function(source: string, subString: string) {

  var result = source.search(subString);

  if (result == -1) {

    return false;

  }

  else {

    return true;

  }

}

对于函数类型的interface,并不需要参数名的对应相同,如下例:


1

2

3

4

5

6

7

8

9

10

var mySearch: SearchFunc;

mySearch = function(src: string, sub: string) {

  var result = src.search(sub);

  if (result == -1) {

    return false;

  }

  else {

    return true;

  }

}

对于函数参数的检查,会按照参数的顺序检查对应的类型是否匹配。同时也会检查函数的返回类型是否匹配,在这个函数我们期望返回boolean类型true/false, 如果返回的是numbers或者string,则类型检查系统会提示返回值类型不匹配。

数组类型

类似于函数类型,TypeScript也可以描述数组类型。在数组类型中有一个’index’类型其描述数组下标的类型,以及返回值类型描述每项的类型,如下:


1

2

3

4

5

6

interface StringArray {

  [index: number]: string;

}

 

var myArray: StringArray;

myArray = ["Bob""Fred"]

index的支持两种类型,分别是字符串和数值类型. 我们可以限制index的类型,同时也可以检查index项的返回值类型。

index的类型签名可以描述常用的数组或者是‘dictionary’(字典序)模式,这点会强制所有的属性都需要和其返回值匹配。下例中length属性不匹配这点,所以类型检查会给出一个错误:


1

2

3

4

interface Dictionary {

  [index: string]: string;

  length: number;    // error, the type of 'length' is not a subtype of the indexer

}

Class类型

实现interface

在C#和java中interface是很常使用的类型系统,其用来强制其实现类符合其契约。在TypeScript中同样也可以实现:


1

2

3

4

5

6

7

8

interface ClockInterface {

    currentTime: Date;

}

 

class Clock implements ClockInterface  {

    currentTime: Date;

    constructor(h: number, m: number) { }

}

同样也可以在interface中实现函数类型的契约,并要求clas实现此函数。如下例的‘setTime’函数:


1

2

3

4

5

6

7

8

9

10

11

12

interface ClockInterface {

    currentTime: Date;

    setTime(d: Date);

}

 

class Clock implements ClockInterface  {

    currentTime: Date;

    setTime(d: Date) {

        this.currentTime = d;

    }

    constructor(h: number, m: number) { }

}

interface描述的的是class的公开(public)部分,而不是私有部分.

类static/instance区别

当使用类和接口的时候,我们需要知道类有两种类型:static(静态)部分和instance(实例)部分。如果尝试一个类去实现一个带有构造签名的interface,TypeScript类型检查会提示你错误。


1

2

3

4

5

6

7

8

interface ClockInterface {

    new (hour: number, minute: number);

}

 

class Clock implements ClockInterface  {

    currentTime: Date;

    constructor(h: number, m: number) { }

}

这是因为一个类去实现接口的时候,只有instance(实例)的部分才会被检查。而构造函数属于静态部分,所以不会被类型检查。

相反你可以直接在类中实现这些(static)静态部分,如下例:


1

2

3

4

5

6

7

8

9

10

11

12

interface ClockStatic {

 

new (hour: number, minute: number);

}

 

class Clock {

 

currentTime: Date;

constructor(h: number, m: number) { }

}

 

var cs: ClockStatic = Clock; var newClock = new cs(7, 30);

interface的继承

和类一样,接口也能集成其他的接口。这相当于复制接口的所有成员。接口的集成是的我们可以自由的抽象和分离到可重用的组件。


1

2

3

4

5

6

7

8

9

10

11

interface Shape {

    color: string;

}

 

interface Square extends Shape {

    sideLength: number;

}

 

var square = <Square>{};

square.color = "blue";

square.sideLength = 10;

一个interface可以同时集成多个interface,实现多个接口成员的合并。


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

interface Shape {

    color: string;

}

 

interface PenStroke {

    penWidth: number;

}

 

interface Square extends Shape, PenStroke {

    sideLength: number;

}

 

var square = <Square>{};

square.color = "blue";

square.sideLength = 10;

square.penWidth = 5.0;

混合式类型

如前边提到的一样,在interface几乎可以描述JavaScript世界的一切对象。因为JavaScript是一个动态,灵活的脚本语言,所以偶尔也希望一个对象能够描述一些多个类型.

下面是一个混合式描述函数,对象以及额外属性的实例:


1

2

3

4

5

6

7

8

9

10

interface Counter {

    (start: number): string;

    interval: number;

    reset(): void;

}

 

var c: Counter;

c(10);

c.reset();

c.interval = 5.0;

和第三方JavaScript库交互的时候,也许我们也会上面的模式来描述一个完整的类型。

作者:破  狼 
出处:http://www.cnblogs.com/whitewolf/ 
本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。该文章也同时发布在我的独立博客中-个人独立博客博客园--破狼51CTO--破狼。http://www.cnblogs.com/whitewolf/p/4103328.html

时间: 2024-11-02 18:43:33

TypeScript - Interfaces的相关文章

TypeScript 中接口详解

  TypeScript核心设计原则之一就是类型检查,通过使用接口(Interfaces)可以进行类型检查,满足传统面向对象思想,利于有效开发,有效避免类型转换问题. 在 TypeScript 中,接口是用作约束作用的,在编译成 JavaScript 的时候,所有的接口都会被擦除掉,因为 JavaScript 中并没有接口这一概念. 先看看一个简单的例子: ? 1 2 3 4 5 6 function printLabel(labelledObj: { label: string }) { co

浅谈TypeScript

  TypeScript为JavaScript的超集(ECMAScript6), 这个语言添加了基于类的面向对象编程.TypeScript作为JavaScript很大的一个语法糖,本质上是类似于css的less.sass,都是为了易于维护.开发,最后还是编译成JavaScript.趁着周末的时间,浅尝了Typescript,下面是总结的一些特性.   Types 所有类型都是any类型的子类型,其他类型被分成元类型(primitive types)和对象类型(object types). 1.

TypeScript小白入门教程

TypeScript是由微软开发的一种开源编程语言,它是JavaScript的超集,在其基础上添加了可选的静态类型和基于类的面向对象编程.TypeScript可以编译成纯JavaScript,支持所有的JavaScript语法,因此可以在任何浏览器.任何计算机和任何操作系统上运行.TypeScript使得开发者可以使用一些未来JavaScript标准中的特性,让大型JavaScript应用可以使用更好的工具并拥有更清晰的结构. TypeScript与ECMAScript.JavaScript的关

TypeScript Type Innference(类型判断)_javascript技巧

TypeScript 是微软开发的 JavaScript 的超集,TypeScript兼容JavaScript,可以载入JavaScript代码然后运行.TypeScript与JavaScript相比进步的地方 包括:加入注释,让编译器理解所支持的对象和函数,编译器会移除注释,不会增加开销:增加一个完整的类结构,使之更新是传统的面向对象语言. 为什么会有 TypeScript? JavaScript 只是一个脚本语言,并非设计用于开发大型 Web 应用,JavaScript 没有提供类和模块的概

TypeScript - 基本类型系统

对于程序来说我们需要基本的数据单元,如:numbers, strings, structures, boolean 等数据结构.在TypeScript中我们支持很多你所期望在JavaScript中所拥有的数据类型系统. Boolean 在JavaScript和TypeScript中也具有最基本的逻辑断言值true/false,采用'boolean'类型. 1 var isDone: boolean = false; Number 如JavaScript,TypeScript所有的数值类型采用浮点

TypeScript 强类型 JavaScript – Rafy Web 框架选型

今天看到了 AngularJs 2.0 版本将基于 TypeScript 构建 的消息.与同事们对 TypeScript 展开了讨论.本文记录一些个人的想法.   理想的 JavaScript 开发模式 其实早在 TypeScript 发布早期的时候,我就已经开始关注这个语言.因为在2012年初时,我需要为 Rafy/OEA 平台选型编写 Web 端自动界面生成框架:Rafy.js.而这个客户端框架需要基于一些流行的 JS 库来进行开发,当时选型的重点就是选择哪一个基础框架. 当时,我期望能找到

产品前端重构(TypeScript、MVC框架设计)

最近两周完成了对公司某一产品的前端重构,本文记录重构的主要思路及相关的设计内容. 公司期望把某一管理类信息系统从项目代码中抽取.重构为一个可复用的产品.该系统的前端是基于 ExtJs 5 进行构造的,后端是基于 Asp.net MVC 提供的 REST 数据接口.同时,希望通过这次重构,不但能将其本身重构至可用于快速二次开发的产品,同时还要求该前端代码要保证相对的独立,使得同时可以接入 .NET 和 JAVA 两个不同的后端平台所提供的数据接口.   旧代码的问题 老系统的前端代码如下图所示:

在新型应用程序中使用TypeScript

JavaScript 原本的设计用途是在小型文档对象模型 (DOM) 树中操作 DOM. 而随着时间的推移,JavaScript 已经广为流行,如今成为开发从小型市场应用到 大型企业应用的各种应用程序的主流语言. 随着 JavaScript 流行热度的持续增 加,对其开发者提供各种工具和语言的支持也应运而生,TypeScript 就是这样一 种语言. TypeScript 是什么?她如何工作? TypeScript 是 JavaScript 的一个超集,您可以通过它编写和生成更具强类型和面向对象

如何修改interfaces文件

在一些HP和SUN的机器上,interfaces文件中关于SERVER的信息是以16进制的形式存储的,必须要通过实用 程序dscp才能进行修改. 实际上,我们只要了解了这些16进制数据的格式,也可以直接通过vi来更改interfaces文件. 下面以e3000为例,介绍一下interfaces文件的结构和格式: 用vi打开/opt/sybase/interfaces,可以看到这些信息: E3000 master tli tcp /dev/tcp \x00021a0a9e4d51f80000000