TypeScript学习笔记三:类型

3 类型(Types)

   ts为js添加了可选静态类型。类型被用于确定函数、变量或属性的静态约束,以便编译器和开发工具提供更好的验证和帮助。ts的静态编译时类型系统紧密结合js中的动态运行时系统。ts类型分析完全发生在编译时因而不增加运行时开销。

  ts中的所有类型都是“Any"类型的子类型。用”any“关键字引用。”Any“类型可以无任何约束地表示js值。其他所有的类型被分类为原始类型(primitive types)、对象类型(object types)、并集类型(union types)、交集类型 intersection types)和类型参数 type parameters)。

  原始类型有”Number"、“Boolean”、“String”、“Symbol”、"Void"、"Null“、”Undefined“类型和自定义的枚举(enum)类型。”number“、”boolean"、“string"、”symbol“、和”void“关键字分别引用”Number"、“Boolean”、“String”、“Symbol”和"Void"原始类型。”Void“表示值不存在,比如一个函数无返回值。不能显示引用”Null“和”Undefined"类型,只能用“null"和”undefined"。

  对象类型包括类(class)、接口(interface)、数组(array)、元组(tuple)、函数(function)和构造器(constructor)类型。类和接口类型可以是具有一个或多个类型参数的泛型(generic types)。

  并集类型(或称联合类型)代表一个具有多类型中的一个类型的值,交集类型(或称交叉类型)代表同时具有多个类型的值。

  命名空间声明与一个匿名类型的命名空间相关联,这个命名空间包含了具有相应导出变量和方法的属性集。函数声明与一个匿名类型的函数相关联,这个函数包含了具有相应的参数和返回类型的调用签名。类型可以通过显式类型注释(type annotations)关联变量,如:

var x: number;

  或者通过隐式类型引用(type inference):

var x = 1;

  通过“x”的赋值可以判定“x”的类型为“Number”类型。

3.1 Any类型 

  Any类型用于表示任何js值。我们用关键字“any”来引用Any类型。如果没有显式地提供类型,那么ts将假定其类型为Any类型。Any类型是所有类型的超类型,它可以赋予或被赋予任何类型。例如:

var x: any;             // Explicitly typed
var y;                  // Same as y: any
var z: { a; b; };       // Same as z: { a: any; b: any; }
function f(x) {         // Same as f(x: any): void
    console.log(x);
}

3.2 原始类型(Primitive Types)

  原始类型有:Number、Boolean、String、Symbol、Void、Null、Undefined类型和所有自定义的enum类型。 

3.2.1 数字类型(Number)

  数字原始类型对应于同名的js原始类型,它代表了双精度64位格式的IEEE 754浮点值。用关键字“number“指定。

 

var x: number;          // 显式类型
var y = 0;              // 同于 y: number = 0
var z = 123.456;        // 同于 z: number = 123.456
var s = z.toFixed(2);   

3.2.2 布尔类型(Boolean )

  布尔原始类型对应于同名的js原始类型,它代表了”true”或“false”的逻辑值。用关键字“boolean“指定。

var b: boolean;         // 显式类型
var yes = true;         // 同于 yes: boolean = true
var no = false;         // 同于 no: boolean = false

3.2.3 字符串类型(String)

  字符串原始类型对应于同名的js原始类型,它代表了以Unicode UTF-16形式存储的字符序列。用关键字“string“指定。

var s: string;          //显式类型
var empty = "";         // 同于 empty: string = ""
var abc = 'abc';        // 同于 abc: string = "abc"
var c = abc.charAt(2);  

3.2.4 符号类型(Symbol)

  符号原始类型对应于同名的js原始类型,它代表了应用为对象属性的唯一标志。用关键字“Symbol“指定。

  “Symbol”对象只能在ECMAScript 2015坏境起作用。

var secretKey = Symbol();
var obj = {};
obj[secretKey] = "secret message";  // 应用为属性键
obj[Symbol.toStringTag] = "test";   // 应用为符号 

3.2.5 Void类型

  Void类型代表了一个值不存在或函数无返回值。用关键字"Void”指定。

  Void类型的可能值是null和undefined。Void类型是Any类型的子类型,是Null和Undefined类型的超类型,但是Void类型与其他类型相关。

3.2.6 Null类型

  Null原始类型对应于同名的js原始类型。不能直接指定值的类型为Null。

  Null类型是除了Undefined类型之外的所有类型的子类型。这就意味着"null“可被认为是一个可用的值,它的类型可以是所有原始类型、对象类型、联合类型、交叉类型和类型参数。

var n: number = null;   
var x = null;           // 同于 x: any = null
var e: Null;            // 错误, 不能引用Null类型

3.2.7 Undefined类型

  Undefined原始类型对应于同名的js原始类型。不能直接指定值的类型为Undefined。

  Undefined类型是所有类型的子类型。这就意味着“undefined”可被认为是一个可用的值,它的类型可以是所有原始类型、对象类型、联合类型、交叉类型和类型参数。

var n: number;          // 同于 n: number = undefined
var x = undefined;      // 同于 x: any = undefined
var e: Undefined;       // 错误,不能引用Undefined类型

3.2.8 枚举类型(Enum)

  枚举类型是一个确定的自定义数字原始类型。枚举类型可分配给数字原始类型。(详见第9章)。

enum PERSONS{
  FIRST,SECOND     
}

3.3 对象类型(Object)

  对象类型由成员构成,这些成员包括属性、调用签名、构造签名和索引签名。

  类和接口类型引用、数组类型、元组类型、函数类型和构造器类型都属于对象类型。

  • 对象类型常量(Object type literals,详见3.8.3节)
  • 数组类型常量(Array type literals,详见3.8.4节)
  • 元组类型常量(tuple type literals,详见3.8.5节)
  • 函数类型常量(function type literals,详见3.8.8节)
  • 构造器类型常量(constructor type literals,详见3.8.9节)
  • 对象常量(Object literals,详见4.5节)
  • 数组常量(Array literals,详见4.6节)
  • 函数表达式(详见4.10节)和函数声明(详见6.1节)
  • 通过类声明创建的构造器函数类型(详见8.2.5节)
  • 通过命名空间声明创建的命名空间实例类型(namespace instance types,详见10.3节)

3.3.1  命名类型引用(Named Type References)

  类和接口类型的类型引用是对象类型的一种。

3.3.2 数组类型(Array)

  数组类型代表了一个具有相同元素类型的js数组。数组类型是通过泛型接口类型“Array”创建的命名类型引用,它位于全局命名空间当中。数组类型常量(详见3.8.4节)简化了引用的创建。

  "Array"接口什么包括一个“length”属性和一个数字索引签名和其他成员:

interface Array<T> {
    length: number;
    [x: number]: T;
    // Other members
}

  数组常量(详见4.6节)可用于创建数组类型的值,例如:

var a: string[] = ["hello", "world"];

3.3.3 元组类型(Tuple)

  元组类型代表了一个js数组,它的元素类型是单独跟踪的。一个元组类型是一个类型属性集合,例如:

[ T0, T1, ..., Tn ]

  是以下格式的属性集合

{
    0: T0;
    1: T1;
    ...
    n: Tn;
}

  某个元素的类型为元组所有元素类型的联合类型。

  数组常量可用于创建元组类型的值,例如:

var t: [number, string] = [3, "three"];
var n = t[0];  //  n 的类型为number
var s = t[1];  //  s 的类型为string
var i: number;
var x = t[i];  //  x的类型为number | string

  

posted @ 2016-01-11 19:12  leeberg  阅读(291)  评论(0)    收藏  举报