基础类型
为了让程序有价值,我们需要能够处理最简单的数据单元:数字,字符串,结构体,布尔值等。
boolean
1 | let isDone: boolean = false |
number
1 | let decLiteral: number = 6 |
string
1 | let name: string = 'bob' |
当然也可以用模板字符串:
1 | let name: string = `Gene` |
array
在元素类型后面接上 [],表示由此类型元素组成的一个数组:
1
let list: number[] = [1, 2, 3]
使用数组泛型,Array<元素类型>:
1
let list: Array<number> = [1, 2, 3]
元组 Tuple
元组类型允许表示一个已知元素数量和类型的数组,各元素的类型不必相同。
1 | // Declare a tuple type |
打印出来的结果:
1 | console.log(x[0].substr(1)) // OK |
枚举
像 C#等其它语言一样,使用枚举类型可以为一组数值赋予友好的名字。
1 | enum Color {Red, Green, Blue}; |
默认情况下,从 0 开始为元素编号。 你也可以手动的指定成员的数值。 例如,我们将上面的例子改成从 1 开始编号:
1 | enum Color {Red = 1, Green, Blue}; |
或者全部手动赋值:
1 | enum Color {Red = 1, Green = 2, Blue = 4}; |
枚举类型提供的一个便利是你可以由枚举的值得到它的名字。 例如,我们知道数值为 2,但是不确定它映射到 Color 里的哪个名字,我们可以查找相应的名字:
1 | enum Color {Red = 1, Green, Blue}; |
任意值
1 | let notSure: any = 4 |
空值
某种程度上来说,void 类型像是与 any 类型相反,它表示没有任何类型。 当一个函数没有返回值时,你通常会见到其返回值类型是 void:
1 | function warnUser(): void { |
Null 和 Undefined
1 | // Not much else we can assign to these variables! |
类型断言
类型断言好比其它语言里的类型转换,但是不进行特殊的数据检查和解构。 它没有运行时的影响,只是在编译阶段起作用。
“尖括号”语法:
1
2let someValue: any = "this is a string";
let strLength: number = (<string>someValue).length;as 语法
1
2let someValue: any = "this is a string";
let strLength: number = (someValue as string).length;
变量声明
var 声明
1 | function f() { |
let 声明
const 声明
const 拥有与 let 相同的作用域规则,但是不能对它们重新赋值。
1 | const numLivesForCat = 9 |
let vs. const
使用最小特权原则,所有变量除了你计划去修改的都应该使用 const。 基本原则就是如果一个变量不需要对它写入,那么其它使用这些代码的人也不能够写入它们,并且要思考为什么会需要对这些变量重新赋值。 使用 const 也可以让我们更容易的推测数据的流动。
接口
接口初探
1 | function printLabel(labelledObj: { label: string }) { |
类型检查器会查看 printLabel 的调用。 printLabel 有一个参数,并要求这个对象参数有一个名为 label 类型为 string 的属性。
下面我们重写上面的例子,这次使用接口来描述:必须包含一个 label 属性且类型为 string:
1 | // 定义接口 |
LabelledValue 接口就好比一个名字,用来描述上面例子里的要求。 它代表了有一个 label 属性且类型为 string 的对象。
可选属性
1 | interface SquareConfig { |
带有可选属性的接口与普通的接口定义差不多,只是在可选属性名字定义的后面加一个?符号。
只读属性
一些对象属性只能在对象刚刚创建的时候修改其值。 你可以在属性名前用 readonly 来指定只读属性:
1 | interface Point { |
你可以通过赋值一个对象字面量来构造一个 Point。 赋值后, x 和 y 再也不能被改变了。
1 | let p1: Point = { x: 10, y: 20 } |
TypeScript 具有 ReadonlyArray
1 | let a: number[] = [1, 2, 3, 4] |
就算使用赋值也不可以,除非使用类型断言重写:
1 | a = ro as number[]; |
readonly vs const
最简单判断该用 readonly 还是 const 的方法是看要把它做为变量使用还是做为一个属性。 做为变量使用的话用 const,若做为属性则使用 readonly。