TypeScript 进阶教程(二)
本篇文章将继续介绍 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 表示泛型参数,pop
和 push
方法的参数类型和返回值类型都是 T
类型。NumberStack
类则实现了 Stack<number>
接口,pop
和 push
方法的参数类型和返回值类型都是 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、UMD 和 ES6 模块。下面是一个简单的模块化示例:
// 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
,表示它可以是 number
或 string
之一。在运行时,a
可以是数字或字符串类型的值。
交叉类型用于表示一个变量同时具有多种类型的特征,语法如下:
interface A {
a: number;
}
interface B {
b: string;
}
type C = A & B;
let c: C = { a: 123, b: "hello" };
上述代码中,定义了两个接口 A
和 B
,并使用 &
运算符将它们合并为一个新的类型 C
。在变量 c
的定义中,a
的类型是 number
,b
的类型是 string
。
总结
通过本篇 TypeScript 进阶教程,我们了解了 TypeScript 的高级特性,包括泛型、类型推断、模块化、联合类型和交叉类型等内容。掌握这些特性可以提高我们写出规范、可读性强、可维护性强的 TypeScript 代码的能力。但需要注意,在使用这些特性时,也需要加强对变量类型的声明和使用,以提高代码的类型安全性。另外,我们可以查阅 TypeScript 官网中的文档和示例代码,深入了解 TypeScript 的各种特性和用法。
本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。