declare
在 TypeScript 中,declare 是一个关键字,用于告诉编译器某个变量、函数、类、模块、命名空间等的类型信息,但不在当前文件中实现这些内容。它的主要用途是为 已有的 JavaScript 代码 或 第三方库(如 jQuery、Lodash) 提供类型声明,以便 TypeScript 能识别并进行类型检查。
🧩 declare 的常见使用场景与语法
1. 声明全局变量
ts
declare var jQuery: (selector: string) => any;- 作用:告诉编译器:
jQuery是一个全局变量,它的类型是一个接收字符串并返回any的函数。 - 常用于全局脚本中(比如在 HTML 中通过
<script src="jquery.js">引入)。
2. 声明全局函数
ts
declare function greet(name: string): void;- 表示:存在一个名为
greet的全局函数,它接受一个字符串参数,不返回值。
3. 声明类
ts
declare class Animal {
constructor(name: string);
move(distance: number): void;
}- 用于为 JavaScript 中定义好的类提供类型信息,但不生成实际的 JavaScript 实现。
4. 声明命名空间(namespace)
ts
declare namespace MyLib {
function doSomething(): void;
let version: string;
}- 用于给现有库组织类型。
- 可以像这样使用:
MyLib.doSomething()。
5. 声明模块(用于 CommonJS / ES6 Module)
ts
declare module "lodash" {
export function chunk<T>(array: T[], size?: number): T[][];
}- 这种方式用于第三方库模块声明,一般存在于
.d.ts类型定义文件中。
6. 声明文件 .d.ts(类型声明文件)
- 例如
jquery.d.ts:
ts
declare var $: (selector: string) => any;- 放在项目中或通过
@types包管理,告诉 TypeScript 这个全局变量$存在。 .d.ts文件不会被编译成 JS,只提供类型提示和检查。
7. 声明合并
多个 declare 可以自动合并,例如:
ts
declare namespace MyLib {
function log(message: string): void;
}
declare namespace MyLib {
function warn(message: string): void;
}TypeScript 会合并成一个 MyLib,包含 log 和 warn。
8. 使用 declare 与 export/import 配合
- 在
.d.ts文件中导出类型定义:
ts
declare module "my-lib" {
export function doSomething(): void;
}- 使用方:
ts
import { doSomething } from "my-lib";🛠 注意事项
| 注意点 | 说明 |
|---|---|
declare 只在编译时起作用 | 它不会被编译成 JS 代码,只影响 TS 的类型检查。 |
| 用于提供类型信息 | 不包含实际的实现逻辑。 |
通常用于 .d.ts 文件 | 类型声明文件是专门放置 declare 的地方。 |
✅ 举个综合例子
HTML 中引用 jQuery:
html
<script src="jquery.min.js"></script>TypeScript 中使用:
ts
// jquery.d.ts
declare var $: (selector: string) => any;然后你就可以在 TS 文件中写:
ts
$('body').addClass('loaded');