typescript 在“export declare class”中,“declare "是做什么的?

ulmd4ohb  于 2023-11-20  发布在  TypeScript
关注(0)|答案(5)|浏览(328)

为什么我们在语句中需要declare

  1. export declare class Actions {
  2. ...
  3. }

字符串

ar7v8xwq

ar7v8xwq1#

找到了我要找的东西
December vs. var
var创建一个新变量。declare用于告诉TypeScript该变量已在其他地方创建。如果使用declare,则不会向生成的JavaScript添加任何内容-它只是对编译器的提示。
例如,如果您使用定义var externalModule的外部脚本,则可以使用declare var externalModule向TypeScript编译器提示externalModule已经设置

20jt8wwn

20jt8wwn2#

要理解这一点,首先要理解“declare”关键字。
下面是Gil Fink's Blog的一个很好的解释:
TypeScript declare关键字用于声明可能不是源自TypeScript文件的变量。
例如,假设我们有一个名为myLibrary的库,它没有TypeScript声明文件,并且在全局命名空间中有一个名为myLibrary的命名空间。如果你想在TypeScript代码中使用这个库,你可以使用以下代码:

  1. declare var myLibrary;

字符串
TypeScript运行时将给予myLibrary变量的类型是any类型。这里的问题是,您在设计时不会为该变量提供Intellisense,但您可以在代码中使用该库。另一个不使用declare关键字的相同行为的选项是使用具有any类型的变量:

  1. var myLibrary: any;


这两个代码示例将导致相同的JavaScript输出,但declare示例更具可读性,并表示环境声明。
所以在你理解了“declare”关键字之后,回到你找到以下内容的地方:

  1. export declare class Action{
  2. // ...
  3. }


类的真实的实现可能在其他地方,可能是一个.js文件。
为了突出@apollo的评论,请查看以下内容:
x1c 0d1x的数据

展开查看全部
xkftehaa

xkftehaa3#

declare在typescript中:

typescript中的declare关键字用于告诉typescript编译器某个声明是在其他地方定义的(在外部JavaScript文件或运行时环境的一部分中)。
假设我们在其他地方声明了一个名为foo的变量。当我们试图引用这个变量时,typescript编译器会抛出一个错误:

  1. foo = 'random'; // Error: 'foo' is not defined

字符串
我们可以使用declare关键字来解决这个问题:

  1. declare var foo: string;
  2. foo = 'random'; // no error anymore


这会产生以下后果:

  • foo实际上没有在其他任何地方声明时,我们试图使用该变量可能会发生运行时错误。所以只有在你知道该变量在此时可用时才使用declare关键字。
  • 因为我们知道类型,我们(潜在地)可以访问我们的IDE智能感知
  • 因为我们知道类型,typescript编译器可以在编译时检查类型,如果我们在某些情况下使用了错误的类型,它可以警告我们。
展开查看全部
mfpqipee

mfpqipee4#

declare关键字在本例中:

  1. export declare class Actions {
  2. ...
  3. }

字符串
.显然是无用的,我认为TypeScript应该考虑将其视为错误(我不知道是否有隐藏的原因)。如果你声明了一个类,你将永远不需要导入它。如果你导出一个类期待有人导入它,你不需要声明它。而且因为你声明了这个类,根据定义,这个类应该是可以使用的,而不需要导入它。但是当你导出声明一个类的时候,这是不正确的。你需要**导入它才能使用。

TL;DR

  1. export declare class Actions {
  2. ...
  3. }


是一样的

  1. declare class Actions {
  2. ...
  3. }

展开查看全部
a8jjtwal

a8jjtwal5#

declare-没有任何导入或导出关键字-定义了TypeScript自动选择的声明文件,这是一个有用的功能,可以将类型添加到遗留模块(npm安装的没有TypeScript定义的包)。
import/export是使用模块的正确方式,所有内容都需要手动导入(我觉得有点繁琐),无论是逻辑还是定义。
作为一个实际的用例,export declare允许您避免导出所有子元素,例如:

  1. export declare namespace Redux {
  2. namespace Store {
  3. interface Definition { ... }
  4. }
  5. }

字符串
这可能比阅读更容易:

  1. export namespace Redux {
  2. export namespace Store {
  3. export interface Definition { ... }
  4. }
  5. }


两种情况下的外部导入是相同的(例如import { Redux } from 'definitions/redux';),我不知道这是否是一个好的做法,但我发现它很整洁!^^
重要的是要记住,向文件中添加importexport将使其成为一个模块,因此declare范围将不再处于全局级别。
PS,这里有一个bug(issue 16671):如果你在声明中使用const enum(我为redux操作类型这样做),并且你指定了transpileOnly标志(* repeat-react-app-typescript* 包,这就是我知道的原因),枚举将不会内联!你可能会在其中运行,也可能不会,但是提前知道是很有用的!

展开查看全部

相关问题