📅  最后修改于: 2021-01-11 12:58:42             🧑  作者: Mango
从JavaScript迁移到TypeScript需要做以下事情:
让我们假设我们有需要转换为TypeScript的JavaScript文件。我们知道,当我们编译TypeScript文件时,它会产生具有相同名称的对应JavaScript文件。在这里,我们需要确保用作输入的原始JavaScript文件不能在同一目录中,以便TypeScript不会覆盖它们。
从以上几点出发,我们将假定目录的设置类似于以下结构。在这里,我们将所有输出文件保存在名为“ build ”的输出目录中。
我们可以使用以下过程从JavaScript迁移到TypeScript:
首先,我们需要在项目中添加tsconfig.json文件。 TypeScript使用tsconfig.json文件来管理项目的编译选项,例如我们要包含和排除的文件。
{
"compilerOptions": {
"outDir": "./built",
"allowJs": true,
"target": "es5"
},
"include": [
"./src/**/*"
]
}
在上面的文件中,我们为TypeScript指定了一些内容:
我们知道,大多数JavaScript项目有像一饮而尽或的WebPack集成构建工具。
注意:每个构建工具都不同。
我们可以通过以下方式将项目与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",
},
// Enable sourcemaps for debugging webpack's output.
devtool: "source-map",
resolve: {
// Add '.ts' and '.tsx' as resolvable extensions.
extensions: ["", ".webpack.js", ".web.js", ".ts", ".tsx", ".js"]
},
module: {
loaders: [
// All files with a '.ts' or '.tsx' extension will be handled by 'awesome-typescript-loader'.
{ test: /\.tsx?$/, loader: "awesome-typescript-loader" }
],
preLoaders: [
// All output '.js' files will have any sourcemaps re-processed by 'source-map-loader'.
{ test: /\.js$/, loader: "source-map-loader" }
]
},
// Other options...
};
在本节中,我们必须将.js文件重命名为.ts文件。同样,如果我们的文件使用JSX,则需要将其重命名为.tsx。现在,如果我们在支持TypeScript的编辑器中打开该文件,我们的某些代码可能会开始出现编译错误。因此,一一转换文件可以更轻松地处理编译错误。如果TypeScript在转换过程中发现任何编译错误,它仍然能够翻译代码,就像Word将打印我们的文档一样。
将js文件移动到ts文件后,TypeScript将立即开始我们代码的类型检查。因此,我们在JavaScript代码中得到了诊断错误。下面列出了我们可能会遇到的一些错误:
a)我们可以使用以下任何一种来抑制错误:
在下面的代码中,我们可以使用类型断言来删除错误。
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()接受三个参数:名称,年龄和身高。我们可以使用两个值来调用此函数:“ Rohit”和23。它在JavaScript中是完全有效的,因为在JavaScript中,如果缺少函数的预期参数,则会将未定义的值分配给该参数。
但是,TypeScript中的相同代码将产生编译错误:期望三个参数,但有两个。要消除此错误,我们可以在参数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中,选项{}的类型是一个空对象。因此,颜色和体积不存在且不可分配。相反,如果我们将声明本身移到对象字面量,则不会出现任何错误:
let options = {
color: "red",
volume: 11
};
我们还可以定义选项的类型,并在对象字面量上添加类型断言。
interface Options { color: string; volume: number }
let options = {} as Options;
options.color = "red";
options.volume = 11;
JavaScript项目使用jQuery或Lodash等第三方库。为了编译文件,TypeScript需要知道这些库中所有对象的类型。我们知道,JavaScript库的TypeScript类型定义文件已经在DefinitelyTyped中可用。因此,我们不需要在外部安装此类型。我们只需要安装项目中使用的那些类型。
例如
对于jQuery ,请安装定义:
$ npm install @types/jquery
对于Lodash ,安装定义:
$ npm install -S @types/lodash
一次,我们对JavaScript项目进行了更改,运行构建工具。现在,我们应该将我们的TypeScript项目编译为可以在浏览器中运行的纯JavaScript。