TypeScript 基础类型

基础类型

基础类型能够依据是否含有类型关键字分为两类:ajax

  • 含:booleannumberstringsymbolobjectnullundefinedanynever
  • 不含:数组、元组、枚举

注意:全部类型关键字都是小写的。数组

注:这种分类并不严谨,分类的目的仅仅用于帮助记忆

声明格式

类型用来指定变量的类型,兼容的类型之间才能进行赋值、传参等操做。
声明变量类型使用 变量名: 类型 格式,如 let decimal: number = 10,声明以后 decimal 就只能接受 number 类型的赋值,不然编译器会报错。函数

Array

变量声明为数组类型时,还须要指定数组元素类型,有如下两种等效方式:oop

  • let list: number[] = [1, 2, 3]
  • let list: Array<number> = [1, 2, 3]

若是数组元素类型有多种呢?那就须要使用元组(Tuple)。code

Tuple

元组能够指定固定索引位置的数组元素类型。对象

let x: [string, number] 表示第 0 位和第 1 位分别是 stringnumber 类型,第 2 位及以后能够是 string number,即前面全部索引位的类型之一。索引

Enum

枚举类型能够更加友好地定义数值集合接口

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 表示任意类型,声明为 any 的变量能够赋予任意类型的值。

那是否是等于没有类型检测了?

之因此存在这种类型,缘由有两个:

  1. 写代码时开发者也不是很明确要用哪一种类型,或者只知道部分类型
  2. 兼容用户输入或者第三方库

缘由 2 中,好比应该把 jQuery 对象声明为何类型呢?
固然,能够像其余语言中同样声明为 Object,如 let $: Object = jQuery,这样赋值是没问题的。
在 JS 中一切皆为对象,因此给声明为 Object 的变量赋值任何值。
可是当调用函数时,好比 $.ajax(),编译器却会报错说找不到 ajax() 函数,即便 jQuery 上有该方法。
可是声明为 any 却不会,由于编译器并不会对它进行检查。

注意:Object 是 TS 内置的接口类型,object 是基础类型,let a: object; 等效于 let a: {}

Void

voidany 相反,表示不能出现任意类型,多用于定义无返回值的函数。

function warn(): void {
  alert('warning');
}

若是用于声明变量,那么只能接受 undefinednull,这样的声明实际上是没啥用途的。

let unusable: void = undefined;

Null 和 Undefined

nullundefindedvoid 同样,定义类型自己是没啥用途的,可是须要注意的是,他们是其余任何类型(包括 void)的子类型。所以,能够把 null 赋值给 number 类型,let decimal: number = null

可是,不建议这种用法,能够使用 --strictNullChecks 选项来关闭。这样的话,nullundefined 就只能赋值给 void 和它们自己。

Never

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 类型:

  • angle-bracket-syntax: (<string>anyTypeValue).length
  • as-syntax: (anyTypeValue as string).length

推荐使用 as 语法,由于当 TS 与 JSX 一块儿使用时,只容许 as 语法。

相关文章
相关标签/搜索