TypeScript 是 JavaScript 的一个超集,它通过引入类型系统来增强 JavaScript 的类型安全。类型系统是 TypeScript 的核心特性之一,它可以帮助开发者编写更健壮、更易于维护的代码。本文将带你从基础到高级,深入了解 TypeScript 的类型系统,包括类型定义与类型守卫技巧。

一、TypeScript 类型系统概述

TypeScript 的类型系统主要包括以下几部分:

  1. 基本类型:包括数字、字符串、布尔值、null、undefined 等。
  2. 对象类型:用于描述对象的形状和结构。
  3. 数组类型:用于描述数组的元素类型。
  4. 函数类型:用于描述函数的参数和返回值类型。
  5. 接口(Interface):用于描述对象的形状和结构,与类型别名类似。
  6. 类型别名(Type Alias):用于创建新的类型别名。
  7. 联合类型(Union Type):用于表示可能属于多个类型的变量。
  8. 交叉类型(Intersection Type):用于表示同时具有多个类型的变量。
  9. 类型守卫:用于在运行时检查变量的类型。

二、基础类型定义

TypeScript 提供了丰富的基本类型,以下是一些常见的类型定义:

let num: number = 10;
let str: string = "Hello, TypeScript!";
let bool: boolean = true;
let nullVar: null = null;
let undefinedVar: undefined = undefined;

三、对象类型定义

对象类型用于描述对象的形状和结构,可以通过以下几种方式定义:

  1. 接口(Interface)
interface Person {
  name: string;
  age: number;
}
  1. 类型别名(Type Alias)
type Person = {
  name: string;
  age: number;
};
  1. 对象字面量
const person: { name: string; age: number } = { name: "Alice", age: 25 };

四、数组类型定义

数组类型用于描述数组的元素类型,可以通过以下几种方式定义:

  1. 类型后缀
let numbers: number[];
  1. 泛型
let numbers: Array<number>;
  1. 接口
interface NumbersArray {
  [index: number]: number;
}
let numbers: NumbersArray;

五、函数类型定义

函数类型用于描述函数的参数和返回值类型,可以通过以下几种方式定义:

  1. 函数声明
function add(a: number, b: number): number {
  return a + b;
}
  1. 函数表达式
let add: (a: number, b: number) => number = function (a, b) {
  return a + b;
};
  1. 箭头函数
let add = (a: number, b: number): number => a + b;

六、类型守卫

类型守卫用于在运行时检查变量的类型,以下是一些常见的类型守卫技巧:

  1. typeof 操作符
function isString(value: any): value is string {
  return typeof value === "string";
}
  1. in 操作符
interface Person {
  name: string;
  age: number;
}

function isPerson(value: any): value is Person {
  return "name" in value && "age" in value;
}
  1. instanceof 操作符
class Animal {
  constructor(public name: string) {}
}

function isAnimal(value: any): value is Animal {
  return value instanceof Animal;
}
  1. 自定义类型守卫
function isNumber(value: any): value is number {
  return typeof value === "number" && !isNaN(value);
}

七、高级类型技巧

TypeScript 还提供了一些高级类型技巧,如:

  1. 泛型
function identity<T>(arg: T): T {
  return arg;
}
  1. 映射类型
type MapType<T> = {
  [P in keyof T]: T[P];
};
  1. 条件类型
type ConditionalType<T, U = T> = T extends U ? U : T;
  1. 索引访问类型
type IndexType<T, K extends keyof T> = T[K];
  1. 键选择类型
type KeyType<T, K extends keyof T> = K;

八、总结

TypeScript 的类型系统功能强大,可以帮助开发者编写更健壮、更易于维护的代码。通过本文的介绍,相信你已经对 TypeScript 的类型系统有了更深入的了解。在实际开发中,灵活运用类型定义和类型守卫技巧,可以让你在 TypeScript 的世界里游刃有余。