你知道TS中的declare关键字吗

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,
}

模块和命名空间

当我们想把变量、函数和类组织在一起,就可以将declaremodulenamespace一起使用。

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';
}
相关推荐
芭拉拉小魔仙37 分钟前
前端文件下载与错误处理实战指南
前端
Yao8061 小时前
MinIO自建对象存储,省OSS费用的完整方案
前端·后端
2501_933923251 小时前
设计网页的时候加载不出来怎么办?认识常见的状态码
前端·spring
only-lucky1 小时前
QML深入学习五(Controls模块)
前端·javascript·学习
程序员黑豆2 小时前
鸿蒙应用开发之路由:Router 页面路由使用教程
前端·harmonyos
gyx_这个杀手不太冷静2 小时前
Agent开发进阶指南(第 2 章):Agent 运行全流程拆解、上下文窗口、流式输出、记忆系统与 Function Call 实战
前端·架构·agent
anyup2 小时前
像这种问题千万别自己动手,否则你可太看不起 AI 了
前端·架构·trae
hunterandroid3 小时前
[鸿蒙从零到一] HarmonyOS Web 组件与 JSBridge 通信实战:从页面加载到安全协议
前端
xingren3 小时前
「拍摄器」UI 特效 - 在 Winform/WPF/WinUI3/Avalonia/Web 的实现
前端
leslie1183 小时前
npm常用命令
前端·npm