本篇文章将继续介绍 TypeScript 的高级特性,包括泛型、类型推断、模块化、联合类型与交叉类型等内容。

泛型

泛型是一种在使用时才确定类型的编程技术,在 TypeScript 中广泛应用于函数、类和接口的定义中。泛型可以提高代码的重用性和类型安全性,同时也方便了代码的维护和扩展。下面是一个使用泛型的简单示例:

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

console.log(identity(123)); // 输出 123
console.log(identity("hello")); // 输出 "hello"

在上述代码中,<T> 表示泛型参数,在调用 identity 函数时,可以传入任意类型的参数。返回值类型和参数类型相同,都是 T 类型。

泛型不只可以用于函数,还可以用于类和接口的定义中:

interface Stack<T> {
  pop(): T;
  push(item: T): void;
}

class NumberStack implements Stack<number> {
  private items: number[] = [];

  pop(): number {
    return this.items.pop()!;
  }

  push(item: number) {
    this.items.push(item);
  }
}

const stack = new NumberStack();
stack.push(1);
stack.push(2);
console.log(stack.pop()); // 输出 2

在上述代码中,Stack<T> 定义了一个接口,其中 T 表示泛型参数,poppush 方法的参数类型和返回值类型都是 T 类型。NumberStack 类则实现了 Stack<number> 接口,poppush 方法的参数类型和返回值类型都是 number 类型。

类型推断

在 TypeScript 中,编译器可以自动推断出变量的类型。例如:

let a = 123;
let b= "hello";

此时,a 的类型被推断为 number,b 的类型被推断为 string。

在函数中使用类型推断也非常方便:

function add(a: number, b: number) {
  return a + b;
}

let c = add(1, 2); // 类型被推断为 `number`

类型推断可以为我们省略一些冗长的类型声明,但有时也会导致类型错误。在开发过程中,建议多加注意变量类型的声明和使用,尽量避免类型不一致的错误。

模块化

模块化是指将代码拆分成独立的模块,以便于代码的维护和扩展。在 TypeScript 中支持多种模块化方案,包括 CommonJS、AMD、UMDES6 模块。下面是一个简单的模块化示例:

// File: moduleA.ts
export function sayHello(name: string) {
  console.log(`Hello, ${name}!`);
}

// File: moduleB.ts
import { sayHello } from './moduleA';

sayHello('Tom');

// Output: Hello, Tom!

在上述代码中,moduleA.ts 中定义了一个 sayHello 函数,并通过 export 关键字将其暴露给其他模块使用。moduleB.ts 中通过 import 关键字引入了 sayHello 函数,并调用该函数输出了一条信息。

联合类型与交叉类型

在 TypeScript 中,联合类型和交叉类型是两种常用的类型表示方式。

联合类型用于表示一个变量可以是多种类型之一,语法如下:

let a: number | string;
a = 123; // 合法
a = "hello"; // 合法
a = true; // 错误,布尔型不是 number 和 string 之一

上述代码中,a 的类型被定义为 number | string,表示它可以是 numberstring 之一。在运行时,a 可以是数字或字符串类型的值。

交叉类型用于表示一个变量同时具有多种类型的特征,语法如下:

interface A {
  a: number;
}

interface B {
  b: string;
}

type C = A & B;

let c: C = { a: 123, b: "hello" };

上述代码中,定义了两个接口 AB,并使用 & 运算符将它们合并为一个新的类型 C。在变量 c 的定义中,a 的类型是 numberb 的类型是 string

总结

通过本篇 TypeScript 进阶教程,我们了解了 TypeScript 的高级特性,包括泛型、类型推断、模块化、联合类型和交叉类型等内容。掌握这些特性可以提高我们写出规范、可读性强、可维护性强的 TypeScript 代码的能力。但需要注意,在使用这些特性时,也需要加强对变量类型的声明和使用,以提高代码的类型安全性。另外,我们可以查阅 TypeScript 官网中的文档和示例代码,深入了解 TypeScript 的各种特性和用法。

文章目录