Skip to content
本页内容

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,包含 logwarn


8. 使用 declareexport/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');