TypeScript 是 JavaScript 的一个超集,它添加了静态类型系统,使得在开发过程中能够进行更强的类型检查和更明确的代码组织。掌握 TypeScript 的类型系统,能够显著提升 JavaScript 开发的效率和质量。本文将从基础类型到高级技巧,对 TypeScript 类型系统进行深度解析。

基础类型

TypeScript 的基础类型包括:

  • 数字(number):用于表示数值。
  • 字符串(string):用于表示文本。
  • 布尔值(boolean):用于表示真或假。
  • 空值(undefined):表示变量未定义。
  • 空(null):表示空对象或空数组。
  • 任何类型(any):表示可以是任何类型。
let age: number = 25;
let name: string = "张三";
let isStudent: boolean = true;
let gender: undefined;
let car: null = null;
let something: any = 42;

接口(Interfaces)

接口定义了对象的形状,它规定了对象必须具有哪些属性,以及这些属性的类型。

interface Person {
  name: string;
  age: number;
}

let zhangsan: Person = {
  name: "张三",
  age: 25
};

类型别名(Type Aliases)

类型别名可以给一个类型起一个新名字,便于理解和复用。

type StringArray = Array<string>;
let words: StringArray = ["hello", "world"];

联合类型(Union Types)

联合类型表示一个变量可以是多种类型中的一种。

let input: string | number;
input = "Hello"; // 有效
input = 42; // 有效

类型断言(Type Assertions)

类型断言用于告诉 TypeScript 编译器,一个变量是某种特定的类型。

let input = <string>42; // 强制类型断言

高级技巧

高级类型 - 泛型(Generics)

泛型允许在定义函数、接口和类时使用类型参数,这些参数可以在使用时指定具体类型。

function identity<T>(arg: T): T {
  return arg;
}

let output = identity<string>("myString"); // 使用类型字符串

高级类型 - 类型保护(Type Guards)

类型保护是用于确保一个变量是特定类型的有效方法。

function isString(value: any): value is string {
  return typeof value === "string";
}

let input = "Hello";
if (isString(input)) {
  console.log(input.toUpperCase()); // input 会被断言为 string 类型
}

高级类型 - 映射类型(Mapped Types)

映射类型允许你通过重命名现有类型的属性来创建一个新的类型。

type MappedType<T> = {
  [P in keyof T]: T[P];
};

type Person = {
  name: string;
  age: number;
};

type PersonWithoutName = MappedType<Person>;
// PersonWithoutName 类型为 { age: number }

高级类型 - 条件类型(Conditional Types)

条件类型允许你在条件表达式的基础上返回不同的类型。

type T1 = string;
type T2 = number;

type TupleToUnion<T> = T extends (infer U)[] ? U : never;
type TupleToUnion1 = TupleToUnion<[string, number]>; // string | number
type TupleToUnion2 = TupleToUnion<{}>; // never

通过学习并应用 TypeScript 的类型系统,你可以更好地组织代码、提高代码质量,并减少运行时错误。掌握这些高级技巧,将使你的 JavaScript 开发更加高效和可靠。