1. 变量

  1. // let 变量名: 变量类型 = 值
  2. let age: number = 18;

在 TS 中,为变量指定了类型,就只能给这个变量设置相同类型的值
上述中的 : number 称为类型注解

2. 数据类型

原有类型

image.png

  • number
  • string
  • boolean
  • undefined:表示声明但未赋值的变量值
  • null:声明了变量并已赋值,值为 null
    1. let aName: string = 'konsoue';
    2. let age: number = 18;
    3. let isDog: boolean: true;
    4. let undef: undefined = undefined;
    5. let n: null = null;

    undefinednull 是所有类型的子类型

  1. let num: number = undefined;
  • Array
    1. // 方式一
    2. let arrHeros: string[] = ['安琪拉', '亚索'];
    3. // 方式二(泛型语法)
    4. let arrHeros: Array<string> = ['安琪拉', '亚索'];
    5. // 任意类型
    6. let arr: any[] = [1, '123', false, undefined, null];

    新增类型

    2. 变量与数据类型 - 图2

tuple 元组

就是一个规定了元素数量和每个元素类型的“数组”,而每个元素的类型可以不相同

  1. let tup1: [string, number, boolean] = ['1', 1, true];
  2. // 访问元素和长度
  3. tup1[0]
  4. tup1.length

enum 枚举

枚举项一般用英文和数字,而枚举值用整型数字

  1. enum GunType {
  2. M416 = 1,
  3. AK47 = 2,
  4. Goza = 3
  5. }
  6. // 使用默认枚举值,从 0 开始
  7. enum GunType {
  8. M416, // 0
  9. AK47, // 1
  10. Goza // 2
  11. }
  12. // 编译后的 js 代码
  13. var GunType;
  14. (function(GunType) {
  15. GunType[GunType['M416'] = 0] = 'M416';
  16. GunType[GunType['AK47'] = 1] = 'AK47';
  17. GunType[GunType['Goza'] = 2] = 'Goza';
  18. })(GunType || (GunType = {}))
  19. // 声明性别枚举
  20. enum Gender {
  21. Boy = 1,
  22. Girl, // 2
  23. Unknown // 3
  24. }
  25. // 创建用户性别变量
  26. let userSex: Gender = Gender.Boy;
  • 常量枚举

    可以提高性能

  1. const enum GunType {
  2. M416, // 0
  3. AK47, // 1
  4. Goza // 2
  5. }

any 任意值类型

any 代表任意类型,一般在获取 DOM 时使用 在接收用户输入 或 第三方代码库时,还不能确定会返回什么类型的值,此时也可以用 any 类型

  1. let txtName: any = document.getElementById('txtN');

unknown 未知值类型

unknownany 是 TypeScript 的顶级类型

any 一样能被各种类型赋值,但是它只能赋值给 anyunknown 类型。
这是因为在不知道 unknown 具体的值是什么类型的情况下,只能赋值给能够保存任意类型的容器。

  1. // 设置为 unknown 类型后,这些操作将不再正确;
  2. let value: unknown;
  3. value.foo.bar; // Error
  4. value.trim(); // Error
  5. value(); // Error
  6. new value(); // Error
  7. value[0][1]; // Error

void 空值类型

void 代表没有类型,一般用在无返回值的函数

  1. function sayhi(): string {
  2. return 'hi,你好';
  3. }
  4. function sayhi1(): void {
  5. console.log('111')
  6. }

never 类型

never 类型是其他类型(包括 nullundefined )的子类型,代表永远不会出现的值。

常用作为 抛出异常无限循环 的函数返回类型。 声明 never 的变量只能被 never 类型所赋值。

  1. function test(): never {
  2. while(true) {
  3. // ...
  4. }
  5. }
  6. function test2(): never {
  7. throw new Error('error');
  8. }
  9. let a = (() => {
  10. throw new Error('错误')
  11. })()

never 类型是 ts 中的底部类型,所有类型都是 never 类型的父类,所以 never 类型值可以赋给任意类型的变量

  1. let x: never = test();
  2. let y: string = test();

TypeScript 中,可以利用 never 类型来实现全面性检查:

  1. type Foo = string | number;
  2. function controlFlowAnalysisWithNever(foo: Foo) {
  3. if (typeof foo === "string") {
  4. // 这里 foo 被收窄为 string 类型
  5. } else if (typeof foo === "number") {
  6. // 这里 foo 被收窄为 number 类型
  7. } else {
  8. // foo 在这里是 never
  9. const check: never = foo;
  10. }
  11. }

