布尔值: boolean
let isDone: boolean = false;
数字: number
- 和JavaScript一样,TS里的所有数字都是浮点数.
- 支持十进制和十六进制字面量,TS还支持ECMAScript 2015中引入的二进制和八进制字面量。
let decLiteral: number = 6; // 十进制 let hexLiteral: number = 0xf00d; // 十六进制 let binaryLiteral: number = 0b1010; // 二进制 let octalLiteral: number = 0o744; // 八进制
字符串: string
使用单引号(')或双引号(")来表示字符串类型。反引号(`)来定义多行文本和内嵌表达式.
let firstName: string = "bob"; firstName = "smith"; let sentence: string = `Hello, my firstName is ${ firstName }.`; let sentence1: string = "Hello, my firstName is " + firstName + "." ;
数组: array
// 在元素类型后面加上[] let list: number[] = [1, 2, 3]; // 数组泛型,Array<元素类型>: let list1: Array<number> = [1, 2, 3];
元组: Tuple
元组类型允许表示一个已知元素数量和类型的数组,各元素的类型不必相同, 对应位置的类型需要相同。
// Declare a tuple type let x: [string, number]; // Initialize it x = ['hello', 10]; // OK // Initialize it incorrectly x = [10, 'hello']; // Error //当访问一个已知索引的元素,会得到正确的类型: console.log(x[0].substr(1)); // OK console.log(x[1].substr(1)); // Error, 'number' does not have 'substr' // 当访问一个越界的元素,会使用联合类型替代: x[3] = 'world'; // OK, 字符串可以赋值给(string | number)类型 console.log(x[5].toString()); // OK, 'string' 和 'number' 都有 toString x[6] = true; // Error, 布尔不是(string | number)类型
枚举: enum
对JavaScript标准数据类型的一个补充,使用枚举类型可以为一组数值赋予友好的名字。
enum Color {Red, Green, Blue} let c: Color = Color.Green; // 默认情况下,从0开始为元素编号。 你也可以手动的指定成员的数值。 例如,我们将上面的例子改成从 1开始编号: enum Color {Red = 1, Green, Blue} let c: Color = Color.Green; //或者,全部都采用手动赋值: enum Color {Red = 1, Green = 2, Blue = 4} let c: Color = Color.Green; //枚举类型提供的一个便利是你可以由枚举的值得到它的名字 enum Color {Red = 1, Green, Blue} let colorName: string = Color[2]; console.log(colorName); // 显示'Green'因为上面代码里它的值是2
Any:
any, 为不清楚类型的变量指定一个类型, 不通过类型检查器检测.
let notSure: any = 4; notSure = "maybe a string instead"; notSure = false; // okay, definitely a boolean // any类型允许你在编译时可选择地包含或移除类型检查, 在它上面调用任意的方法. let notSure: any = 4; notSure.ifItExists(); // okay, ifItExists might exist at runtime notSure.toFixed(); // okay, toFixed exists (but the compiler doesn't check) // Object类型的变量只是允许你给它赋任意值 - 但是却不能够在它上面调用任意的方法,即便它真的有这些方法 let prettySure: Object = 4; prettySure.toFixed(); // Error: Property 'toFixed' doesn't exist on type 'Object'. // 当你只知道一部分数据的类型时,any类型也是有用的。 比如,你有一个数组,它包含了不同的类型的数据: let list: any[] = [1, true, "free"]; list[1] = 100;
Void
void类型像是与any类型相反,表示没有任何类型。当一个函数没有返回值时,其返回值类型通常是 void.
function warnUser(): void { // 表示没有返回值的函数 console.log("This is my warning message"); } // 声明一个void类型的变量没有什么大用,因为你只能为它赋予undefined和null let unusable: void = undefined;
Null, Undefined
- 默认情况下null和undefined是所有类型的子类型。 例如可以把 null和undefined赋值给number类型的变量。
- 当你指定了--strictNullChecks标记(鼓励使用,可以避免很多问题),null和undefined只能赋值给void和它们各自.
- 使用了--strictNullChecks标记后,如果想传入一个 string或null或undefined,可以使用联合类型string | null | undefined.
let n: null = null; let u: undefined = undefined;
Never
never, 表示的是那些永不存在的值的类型。
- 例如never类型是那些总是会抛出异常或根本就不会有返回值的函数表达式或箭头函数表达式的返回值类型;
- 变量也可能是 never类型,当它们被永不为真的类型保护所约束时。
- never类型是任何类型的子类型,也可以赋值给任何类型;
- 然而,没有类型是never的子类型或可以赋值给never类型(除了never本身之外)。 即使 any也不可以赋值给never。
- 返回never的函数必须存在无法达到的终点
function error(message: string): never { throw new Error(message); } // 推断的返回值类型为never function fail() { return error("Something failed"); } // 返回never的函数必须存在无法达到的终点 function infiniteLoop(): never { while (true) { } }
Object
object表示非原始类型,也就是除number,string,boolean,symbol,null或undefined之外的类型。
declare function create(o: object | null): void; create({ prop: 0 }); // OK create(null); // OK create(42); // Error create("string"); // Error create(false); // Error create(undefined); // Error
类型断言
你清楚地知道一个实体具有比它现有类型更确切的类型。通过类型断言这种方式可以告诉编译器,“相信我,我知道自己在干什么”。
// 尖括号方法: 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语法断言是被允许的。