基础类型能够依据是否含有类型关键字分为两类:ajax
boolean
、number
、string
、symbol
、object
、null
、undefined
、any
、never
注意:全部类型关键字都是小写的。数组
注:这种分类并不严谨,分类的目的仅仅用于帮助记忆
类型用来指定变量的类型,兼容的类型之间才能进行赋值、传参等操做。
声明变量类型使用 变量名: 类型
格式,如 let decimal: number = 10
,声明以后 decimal
就只能接受 number
类型的赋值,不然编译器会报错。函数
变量声明为数组类型时,还须要指定数组元素类型,有如下两种等效方式:oop
let list: number[] = [1, 2, 3]
let list: Array<number> = [1, 2, 3]
若是数组元素类型有多种呢?那就须要使用元组(Tuple)。code
元组能够指定固定索引位置的数组元素类型。对象
如 let x: [string, number]
表示第 0 位和第 1 位分别是 string
和 number
类型,第 2 位及以后能够是 string
或 number
,即前面全部索引位的类型之一。索引
枚举类型能够更加友好地定义数值集合。接口
enum Color { Red, Green, Blue } let c: Color = Color.Red;
枚举类型默认从 0 开始递增标记成员,也能够显式标记部分或者全部成员。部分标记时,未标记成员按前向最近显式标记值递增。ci
enum Color { Red = 1, Green, Blue } // 部分标记时,自动递增,所以 Green => 2, Blue => 3 enum Color { Red = 1, Green = 2, Blue = 4 }
一个很好用的功能是,枚举能够反向查询枚举成员名称,如:开发
enum Color { Red = 1, Green, Blue } console.log(Color[2]) // => Green
any
表示任意类型,声明为 any
的变量能够赋予任意类型的值。
那是否是等于没有类型检测了?
之因此存在这种类型,缘由有两个:
缘由 2 中,好比应该把 jQuery
对象声明为何类型呢?
固然,能够像其余语言中同样声明为 Object
,如 let $: Object = jQuery
,这样赋值是没问题的。
在 JS 中一切皆为对象,因此给声明为 Object
的变量赋值任何值。
可是当调用函数时,好比 $.ajax()
,编译器却会报错说找不到 ajax()
函数,即便 jQuery
上有该方法。
可是声明为 any
却不会,由于编译器并不会对它进行检查。
注意:Object
是 TS 内置的接口类型,object
是基础类型,let a: object;
等效于 let a: {}
。
void
与 any
相反,表示不能出现任意类型,多用于定义无返回值的函数。
function warn(): void { alert('warning'); }
若是用于声明变量,那么只能接受 undefined
和 null
,这样的声明实际上是没啥用途的。
let unusable: void = undefined;
null
和 undefinded
跟 void
同样,定义类型自己是没啥用途的,可是须要注意的是,他们是其余任何类型(包括 void
)的子类型。所以,能够把 null
赋值给 number
类型,let decimal: number = null
。
可是,不建议这种用法,能够使用 --strictNullChecks
选项来关闭。这样的话,null
和 undefined
就只能赋值给 void
和它们自己。
never
表示这种类型的值永远不会出现。听起来很奇怪,可是它确实有应用场景。
最大的场景就是用在函数返回值中,如:
function error(msg: string): never { throw new Error(msg); } function fail() { return error('failed'); }
function infiniteLoop(): never { while(true) {} }
TS 编译器会按照声明规则自动检查变量类型,免去了开发者本身检查的烦恼。可是做为规则,它是固定死的,有时也须要灵活“通融”一下。
类型断言就是一种“通融”方式,实质上是一种类型转换(Type Cast),它告诉编译器“相信我,我知道我在作什么,我为个人行为负责”,而后编译器就会把它认为是目标类型。
类型断言有两种语法形式,下例中都是将变量 anyTypeValue
转为 string
类型:
(<string>anyTypeValue).length
(anyTypeValue as string).length
推荐使用 as
语法,由于当 TS 与 JSX 一块儿使用时,只容许 as
语法。