TypeScript 与 JavaScript 的互操作性
1. 声明文件(.d.ts)
声明文件是一种特殊的文件,用于为 JavaScript 代码提供类型信息。它们以 .d.ts
为扩展名,不包含实现代码,只包含类型声明。
主要用途:
- 为现有的 JavaScript 库提供类型信息
- 在 TypeScript 项目中使用纯 JavaScript 模块
- 描述不是用 TypeScript 编写的代码的形状
示例:
typescript
// 声明文件 example.d.ts
declare function greet(name: string): void;
declare class Person {
name: string;
constructor(name: string);
sayHello(): void;
}
declare namespace MyLibrary {
function doSomething(): void;
const version: string;
}
2. declare 关键字
declare
关键字用于告诉 TypeScript 编译器某个变量、函数、类或模块已经在其他地方定义了,通常是在 JavaScript 代码中。
主要用途:
- 声明全局变量或函数
- 声明外部模块
- 扩展现有对象或模块的类型定义
示例:
typescript
// 声明全局变量
declare var $: any;
// 声明全局函数
declare function setTimeout(callback: () => void, ms: number): number;
// 声明模块
declare module 'my-module' {
export function someFunction(): void;
export const someValue: number;
}
3. 使用第三方 JavaScript 库
当使用第三方 JavaScript 库时,我们需要为其提供类型定义以便在 TypeScript 中使用。
步骤:
安装库本身:
npm install library-name
安装对应的类型定义(如果有):
npm install --save-dev @types/library-name
如果没有官方的类型定义,可以创建一个自定义的声明文件。
示例:使用 lodash
typescript
// 安装 lodash 和它的类型定义
// npm install lodash
// npm install --save-dev @types/lodash
import _ from 'lodash';
const numbers = [1, 2, 3, 4, 5];
const sum = _.sum(numbers);
console.log(sum); // 输出: 15
4. 快速创建声明文件的方法
对于大型 JavaScript 项目,手动创建声明文件可能会很繁琐。以下是一些快捷方法:
使用 TypeScript 的自动类型推断: 将
.js
文件重命名为.ts
,TypeScript 会尝试推断类型。使用 JSDoc 注释: 在 JavaScript 文件中使用 JSDoc 注释,TypeScript 可以从中生成类型信息。
javascript/** * @param {string} name * @returns {void} */ function greet(name) { console.log(`Hello, ${name}!`); }
使用工具自动生成:
dts-gen
:可以为 npm 包自动生成.d.ts
文件。typescript-json-schema
:从 TypeScript 接口生成 JSON schema。
使用
allowJs
和checkJs
编译器选项:allowJs
:- 含义:允许在 TypeScript 项目中导入和使用 JavaScript 文件。
- 作用:当设置为
true
时,TypeScript 编译器将处理.js
文件,就像处理.ts
文件一样。
checkJs
:- 含义:对 JavaScript 文件进行类型检查。
- 作用:当设置为
true
时,TypeScript 编译器会对 JavaScript 文件进行类型检查和错误报告。
这两个选项通常一起使用,以实现对 JavaScript 文件的类型检查和错误报告。例如:
json{ "compilerOptions": { "allowJs": true, "checkJs": true } }
使用这些选项的好处包括:
- 渐进式迁移:逐步将 JavaScript 项目迁移到 TypeScript。
- 提高代码质量:利用 TypeScript 的类型检查功能来提高代码质量。
- 更好的开发体验:获得更好的代码补全和错误提示。
- 与现有 JavaScript 库的兼容性:在 TypeScript 项目中使用现有的 JavaScript 库。