Tailwind CSSTailwind CSS
Home
  • Tailwind CSS 书籍目录
  • Vue 3 开发实战指南
  • React 和 Next.js 学习
  • TypeScript
  • React开发框架书籍大纲
  • Shadcn学习大纲
  • Swift 编程语言:从入门到进阶
  • SwiftUI 学习指南
  • 函数式编程大纲
  • Swift 异步编程语言
  • Swift 协议化编程
  • SwiftUI MVVM 开发模式
  • SwiftUI 图表开发书籍
  • SwiftData
  • ArkTS编程语言:从入门到精通
  • 仓颉编程语言:从入门到精通
  • 鸿蒙手机客户端开发实战
  • WPF书籍
  • C#开发书籍
learn
  • Java编程语言
  • Kotlin 编程入门与实战
  • /python/outline.html
  • AI Agent
  • MCP (Model Context Protocol) 应用指南
  • 深度学习
  • 深度学习
  • 强化学习: 理论与实践
  • 扩散模型书籍
  • Agentic AI for Everyone
langchain
Home
  • Tailwind CSS 书籍目录
  • Vue 3 开发实战指南
  • React 和 Next.js 学习
  • TypeScript
  • React开发框架书籍大纲
  • Shadcn学习大纲
  • Swift 编程语言:从入门到进阶
  • SwiftUI 学习指南
  • 函数式编程大纲
  • Swift 异步编程语言
  • Swift 协议化编程
  • SwiftUI MVVM 开发模式
  • SwiftUI 图表开发书籍
  • SwiftData
  • ArkTS编程语言:从入门到精通
  • 仓颉编程语言:从入门到精通
  • 鸿蒙手机客户端开发实战
  • WPF书籍
  • C#开发书籍
learn
  • Java编程语言
  • Kotlin 编程入门与实战
  • /python/outline.html
  • AI Agent
  • MCP (Model Context Protocol) 应用指南
  • 深度学习
  • 深度学习
  • 强化学习: 理论与实践
  • 扩散模型书籍
  • Agentic AI for Everyone
langchain
  • 第12章:性能优化与最佳实践

第12章:性能优化与最佳实践

减少类型定义的冗余

1. 问题背景

在大型 TypeScript 项目中,类型定义的冗余可能导致以下问题:

  • 代码可读性下降
  • 维护成本增加
  • 编译时间增长
  • 潜在的命名冲突

2. 实用技巧

2.1 使用类型别名(Type Alias)

// 冗余方式
function printUser(user: {name: string, age: number}) {...}
function saveUser(user: {name: string, age: number}) {...}

// 优化方式
type User = {
  name: string;
  age: number;
};

function printUser(user: User) {...}
function saveUser(user: User) {...}

2.2 利用接口继承

interface BaseEntity {
  id: string;
  createdAt: Date;
}

interface User extends BaseEntity {
  name: string;
  email: string;
}

2.3 使用 Utility Types

type PartialUser = Partial<User>; // 所有属性变为可选
type ReadonlyUser = Readonly<User>; // 所有属性变为只读

3. 高级模式

3.1 类型组合

type Admin = User & {
  permissions: string[];
};

3.2 使用 typeof 推导

const defaultConfig = {
  apiUrl: 'https://api.example.com',
  timeout: 5000
};

type AppConfig = typeof defaultConfig;

3.3 泛型约束

function mergeObjects<T extends object, U extends object>(obj1: T, obj2: U): T & U {
  return {...obj1, ...obj2};
}

4. 应避免的反模式

4.1 过度使用 any

// 错误示范
function processData(data: any): any {...}

4.2 重复定义相似接口

// 错误示范
interface UserA { name: string; age: number; }
interface UserB { name: string; age: number; email?: string; }

4.3 不必要的复杂类型

// 错误示范
type OverlyComplex = {
  [key: string]: {
    value: any;
    metadata?: {
      created?: Date;
      modified?: Date;
      tags?: string[];
    }
  }
}

5. 工具支持

5.1 ESLint 规则

推荐配置:

  • @typescript-eslint/no-explicit-any
  • @typescript-eslint/no-unused-vars
  • @typescript-eslint/no-duplicate-type-constituents

5.2 类型检查

使用 tsc --noUnusedLocals --noUnusedParameters 标记

6. 性能影响

冗余类型定义会导致:

  • 更长的编译时间(约增加 5-15%)
  • 更大的内存占用
  • 更慢的 IDE 类型检查

7. 实际案例

优化前:

interface Product {
  id: string;
  name: string;
  price: number;
  category: string;
  inventory: {
    stock: number;
    warehouse: string;
  };
}

interface CartItem {
  productId: string;
  productName: string;
  unitPrice: number;
  quantity: number;
}

优化后:

interface Product {
  id: string;
  name: string;
  price: number;
  category: string;
  inventory: Inventory;
}

interface Inventory {
  stock: number;
  warehouse: string;
}

interface CartItem {
  product: Pick<Product, 'id' | 'name' | 'price'>;
  quantity: number;
}

8. 最佳实践总结

  1. DRY 原则(Don't Repeat Yourself)
  2. 优先使用组合而非继承
  3. 合理使用 Utility Types
  4. 定期重构类型定义
  5. 建立项目类型规范文档
Last Updated:: 3/27/25, 10:50 AM