跳至主要内容

迁移 (到 TypeScript) 速查表

本速查表汇集了来自真实案例研究的建议和实用程序,这些案例研究涵盖了将大型代码库从纯 JS 或 Flow 迁移到 TypeScript 的团队。它并没有试图去 *说服* 人们这样做,但我们确实收集了公司在其转换体验后提供的少量统计数据。

⚠️ 本速查表非常新,需要我们尽一切努力改进。欢迎提供可靠的建议、结果和最新的内容。

先决条件

阅读 TypeScript 从 JS 迁移的官方指南,并且您应该已经熟悉他们的 React 转换指南

通用转换方法

  • 级别 0:不使用 TypeScript,使用 JSDoc
  • 级别 1A:大部分 JavaScript,逐渐使用更严格的 TypeScript
  • 级别 1B:从一开始就完全重命名为 TypeScript
  • 级别 2:严格的 TypeScript
    • 使用 Microsoft 的 dts-gen 为未类型化的文件生成 .d.ts 文件。此 SO 答案 详细介绍了该主题。
    • 使用 declare 关键字进行环境声明 - 请参阅 声明合并 以内联修补库声明。

成功公司采用的其他技巧/方法

Webpack 提示
  • webpack 加载器:awesome-typescript-loaderts-loader?(社区对此存在一些分歧 - 但请阅读 awesome 的观点)
  • Webpack 配置
module.exports = {

resolve: {
- extensions: ['.js', '.jsx']
+ extensions: ['.ts', '.tsx', '.js', '.jsx']
},

// Source maps support ('inline-source-map' also works)
devtool: 'source-map',

// Add the loader for .ts files.
module: {
loaders: [{
- test: /\.jsx?$/,
- loader: 'babel-loader',
- exclude: [/node_modules/],
+ test: /\.(t|j)sx?$/,
+ loader: ['awesome-typescript-loader?module=es6'],
+ exclude: [/node_modules/]
+ }, {
+ test: /\.js$/,
+ loader: 'source-map-loader',
+ enforce: 'pre'
}]
}
};

关于 ts-loader 和第三方库的特别说明:https://twitter.com/acemarke/status/1091150384184229888

迁移的学术研究

注意:经验软件工程是可取的,但 极其困难。请保持谨慎,但如果您发现高质量的研究,也请分享!

我们的主要发现是,两种静态类型系统都发现了相当一部分的公共错误:Flow 0.30 和 TypeScript 2.0 都成功检测到了 15% 的错误!

另请参阅 我错误地认为:类型GitHub 中编程语言和代码质量的大规模研究

著名公司和开源项目的其他迁移案例

开源项目

迁移结果

  • 对于 Hootsuite,生产部署数量翻倍。
  • 对于 Tiny,发现了意外的全局变量。
  • 对于 Tiny,发现了不正确的函数调用。
  • 对于 Tiny,发现了很少使用且存在错误的未经测试的代码。