declare是什么
我们在编写自己的代码时,通常使用外部库定义的函数,这时候编译器会因为不知道外部函数的类型定义而报错,而 declare
关键字,就是用来告诉编译器外部函数的类型。 这样的话,编译单个脚本就不会因为使用了外部类型而报错。而且所有的declare
语句都不会出现在编译后的文件里面。
如果你也和我一样在为大厂冲刺的话,欢迎添加我的微信
lx3122178991
,这里有一群小伙伴有着和你同样的目标,欢迎来一起讨论,一同进步。
declare使用说明
declare
关键字可以描述以下类型。
- 变量
- type 或者 interface 命令声明的类型
- class
- 枚举
- 函数
- 模块
- 命名空间
变量
declare 关键字可以给出外部变量的类型描述。
TS
x = 123; // 报错
declare let x:number;
x = 1;
第一行代码,变量x
是其他脚本定义的,当前脚本不知道它的类型,编译器就会报错。 如果使用declare
命令给出它的类型,就不会报错了。如果declare
关键字没有给出变量的类型,那么变量类型默认any
。
TS
declare let x;
x = 1;//any
declare
关键字只用来给出类型描述,不允许设置变量的初始值。
TS
// 报错
declare let x:number = 1;
上面示例中,declare 设置了变量的初始值,结果就报错了。
函数
declare 关键字可以给出外部函数的类型描述。
下面是一个例子。
TS
declare function say(
name:string
):void;
say('张三');
declare 命令给出了say()
的类型描述,因此可以直接使用它。
但是这种单独的函数类型声明语句,只能用于declare
命令后面。 因为TS
不支持单独的函数类型声明语句。
TS
//报错
function say(
name:string
):void;
class
declare 给出 class 类型描述的写法如下。注意**declare
后面不能给出class
的具体实现或初始值。**
TS
declare class A {
constructor(name:string);
eat():void;
}
枚举
declare
关键字给出枚举类型描述有多种写法,并没有什么区别。
例子:
TS
//写法一
declare enum E1 {
A,
B,
}
//写法二
declare enum E2 {
A = 0,
B = 1,
}
//写法三
declare const enum E3 {
A,
B,
}
//写法四
declare const enum E4 {
A = 0,
B = 1,
}
模块和命名空间
当我们想把变量、函数和类组织在一起,就可以将declare
与module
或namespace
一起使用。
TS
declare namespace AnimalLib {
class Animal {
constructor(name:string);
eat():void;
sleep():void;
}
type Animals = 'Fish' | 'Dog';
}
// 或
declare module AnimalLib {
class Animal {
constructor(name:string);
eat(): void;
sleep(): void;
}
type Animals = 'Fish' | 'Dog';
}