TypeScript Handbook 基础类型

本文档根据 TypeScript 1.8.10 版本翻译。

简介

在程序开发中,我们需要使用一些基础数据类型,例如:numbers, strings, structures, boolean values等。在TypeScript中,我们在JavaScript基础上扩展更多类型,你也可以使用JavaScript本有的类型。

Boolean

布尔类型和JavaScript中一样,拥有两个值,true和false。

let isDone: boolean = false;

Number

和JavaScript一样,TypeScript中的所有数字类型均为浮点数(float),于此通知,TypeScript也支持ECMAScript 2015标准,支持二进制和八进制。

let decimal: number = 6;
let hex: number = 0xf00d;
let binary: number = 0b1010;
let octal: number = 0o744;

String

字符串类型使用"双引号或者'单引号包含。

let color: string = "blue";
color = 'red';

你还能够使用字符串模板,字符串模板使用`符号引用,当需要替换时,将对应变量放置于${ expr }内。

let fullName: string = `A闪`;
let age: number = 37;
let sentence: string = `Hello, my name is ${ fullName }.

I'll be ${ age + 1 } years old next month.`

上面的sentence定义语句与下面的声明语句作用相同。

let sentence: string = "Hello, my name is " + fullName + ".\n\n" +
    "I'll be " + (age + 1) + " years old next month."

Array

TypeScript声明数组使用[]中括号表示,同时你还可以声明数组中的数据类型。

let list: number[] = [1, 2, 3];

另外一种定义数组时声明类型的方法可使用Array<elemType>语法糖。

let list: Array<number> = [1, 2, 3];

Tuple

元组类型可以让你声明一个元素数据类型不同的数组。例如声明一个数组,第一个元素数据类型为string,第二个数据类型为number。

// 声明一个元组类型
let x: [string, number];
// 初始化它
x = ["hello", 10]; // 正确
// 不正确的初始化
x = [10, "hello"]; // 错误

当访问元组中的元素时,可以清楚的知道元素的数据类型。

console.log(x[0].substr(1)); // 正确
console.log(x[1].substr(1)); // Error, 'number' does not have 'substr' 错误,number类型没有substr方法

元组类型,定义了元素的数据类型,当长度发生变化时,对应下标元素的数据类型为联合类型。联合类型可以时元组定义时所出现的任意一个类型。

x[3] = "world"; // OK, 'string' can be assigned to 'string | number'

console.log(x[5].toString()); // OK, 'string' and 'number' both have 'toString'

x[6] = true; // Error, 'boolean' isn't 'string | number'

联合类型属于高级内容,后续会有详细介绍。

Enum

枚举是一种非常好的数值集合。

enum Color {Red, Green, Blue};
let c: Color = Color.Green;

默认情况下,枚举数值编号都是从0开始的,你也可以手动指定编号。

enum Color {Red = 1, Green = 2, Blue = 4};
let c: Color = Color.Green;

枚举有一个方便的功能,你可以通过编号获取枚举的数值。例如,我们确定使用编号为2的枚举,但不知其名称,可以通过下面方式访问。

enum Color {Red = 1, Green, Blue};
let colorName: string = Color[2];

alert(colorName); //打印 Green

Any

通常情况下我们定义变量需要指定数据类型,但有可能这些值来自于动态内容,我们并不知道其数据类型。此时我们可以使用 any 类型,使得编译器退出类型检查。

let notSure: any = 4;
notSure = "maybe a string instead";
notSure = false; // okay, definitely a boolean

JavaScript有一个强大的地方,当我们退出类型检查时,使用 any 类型,可以方位其真实对象的属性与方法。在其他语言中,你可以可以指定某一对象类型为任意类型,但无法访问其属性与方法,但这些属性与方法是真实存在的。

let notSure: any = 4;
notSure.ifItExists(); // okay, ifItExists might exist at runtime
notSure.toFixed(); // okay, toFixed exists (but the compiler doesn't check)

let prettySure: Object = 4;
prettySure.toFixed(); // Error: Property 'toFixed' doesn't exist on type 'Object'.

any 类型是非常方便的,加入你有一个数组,但并不知道数组中数据类型,可以借助 any 方便的实现。

let list: any[] = [1, true, "free"];

list[1] = 100;

Void

void 类型和 any 类型有点相反,void 表示不是任何类型,我们通常将其用在函数的返回值当中。

function warnUser(): void {
    alert("This is my warning message");
}

定义 void 类型变量是无效的,你只能为其赋予undefined或者null

let unusable: void = undefined;

类型断言

类型断言在当你确定某一对象为某类型时,进行断言。我们会经常遇到这种情况,一个对象类型为B,而B继承自A,我们需要断言当前对象类型为A,即可使用断言。你有两种使用类型断言的语法糖。一种为<>形式

let someValue: any = "this is a string";

let strLength: number = (<string>someValue).length;

另外一种使用 as 关键词。

let someValue: any = "this is a string";

let strLength: number = (someValue as string).length;

两种语法风格是等价的,当我们使用TypeScript中的JSX时,只有 as 形式是可正常运行的。

关于 let 关键词

到目前位置你应该已经发现,我们所有定义变量均使用 let 关键词,而不是 JavaScript 中常用的 var 关键词。我们稍后会讨论关于 let 的更多细节,使用 let 会缓解 JavaScript 中 var 所引发的一些问题。