从JavaScript迁移到TypeScript

从JavaScript迁移到TypeScript

从JavaScript迁移到TypeScript需要以下几点:

  • 了解JavaScript
  • 了解项目中使用的模式和构建工具。

假设我们要将JavaScript文件转换为TypeScript。我们知道,当我们编译TypeScript文件时,它会生成同名的JavaScript文件。在这里,我们需要确保我们的原始JavaScript文件作为输入的位置与TypeScript的输出位置不同,以便TypeScript不会覆盖它们。

从以上观点出发,我们将假定我们的目录设置如下结构。这里,我们将所有的输出文件都放在名为“built”的输出目录中。

从JavaScript迁移到TypeScript

我们可以使用以下流程从JavaScript迁移到TypeScript

  1. 在项目中添加tsconfig.json文件。
  2. 与构建工具集成。
  3. 将所有.js文件移动到.ts文件。
  4. 检查错误。
  5. 使用第三方JavaScript库。

1. 在项目中添加tsconfig.json文件

首先,我们需要在项目中添加一个tsconfig.json文件。TypeScript使用tsconfig.json文件管理项目的编译选项,例如我们想要包含排除哪些文件。

{
    "compilerOptions": {
        "outDir": "./built",
        "allowJs": true,
        "target": "es5"
    },
    "include": [
        "./src/**/*"
    ]
}

在上述文件中,我们将一些内容指定给TypeScript:

  • include选项读取src目录中的所有文件。
  • allowJs选项接受所有JavaScript文件作为输入。
  • outDir指定所有输出文件应重定向到built文件夹中。
  • target选项指定所有JavaScript结构应翻译成较旧版本,如ECMAScript 5

2. 与构建工具集成

我们知道,大多数JavaScript项目都集成了构建工具,如GulpWebpack

注意:每个构建工具都是不同的。

我们可以使用以下方法将项目与Webpack集成:

a) 在终端上运行以下命令:

$ npm install awesome-typescript-loader source-map-loader

在Webpack集成中,我们使用awesome-typescript-loader(一个TypeScript加载器)与source-map-loader结合使用,以更轻松地调试源代码。

b) 将webpack.config.js文件中的模块配置属性合并到以下加载程序中:

module.exports = {
    entry: "./src/index.ts",
    output: {
        filename: "./dist/bundle.js",
    },
    // 为调试Webpack的输出启用源映射。
    devtool: "source-map",
    resolve: {
        // 将'.ts'和'.tsx'添加到可解析的扩展名中。
        extensions: ["", ".webpack.js", ".web.js", ".ts", ".tsx", ".js"]
    },
    module: {
        loaders: [
            // 所有带有'.ts'或'.tsx'扩展名的文件将由'awesome-typescript-loader'处理。
            { test: /\.tsx?/, loader: "awesome-typescript-loader" }
        ],
        preLoaders: [
            // 所有输出的'.js'文件将通过'source-map-loader'重新处理任何源映射。
            { test: /\.js/, loader: "source-map-loader" }
        ]
    },
    // 其他选项...
};

3. 将所有.js文件移动到.ts文件

在本节中,我们需要将.js文件重命名为.ts文件。同样,如果我们的文件使用了JSX,我们需要将其重命名为.tsx。现在,如果我们在支持TypeScript的编辑器中打开该文件,我们的一些代码可能会开始出现编译错误。因此,逐个转换文件可以更容易地处理编译错误。如果TypeScript在转换过程中发现任何编译错误,它仍然能够像Word打印文档一样转换代码。

4. 检查错误

将js文件转换为ts文件后,TypeScript会立即开始对我们的代码进行类型检查。因此,JavaScript代码中会出现诊断性错误。以下是我们可能遇到的一些错误:

a) 我们可以使用any来消除错误,例如:

在下面的代码中,我们可以通过使用类型断言来删除错误。

var foo = 123;
var bar = 'hey';
bar = foo; // ERROR: cannot assign a number to a string
bar = foo as any  //Ok

b) 参数少或多的函数:

function display(name, age, height) {
    let str1 = "Person named " + name + ",  " + age + " years old";
    let str2 = (height !== undefined) ? (" and " + height +  " feet tall") : '';
    console.log(str1 + str2);
}
display( "Rohit", 32);

在上面的代码中,函数display()接受三个参数:name、age和height。我们可以使用两个值”Rohit”和23来调用这个函数。在JavaScript中,这是完全有效的,因为在JavaScript中,如果一个函数的期望参数缺失,它会将值undefined赋给该参数。

但是,在TypeScript中,相同的代码将会给出编译错误:期望3个参数,但只有2个。为了消除此错误,我们可以在参数height上添加一个可选参数标记,并将我们的代码注释如下:

function display(name: string, age: number, height?: number) {
    let str1: string = "Person named " + name + ",  " + age + " years old";
    let str2: string = (height !== undefined) ? (" and " + height +  " feet tall") : '';
    console.log(str1 + str2);
}

c) 顺序添加属性

以下代码在JavaScript中非常常见。

var options = {};
options.color = "red";
options.volume = 11;

在TypeScript中,类型为{}的options是一个空对象。因此,colorvolume不存在,也不能赋值。如果我们将声明移动到对象字面中,就不会得到任何错误:

let options = {
    color: "red",
    volume: 11
};

我们也可以定义options的类型并在对象字面的属性上添加类型断言

interface Options { color: string; volume: number }

let options = {} as Options;
options.color = "red";
options.volume = 11;

5. 使用第三方JavaScript库

JavaScript项目使用第三方库,如jQueryLodash。为了编译文件,TypeScript需要知道这些库中所有对象的类型。我们知道,JavaScript库的TypeScript类型定义文件已经在DefinitelyTyped上可用。因此,我们不需要外部安装此类型。我们只需要安装我们项目中使用的类型。

例如

对于jQuery,安装定义:

$ npm install @types/jquery

对于Lodash,安装定义:

$ npm install -S @types/lodash

一旦我们对JavaScript项目进行了更改,请运行构建工具。现在,我们应该将TypeScript项目编译为普通的JavaScript,可以在浏览器中运行。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程