3. 类型推论

如果没有明确的指定类型,那么 TypeScript 会依照类型推论(Type Inference)的规则推断出一个类型。

如果变量的声明和初始化是在同一行,可以省略掉变量类型的声明。

  1. let 变量名 = 值;
  2. // 相当于
  3. let 变量名: 变量类型 = 值;
  4. let age = 18;
  5. age = 'string'; // error

4. 联合类型

表示可以取值为多种类型中的一种,通常与 nullundefined 一起使用

  1. let 变量名: 变量类型1 | 变量类型2 = 值;
  2. let num: number | undefined;
  3. console.log(num);
  4. num = 123;
  5. console.log(num);

5. 交叉类型

将多个类型合并为一个类型

  1. interface IPerson {
  2. id: string;
  3. age: number;
  4. }
  5. interface IWorker {
  6. companyId: string;
  7. }
  8. // 两者求并集,同时拥有 IPerson 和 IWorker 这两种类型的成员
  9. type IStaff = IPerson & IWorker;
  10. const staff: IStaff = {
  11. id: 'E1006',
  12. age: 33,
  13. companyId: 'EFT'
  14. };
  15. console.dir(staff)

6. 类型保护

类型保护是可执行运行时检查的一种表达式,用于确保该类型在一定的范围内。
换句话说,类型保护可以保证一个字符串是一个字符串,尽管它的值也可以是一个数值。
类型保护与特性检测并不是完全不同,其主要思想是尝试检测属性、方法或原型,以确定如何处理值
目前主要有四种的方式来实现类型保护:

  1. in 关键字

  2. 6.1 in 关键字

    ```typescript interface Admin { name: string; privileges: string[]; }

interface Employee { name: string; startDate: Date; }

type UnknownEmployee = Employee | Admin;

function printEmployeeInformation(emp: UnknownEmployee) { console.log(“Name: “ + emp.name); if (“privileges” in emp) { console.log(“Privileges: “ + emp.privileges); } if (“startDate” in emp) { console.log(“Start Date: “ + emp.startDate); } }

  1. <a name="TMPWm"></a>
  2. ## 6.2 typeof 关键字
  3. typeof 返回的结果是以下字符串之一。<br />`"string" | "number" | "bigint" | "boolean" | "symbol" | "undefined" | "object" | "function"`
  4. ```typescript
  5. function padLeft(value: string, padding: string | number) {
  6. if (typeof padding === "number") {
  7. return Array(padding + 1).join(" ") + value;
  8. }
  9. if (typeof padding === "function") {
  10. return padding + value;
  11. }
  12. throw new Error(`Expected string or number, got '${padding}'.`);
  13. }

6.3 instanof 关键字

  1. interface Padder {
  2. getPaddingString(): string;
  3. }
  4. class SpaceRepeatingPadder implements Padder {
  5. constructor(private numSpaces: number) {}
  6. getPaddingString() {
  7. return Array(this.numSpaces + 1).join(" ");
  8. }
  9. }
  10. class StringPadder implements Padder {
  11. constructor(private value: string) {}
  12. getPaddingString() {
  13. return this.value;
  14. }
  15. }
  16. let padder: Padder = new SpaceRepeatingPadder(6);
  17. if (padder instanceof SpaceRepeatingPadder) {
  18. // padder的类型收窄为 'SpaceRepeatingPadder'
  19. padder.getPaddingString()
  20. }

6.4 is 关键字——自定义类型保护谓词

  1. function isNumber(x: any): x is number {
  2. return typeof x === "number";
  3. }
  4. function isString(x: any): x is string {
  5. return typeof x === "string";
  6. }
  1. interface IUserProps {
  2. vType: 'userProps';
  3. name: string;
  4. email: string;
  5. }
  6. function isUserProps(x: any): x is IUserProps {
  7. return x.vType === 'userProps';
  8. }
  9. class UserProps {
  10. name: string;
  11. email: string;
  12. vType: string;
  13. constructor(name: string, email: string) {
  14. this.name = name;
  15. this.email = email;
  16. this.vType = 'userProps';
  17. }
  18. }
  19. const obj = new UserProps('konsoue', 'xx@qq.com')
  20. if (isUserProps(obj)) {
  21. // to something
  22. }