TypeScript 最为 JavaScript 的超集,它的基本数据类型与 JavaScript 是完全相同的。数据类型有原始数据类型和非原始数据类型两种。
基本数据类型有哪些?
原始数据类型有以下六种:
- boolean 布尔值
- number 数值
- string 字符串
- null 空值
- undefined 未定义
- Symbol (ES6 中的新类型)
非原始数据类型有以下九种:
- 数组
- Tuple 元祖
- enum 枚举
- never 永不存在的值的类型
- void
- any 任意类型
- 联合类型
- 函数类型
其中元组、枚举、任意值、void 类型和 never 类型是 TypeScript 有别与 JavaScript 的特有类型。在 TypeScript 中声明变量,需要加上类型声明,例如 boolean 和 string 等。通过静态类型约束,在编译时执行类型检查,可以避免一些类型混用的低级错误。
原始数据类型
布尔值
布尔值是最基础的数据类型,在 TypeScript 中,使用 boolean 定义布尔值类型:
let isDone: boolean = false;
数字
和 JavaScript 一样,TypeScript 里的所有数字都是浮点数。 这些浮点数的类型是 number。 除了支持十进制和十六进制字面量,TypeScript 还支持 ECMAScript 2015 中引入的二进制和八进制字面量。
let a: number = 6;
// ES6 中的二进制表示法
let b: number = 0b1010;
// ES6 中的八进制表示法
let c: number = 0o744;
字符串
和 JavaScript 一样,可以使用双引号( ")或单引号(’)表示字符串。
let myName: string = "xiaoming";
let myAge: number = 25;
空值
JavaScript 没有空值(Void)的概念,在 TypeScript 中,可以用 void 表示没有任何返回值的函数。
function alertName(): void {
alert("My name is Tom");
}
声明一个 void 类型的变量没有什么用,因为你只能将它赋值为 undefined 和 null。
let unde: void = undefined;
let nu: void = null;
Null 和 Undefined
在 TypeScript 中,可以使用 null 和 undefined 来定义这两个原始数据类型。
let un: undefined = undefined;
let nu: null = null;
与 void 的区别是,undefined 和 null 是所有类型的子类型。也就是说 undefined 类型的变量,可以赋值给 number 类型的变量
// 这样不会报错
let num: number = undefined;
// 这样也不会报错
let un: undefined;
let num2: number = un;
非原始数据类型
数组
定义数组有两种方式。
第一种:普通方式
可以在元素类型后面接上 [],表示由此类型元素组成的一个数组,数组的项中不允许出现其他的类型。
//数组表现方式 类型[]
let arr: number[] = [1, 2, 3, 4];
第二种:泛型方式 Array<元素类型>
let list: Array<number> = [1, 2, 3];
元祖
元组类型允许表示一个已知元素数量和类型的数组,各元素的类型不必相同。比如,你可以定义一对值分别为 string和number类型的元组。
let x: [string, number];
x = ["Hello", 10];
枚举
使用枚举我们可以定义一些带名字的常量。 使用枚举可以清晰地表达意图或创建一组有区别的用例。 TypeScript 支持数字的和基于字符串的枚举。
// 利用 const 关键词也可以声明一组常量,例如,声明十二生肖的排位
const rat: number = 1;
const cattle: number = 2;
const tiger: number = 3;
const rabbit: number = 4;
const dragon: number = 5;
数字枚举
默认情况下,从 0 开始为元素编号。 你也可以手动的指定成员的数值。
enum ChineseZodiac {
rat,
cattle,
tiger,
rabbit,
dragon,
}
字符串枚举
在一个字符串枚举里,每个成员都必须用字符串字面量,或另外一个字符串枚举成员进行初始化。
enum Person {
name = "NAME",
age = "AGE",
love = "LOVE",
hobby = "HOBBY",
}
console.log(Person.name); // NAME
console.log(Person.hobby); // HOBBY
never
never 类型是任何类型的子类型,也可以赋值给任何类型,一般作为函数返回值。
// 返回never的函数必须存在无法达到的终点
function error(message: string): never {
throw new Error(message);
}
void
void 类型像是与 any 类型相反,它表示没有任何类型。 当一个函数没有返回值时,你通常会见到其返回值类型是 void。
function warn(): void {
console.log("This is my warning message");
}
any 任意类型
任意值(Any)用来表示允许赋值为任意类型。声明一个变量为任意值之后,对它的任何操作,返回的内容的类型都是任意值。变量如果在声明的时候,未指定其类型,那么它会被识别为任意值类型。
let notSure: any = 4;
notSure = "这是字符串";
notSure = false;
当你不希望类型检查器对某些值进行检查而是直接让它们通过编译阶段的检查可以使用 any 类型来标记这些变量。
联合类型
联合类型(Union Types)表示取值可以为多种类型中的一种。
let num: string | number;
num = "seven";
num = 7;
联合类型使用 | 分隔每个类型。这里的 let num: string | number 的含义是,允许 num 的类型是 string 或者 number,但是不能是其他类型。
对象类型
object 表示非原始类型,也就是除 number,string,boolean,symbol,null 或 undefined 之外的类型。
declare function create(o: object | null): void;
create({ name: 0 }); // OK
create(null); // OK
create(2); // Error
create("字符串"); // Error
create(false); // Error
create(undefined); // Error