1. 类型别名与接口的合理使用
- 优化策略:对于简单的类型定义,使用类型别名(
type
),它更灵活,可以用于基本类型、联合类型、交叉类型等。对于对象类型定义,优先考虑接口(interface
),因为接口支持合并,在大型项目中,如果一个对象的类型需要在不同地方扩展,接口更为方便。
- 代码示例:
// 类型别名用于联合类型
type StringOrNumber = string | number;
let value: StringOrNumber = 10;
value = 'hello';
// 接口用于对象类型
interface User {
name: string;
age: number;
}
// 接口合并
interface User {
email: string;
}
let user: User = { name: 'John', age: 30, email: 'john@example.com' };
2. 泛型的运用
- 优化策略:当编写可复用的组件、函数或类时,使用泛型可以提高代码的复用性,减少重复的类型定义。
- 代码示例:
// 泛型函数
function identity<T>(arg: T): T {
return arg;
}
let result = identity<string>('test');
// 泛型类
class Box<T> {
private value: T;
constructor(value: T) {
this.value = value;
}
getValue(): T {
return this.value;
}
}
let box = new Box<number>(42);
3. 类型推断
- 优化策略:TypeScript 有强大的类型推断能力,尽量让编译器自动推断类型,减少不必要的类型注解,使代码更简洁。
- 代码示例:
let num = 10; // 类型推断为 number
function add(a, b) {
return a + b;
}
let sum = add(5, 3); // sum 类型被推断为 number
4. 模块化类型定义
- 优化策略:将相关的类型定义放在单独的模块中,便于管理和复用。可以使用
export
关键字导出类型,在其他模块中使用 import
导入。
- 代码示例:
// types.ts
export type Point = {
x: number;
y: number;
};
// main.ts
import { Point } from './types';
let point: Point = { x: 1, y: 2 };
5. 条件类型与映射类型
- 优化策略:条件类型(
T extends U? X : Y
)可以根据类型关系进行类型选择,映射类型可以基于已有类型创建新类型,这两种类型可以大大减少重复的类型定义。
- 代码示例:
// 条件类型
type IsString<T> = T extends string? true : false;
type Result1 = IsString<string>; // true
type Result2 = IsString<number>; // false
// 映射类型
interface User {
name: string;
age: number;
email: string;
}
type ReadonlyUser = {
readonly [P in keyof User]: User[P];
};
let readonlyUser: ReadonlyUser = { name: 'Jane', age: 25, email: 'jane@example.com' };