布尔类型 boolean
我们用 boolean
来表示布尔类型,注意开头是小写的,如果你在 TypeScript 文件中写成 Boolean
那代表是 JavaScript 中的布尔对象。
let isAwesome: boolean = true;
这里需要提示一下,很多 TypeScript 的原始类型比如 boolean、 number、string等等,在 JavaScript 中都有类似的关键字 Boolean、Number、String,后者是 JavaScript 的构造函数,比如我们用 Number 用于数字类型转化或者构造 Number 对象用的,而 TypeScript 中的 number 类型仅仅是表示类型,两者完全不同。
数字类型 number
JavaScript 中的二进制、十进制、十六进制等数都可以用 number 类型来表示。
let age: number = 18
字符串类型 string
let name: string = 'huangry`
void 类型
void
表示没有任何类型,当一个函数没有返回值时,通常将其返回值类型设为 void
,实际上只有 null
和 undefined
可以赋值给 void
。
function warnUser(): void {
console.log('return void');
}
null 和 undefined
默认情况下 null
和 undefined
是所有类型的子类型。也就是说你可以把 null
和 undefined
赋值给 number
类型的变量。
然而,当你指定了 --strictNullChecks
标记, null
和 undefined
只能赋值给 any
和 void
和它们各自的类型。 使用了 --strictNullChecks
标记,可选参数会被自动地加上 | undefined
,可选属性也会有同样的处理。
任意类型 any
有时候,我们会想要为那些编程阶段还不清楚类型的变量指定一个类型。这些值可能来自于动态的内容,比如来自用户输入或第三方代码库。这种情况下,我们不希望类型检查器对这些值进行检查而是直接让它们通过编译阶段的检查。那么我们可以使用 any
类型来标记这些变量:
let notSure: any = 4;
notSure = "maybe a string instead";
never 类型
never
类型表示的是那些不存在的值的类型。例如, never
类型是那些总是会抛出异常或根本就不会有返回值的函数表达式或箭头函数表达式的返回值类型;变量也可能是 never
类型,当它们被永不为真的类型保护所约束时。never
类型是任何类型的子类型,也可以赋值给任何类型,然而,没有类型是 never
的子类型或可以赋值给 never
类型(除了 never
本身之外)。即使 any
也不可以赋值给 never
。
// 抛出异常的函数永远不会有返回值
function error(message: string): never {
throw new Error(message);
}
// 空数组,而且永远是空的
const empty: never[] = [];
数组类型 array
数组类型有两种定义方式:
元素类型 + []
let list: number[] = [1, 2, 3];
Array
let list: Array<number> = [1, 2, 3];
元组类型 tuple
数组合并了相同类型的对象,而元组(Tuple)合并了不同类型的对象。 元组类型允许表示一个已知元素数量和类型的数组,各元素的类型不必相同。
例子:// 定义了一个值分别为 string 和 number 的元组
let tom: [string, number] = ['Tom', 25];
当直接对元组类型的变量进行初始化或者赋值的时候,需要提供所有元组类型中指定的项。不能多也不能少,还不能调换顺序。我们可以把元组看成严格版的数组,元组继承于数组,但是比数组拥有更严格的类型检查。假如
[string, number]
我们可以看成是:interface Tuple extends Array<string | number> {
0: string;
1: number;
length: 2;
}
枚举类型 enum
枚举类型用于取值被限定在一定范围内的场景,比如一周只能有七天,颜色限定为红绿蓝等。
枚举使用enum
关键字来定义:enum Days {Sun, Mon, Tue, Wed, Thu, Fri, Sat};
枚举成员会被赋值为从 0 开始递增的数字,同时也会对枚举值到枚举名进行反向映射。
也可以给枚举项手动赋值,未手动赋值的枚举项会接着上一个枚举项递增。 手动赋值的枚举项可以不是数字。当然,手动赋值的枚举项也可以为小数或负数,此时后续未手动赋值的项的递增项仍为 1 。枚举项
枚举项有两种类型:
- 常数项
- 计算所得项
当满足以下条件时,枚举成员被当作是常数:
- 不具有初始化函数并且之前的枚举成员是常数,在这种情况下,当前枚举成员的值为上一个枚举成员的值加 1 。第一个枚举元素如果没有初始化方法,那么它的初始化值为 0 。
- 枚举成员使用常数枚举表达式初始化。常数枚举表达式是 typescript 表达式的子集,它可以在编译阶段求值。当一个表达式满足下面条件之一时,它就是一个常数枚举表达式:
- 数字字面量或字符串字面量
- 引用之前定义的常数枚举成员(可以是在不用的枚举类型中定义的)如果这个成员是在同一个枚举类型中定义的,可以使用非限定名来引用。
- 数字字面量或字符串字面量
- 带括号的常数枚举表达式
+
、-
、~
一元运算符应用于常数枚举表达式+
,-
,*
,/
,%
,<<
,>>
,>>>
,&
,|
,^
二元运算符,常数枚举表达式作为其一个操作对象。若常数枚举表达式求值后为NaN
或Infinity
,则会在编译阶段报错。
- 带括号的常数枚举表达式
所有其他情况的枚举成员被当作是需要计算得出的值。如果紧接在计算所得项后面的是未手动赋值的项,那么它就会因为无法获得初始值而报错。
常数枚举
使用 const enum
定义的枚举类型称作常数枚举。 常数枚举与普通枚举的区别是,它会在编译阶段被删除,并且不能包含计算成员。假如包含了计算成员,则会在编译阶段报错。这是性能提升的一个方案。
// enum.ts,编译前
const enum Direction {
Up = "Up",
Down = "Down",
Left = "Left",
Right = "Right"
}
const a = Direction.Up;
// 编译后
var a = "Up"
// 把 const 删去后的编译结果
var Direction;
(function (Direction) {
Direction["Up"] = "Up";
Direction["Down"] = "Down";
Direction["Left"] = "Left";
Direction["Right"] = "Right";
})(Direction || (Direction = {}));
var a = Direction.Up;
外部枚举
外部枚举是使用 declare enum
定义的枚举类型。
外部枚举和非外部枚举之间有一个重要区别,在正常的枚举里,没有初始化的方法的成员被当成常量成员。对于外部枚举而言,没有初始化方法是被当作需要经过计算的。
declare定义的类型只会用于编译时的检查,编译结果中会被删除。 外部枚举与声明语句一样,常出现在声明文件中。 同时使用 declare
和 const
也是可以的。
字面量枚举成员
字面量枚举成员是指不带有初始值的常量枚举成员,或者是值被初始化为
- 任何字符串字面量(例如: “foo”, “bar”, “baz”)
- 任何数字字面量(例如: 1, 100)
- 引用了一元
-
符号的数字字面量(例如: -1, -100)
当所有枚举成员都拥有字面量枚举值时,它就带有了一种特殊的语义: