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

浙公网安备 33010602011771号