TypeScript 包含的数据类型如下

0. void 类型

用于定义函数时,表示函数没有返回任何类型

function run(): void {
    console.log('Run Run Run!');
}

 1. Any 类型

  • 声明为 any 的变量可以赋予任意类型的值
  • 任意值 是 TypeScript 针对 编程时类型不明确的变量 使用的一种数据类型

它常用于以下三种情况

1) 变量的值会动态改变时

<p>1、变量的值会动态改变时,比如来自用户的输入,任意值类型可以让这些变量跳过编译阶段的类型检查,示例代码如下:</p>

let x: any = 1;    // 数字类型
x = 'I am who I am';    // 字符串类型
x = false;    // 布尔类型

2) 任意值允许在编译时可选择地包含或移除类型检查

let x: any = 4;
x.ifItExists();    // 正确,ifItExists方法在运行时可能存在,但这里并不会检查
x.toFixed();    // 正确

3) 定义存储各种类型数据的数组时

let arrayList: any[] = [1, false, 'fine'];
arrayList[1] = 100;

2. null 类型

表示对象值缺失

在 JavaScript 中 null 表示 "什么都没有"。

null 是一个只有一个值的特殊类型。表示一个空对象引用。

用 typeof 检测 null 返回是 object 

3. undefined

用于初始化变量为一个未定义的值

在 JavaScript 中, undefined 是一个没有设置值的变量。

typeof 一个没有值的变量会返回 undefined。

Null 和 Undefined 是其他任何类型(包括 void)的子类型,可以赋值给其它类型,如数字类型,此时,赋值后的类型会变成 null 或 undefined。

而在TypeScript中启用严格的空校验(--strictNullChecks)特性,就可以使得null 和 undefined 只能被赋值给 void 或本身对应的类型

// 启用 --strictNullChecks
let x: number;
x = 1; // 运行正确
x = undefined;    // 运行错误
x = null;    // 运行错误

如果一个类型可能出行 null 或 undefined, 可以用 | 来支持多种类型

// 启用 --strictNullChecks
let x: number | null | undefined;
x = 1; // 运行正确
x = undefined;    // 运行正确
x = null;    // 运行正确

4. never 类型

  • 代表从不会出现的值
  • never 是其它类型(包括 null 和 undefined)的子类型
  • never 类型的变量只能被 never 类型所赋值

在函数中它通常表现为 抛出异常无法执行到终止点(例如无限循环

let x: never;
let y: number;

// 运行错误,数字类型不能赋值给 never 类型
x = 123;

// 运行正确,never 类型可以赋值给 never类型
x = (()=>{ throw new Error('exception')})();

// 运行正确,never 类型可以赋值给 数字类型
y = (()=>{ throw new Error('exception')})();

// 返回值为 never 的函数可以是抛出异常的情况
function error(message: string): never {
    throw new Error(message);
}

// 返回值为 never 的函数可以是无法被执行到的终止点的情况
function loop(): never {
    while (true) {}
}

 5. boolean 布尔类型

表示逻辑值:true false

const flag: boolean = false;

6. number 数值类型

  • 双精度 64 位浮点值。
  • 它可以用来表示 整数分数
let numTest = () => {
    let num: number = 0;
    console.log('numInit = ' + num);
    num = 1;

    // 将一个字符串 赋值 给一个 number 类型的变量
    // num = 'a string'; // 会 ts 报错,但是仍然可以编译运行
    return num;
}

 7. string 字符串类型

一个字符系列使用

单引号(')

双引号(")

来表示字符串类型

  • 反引号(`)来定义多行文本和内嵌表达式。
let name: string = "Runoob";
let years: number = 5;
let words: string = `您好,今年是 ${ name } 发布 ${ years + 1} 周年`;
let stringTest = () => {
    let str: string = 'Hello, ts';
    console.log('strInit = ' + str);
    str = 'Hello, worktile';
    return str;
}

8. array 数组类型

let arrStr: string[] = ['Hello, ', 'ts'];
console.log('arrStr = ' + arrStr);

let arrNum: Array<number> = [3, 2, 1, 0];

 9. tuple 元组类型

  • 属于数组的一种,可以指定数组里面每个元素的类型
let tupleArr: [string[], number] = [['Hello, ', 'ts'], 666666];
console.log('tupleArr = ' + tupleArr);

tupleArr.push(444); // 数组前面的两个元素指定了类型,不影响后面的元素

 10. enum 枚举类型

定义标识符:标识状态 或 固定值

枚举:枚举状态的值,定义一个具有代表意义的单词

  • 背景:

尚可接受:---- 0 代表 关,1 代表 开

不直观,可读性差:---- 0代表周一, 1代表周二, 2代表周三, 3代表周四, 4代表周五, 5代表周六, 6代表周日

  • 解决:

使用相应的单词,来代表某一状态 ---- 使程序易阅读易理解

  • 定义一个枚举类型:
enum 枚举类型名 {
    标识符[=整型常数],
    标识符[=整型常数],
    ...
    标识符[=整型常数]
};

实例:

/**** 1. 定义一个枚举类型 ****/
// 设计数据: pay_status    2未支付    4已支付    6交易结束
enum PayStatus {
    payWait = 2,
    payDone = 4,
    overPay = 6
}
/**** 2. 使用枚举变量 PayStatus.payWait ****/
let phoneWaitPay: PayStatus = PayStatus.payWait; // 2
/**** 官网1. 定义一个枚举类型 ****/
// 设计数据: Color    0 red    1 blue    2 orange
enum Color {
    red,
    blue,
    orange
} // 其实就是告诉我们,可以不指定值,默认从 0 开始
/**** 官网2. 使用枚举变量 Color.blue ****/
let bColor: Color = Color.blue; // 1
/**** 官网1. 定义一个枚举类型 ****/
// 设计数据: Color    0 red    1 blue    2 orange
enum Color {
    red,
    blue = 5,
    orange
} // 其实就是告诉我们,可以不指定值,默认从 0 开始
// 可以从某处开始指定值,后面的值累加
/**** 官网2. 使用枚举变量 Color.blue ****/
let rColor: Color = Color.red; // 0
let bColor: Color = Color.blue; // 5
let oColor: Color = Color.orange; // 6
let enumTest = () => {
    enum PayStatus {payWait = 2, payDone = 4, overPay = 6}
    console.log(PayStatus.payWait); // 2
    console.log(PayStatus.payDone); // 4
    console.log(PayStatus.overPay); // 6

    console.log(Object.prototype.toString.call(PayStatus)); // [object Object]
    console.log(PayStatus);
    console.log(PayStatus[2]); // 'payWait'
    /**enum PayStatus {payWait = 2, payDone = 4, overPay = 6}
     上面的代码转成 ES5 其实就是
        var PayStatus;
        (function (PayStatus) {
            PayStatus[PayStatus["payWait"] = 2] = "payWait";
            PayStatus[PayStatus["payDone"] = 4] = "payDone";
            PayStatus[PayStatus["overPay"] = 6] = "overPay";
        })(PayStatus || (PayStatus = {}));
     最终创建了一个对象:
        var PayStatus = {
            '2': 'payWait',
            '4': 'payDone',
            '6': 'overPay',
            payWait: 2,
            payDone: 4,
            overPay: 6
         }
     */

    enum Color {red, green, blue}
    console.log(Color.red); // 0
    console.log(Color.green); // 1
    console.log(Color.blue); // 2

    enum RGB {red, green = 5, blue}
    console.log(RGB.red); // 0
    console.log(RGB.green); // 5
    console.log(RGB.blue); // 6 上一个 枚举属性 的值 + 1
    return RGB;
}