如何优化 TypeScript 中的数据同步代码

69 阅读1分钟

在前端开发中,我们经常需要处理数据的备份和恢复操作。今天分享一个实际案例的优化过程,展示如何让代码更加优雅和可维护。

原始代码的问题

假设我们有一个用于同步用户配置的类:

class ConfigSync {

  async restore(token: string) {

    const cloudData = await fetchCloudData(token);

    if (cloudData.theme) {

      themeManager.set(cloudData.theme);

    }

    if (cloudData.layout) {

      layoutManager.set(cloudData.layout);

    }

    if (cloudData.preferences) {

      preferencesManager.set(cloudData.preferences);

    }

    

    // 存储本地配置

    if (cloudData.fontSize) {

      localStorage.setItem('app.fontSize', JSON.stringify(cloudData.fontSize));

    }

    if (cloudData.language) {

      localStorage.setItem('app.language', JSON.stringify(cloudData.language));

    }

    if (cloudData.darkMode) {

      localStorage.setItem('app.darkMode', JSON.stringify(cloudData.darkMode));

    }

    // ... 更多类似的代码

  }

}

这段代码存在以下问题:

  • 重复的条件判断

  • 代码结构松散

  • 错误处理不完善

  • 可维护性差

class ConfigSync {
  async restore(token: string) {
    if (!token) return;
    
    try {
      const cloudData = await fetchCloudData(token);
      if (!cloudData) return;

      // 统一管理器配置
      const managers = {
        theme: themeManager,
        layout: layoutManager,
        preferences: preferencesManager,
      };

      // 批量处理管理器数据
      Object.entries(managers).forEach(([key, manager]) => {
        if (cloudData[key]) {
          manager.set(cloudData[key]);
        }
      });

      // 本地存储配置项
      const localStorageKeys = [
        'app.fontSize',
        'app.language',
        'app.darkMode',
      ];

      // 批量处理本地存储
      localStorageKeys.forEach(key => {
        const configKey = key.split('.')[1];
        if (cloudData[configKey]) {
          localStorage.setItem(key, JSON.stringify(cloudData[configKey]));
        }
      });
    } catch (error) {
      console.error('Failed to restore config:', error);
    }
  }
}

优化要点

  • 早期返回:通过早期返回避免不必要的处理逻辑
if (!token) return;
  • 对象映射:使用对象统一管理相关配置
const managers = {

  theme: themeManager,

  layout: layoutManager,

  // ...

};
  • 批量处理:使用数组和循环替代重复代码
localStorageKeys.forEach(key => {

      // 批量处理逻辑

    });
  • 错误处理:添加 try-catch 确保代码健壮性

try {

  // 主要逻辑

} catch (error) {

  console.error('Error:'error);

}

总结

通过以上优化,我们实现了:

  • 代码更加简洁和可维护

  • 减少了重复代码

  • 提高了代码的可读性

  • 增强了错误处理能力

这些优化原则不仅适用于配置同步,也可以应用到其他类似的数据处理场景中。记住,好的代码不仅要实现功能,更要易于维护和扩展。