# 基础类型

Typescipt支持与JavaScript相同的数据类型,同时额外的提供了实用的枚举类型

# 布尔型 boolean

简单的 true/false 值

let tempVar: boolean = true

# 数字 number

与JS中一样,TS中的数字也全部都是浮点数。

let tempVar:number = 20

# 字符串 String

使用 '',"",``包裹起来的一串字符文本。

let tempVar:string = '20'

# 数组 Array

TS与JS一样,都可以操作数组中的元素,但不同的是,TS中的数组元素类型受到声明元素的限制

let tempVar:number[] = [1,2,3]  // 数组中元素只能是数字
let tempVar:Array<number> = [1,2,3]  // 数组泛型定义,数组中元素只能是数字

# 元组 Tuple

元组类型表示一个已知元素数量和元素类型的数组,元素的类型无需相同

let tempVar: [number,string]
tempVar =  [1,'1'] // OK
tempVar = ['1', 1] // Error

# 枚举 enum

枚举类型是ts对js数据类型的一个补充, 借助枚举类型可以为一组数值赋予友好的值

enum Color {Red, Green, Blue}
let c:Color = Color.Red

默认情况下,从 0 开始为元素编号。 当然,你也可以手动设定元素开始的编号:

enum Color {Red=1, Green, Blue}
let c:Color = Color.Red

你可以为每个元素成员设置不同的值

enum Color {Red = 1, Black, Green, Blue = 8}
console.log(Color)

{1: 'Red', 2: 'Black', 3: 'Green', 8: 'Blue', Red: 1, Black: 2, Green: 3, Blue: 8}

枚举类型提供的一个便利是你可以由枚举的值得到它的名字。

enum Color {Red = 1, Black, Green, Blue = 8}
let colorName: string = Color[2];

alert(colorName);  // 显示'Black' 因为上面代码里它的值是2

# 任意值 any

有时候,我们需要或者编码时并不知道元素的类型,就可以 为它赋 any,用于跳过 TS 的类型检查,在你的代码中,尽量的减少 any 出现的次数

let tempVar: any = 4;
tempVar = "maybe a string instead";
tempVar = false; // okay, definitely a boolean

# 空值 void

某种程度上来说,void类型像是与any类型相反,它表示没有任何类型。

function warnUser(): void {
    alert("This is my warning message");
}

声明一个void类型的变量没有什么大用,因为你只能为它赋予 undefinednull

let unusable: void = undefined;

# Null 和 Undefined

TypeScript里,undefinednull 两者各自有自己的类型分别叫做 undefinednull 。 和void相似,它们的本身的类型用处不是很大:

// Not much else we can assign to these variables!
let u: undefined = undefined;
let n: null = null;

默认情况下 nullundefined 是所有类型的子类型。 就是说你可以把 nullundefined 赋值给 number 类型的变量。

然而,当你指定了--strictNullChecks标记,nullundefined只能赋值给void和它们各自。 这能避免很多常见的问题。

也许在某处你想传入一个stringnullundefined,你可以使用联合类型string | null | undefined

# 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会假设你,程序员,已经进行了必须的检查。

类型断言有两种语法:

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语法断言是被允许的。