A闪的 BLOG 技术与人文
本文档根据 TypeScript 1.8.10 版本翻译。
在程序开发中,我们需要使用一些基础数据类型,例如:numbers, strings, structures, boolean values等。在TypeScript中,我们在JavaScript基础上扩展更多类型,你也可以使用JavaScript本有的类型。
布尔类型和JavaScript中一样,拥有两个值,true和false。
let isDone: boolean = false;
和JavaScript一样,TypeScript中的所有数字类型均为浮点数(float),于此通知,TypeScript也支持ECMAScript 2015标准,支持二进制和八进制。
let decimal: number = 6;
let hex: number = 0xf00d;
let binary: number = 0b1010;
let octal: number = 0o744;
字符串类型使用"
双引号或者'
单引号包含。
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."
TypeScript声明数组使用[]
中括号表示,同时你还可以声明数组中的数据类型。
let list: number[] = [1, 2, 3];
另外一种定义数组时声明类型的方法可使用Array<elemType>
语法糖。
let list: Array<number> = [1, 2, 3];
元组类型可以让你声明一个元素数据类型不同的数组。例如声明一个数组,第一个元素数据类型为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 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 类型,使得编译器退出类型检查。
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
类型和 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
关键词,而不是 JavaScript 中常用的 var
关键词。我们稍后会讨论关于 let
的更多细节,使用 let
会缓解 JavaScript 中 var
所引发的一些问题。