- 布尔值
let isDone: boolean=false;
- 数字
除了支持十进制和十六进制字面量,typescript还支持es6中引入的二进制和八进制字面量。
let a: number= 6; let b: number = 0xf00d; let c: number = 0b1010;
- 字符串
let name: string = 'bob';
此外可以使用模板字符串,它可以定义多行文本和内嵌表达式。这种字符串是被反引号包围(``),并且以${ expr }这种形式嵌入表达式。
let name: string = `Gene`; let age: number = 37; let sentence : strirng = `Hello,my name is ${ name }. I will be ${ age+1 } years old next month.`;
这与下面定义sentence的方式效果相同:
let sentence : string = "Hello,my name is"+name+". "+" I will be " + (age+1) + "years old next month.";
- 数组
注意,数组元素只能是number型,有两种方式可以定义数组。
let list: number[]=[1,2,3];
let list: Array<number>=[1,2,3];
- 元组
元组类型允许表示一个已知元素数量和类型的数组,各元素的类型不必相同。比如,可以定义一对值分别为string和number类型的元组。
let x:[string,number]; x= ['hello',10]; //ok
x=[10,'hello']; //error
当访问一个已知索引的元素,会得到正确的类型:
console.log(x[0].substr(1)); //ok
console.log(x[1].substr(1)); //error,number类型不存在substr方法
当访问一个越界的元素,会使用联合类型替代:
x[3] = 'world'; //ok,字符串可以赋值给(string | number)类型
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;
枚举类型提供的一个便利是你可以由枚举的值得到它的名字。例如,我们知道数值为2,但是不确定它映射到Color里面的哪个名字,我们可以查找相应的名字:
enum Color {Red=1, Green,Blue} let colorName: string= Color[2]; console.log(colorName);
- Any
有时候,我们会想要为那些在编程阶段还不清楚类型的变量指定一个类型。这些值可能来自于动态的内容,比如来自用户输入或第三方代码库。这种情况下,我们不希望类型检查器对这些值进行检查而是直接让它们通过编译阶段的检查。那么我们可以使用any类型来标记这些变量:
let notSure: any = 4; notSure ='maybe a string instead'; //ok notSure = false; //ok
在对现有代码进行改写的时候,any类型是十分有用的,它允许你在编译时可选择地包含或移除类型检查。你可能认为Object有相似的作用,就像它在其他语言中那样。但是object类型的变量只是允许你给它赋任意值,但是却不能够在它上面调用任意的方法,即便它真的有这些方法:
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类型也是有用的。比如,有一个数组,它包含了不同的类型的数据:
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;
- Null和Undefined
let u: undefined = undefined; let n: null = null;
默认情况下null和undefined是所有类型的子类型。就是说你可以把null和undefined赋值给number类型的变量。
然而,当你指定了--strictNullChecks标记,null和undefined只能赋值给void和它们各自。这能避免很多常见问题。也许在某处你想传入一个string或null或undefined,你可以使用联合类型string | null | 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) { } }
类型断言
有时候会遇到这样的情况,你会比typescript更了解某个值的详细信息。通常这会发生在你清楚地知道一个实体具有比它现有类型更确切的类型。
通过类型断言这种方式可以告诉编译器,“相信我,我知道自己在干什么”。类型断言好比其他语言里的转换器,但是不进行特殊的数据检查和解构。它没有运行时的影响,只是在编译阶段起作用。typescript会假设你,程序员,已经进行了必须的检查。
类型断言有两种形式。其一是“尖括号”语法:
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语法是被允许的。