Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typescript 什么是';宣布';在';导出声明类操作';?_Typescript - Fatal编程技术网

Typescript 什么是';宣布';在';导出声明类操作';?

Typescript 什么是';宣布';在';导出声明类操作';?,typescript,Typescript,为什么我们需要在语句中声明 export declare class Actions { ... } 找到我要找的东西: 声明vs.var var创建一个新变量声明用于告诉TypeScript变量已在其他地方创建。如果使用declare,则不会向生成的JavaScript中添加任何内容—它只是对编译器的提示 例如,如果您使用定义var externalModule的外部脚本,您将使用declare var externalModule向TypeScript编译器提示externalMo

为什么我们需要在语句中声明

export declare class Actions {
    ...
}

找到我要找的东西:

声明vs.var

var
创建一个新变量<代码>声明
用于告诉TypeScript变量已在其他地方创建。如果使用
declare
,则不会向生成的JavaScript中添加任何内容—它只是对编译器的提示


例如,如果您使用定义
var externalModule
的外部脚本,您将使用
declare var externalModule
向TypeScript编译器提示
externalModule
已经设置了要理解这一点,您必须首先理解“declare”关键字

以下是一个很好的解释:

TypeScript declare关键字用于声明可能不是源于TypeScript文件的变量

例如,假设我们有一个名为myLibrary的库,它没有TypeScript声明文件,并且在全局命名空间中有一个名为myLibrary的命名空间。如果要在TypeScript代码中使用该库,可以使用以下代码:

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

var myLibrary: any;

这两个代码示例将产生相同的JavaScript输出,但declare示例更具可读性,并表示环境声明


因此,在理解了“declare”关键字之后,请返回到找到

export declare class Action{
...
}

该类的实际实现可能在其他地方,可能是一个.js文件。

在这种特定情况下,declare关键字:

export declare class Actions {
    ...
}
。。。显然是无用的,我认为TypeScript应该考虑这是一个错误(我不知道是否有隐藏的原因)。如果您声明一个类,您将永远不需要导入它。如果导出类时希望有人导入它,则不需要声明它。由于您正在声明这个类,根据定义,这个类应该是可用的,而无需导入它。但是,当导出声明类时,情况并非如此。您需要导入它以使用

TL;DR

export declare class Actions {
    ...
}

declare class Actions {
    ...
}

declare
-不带任何导入或导出关键字-定义由TypeScript自动选取的声明文件,这是一项有用的功能,可将键入添加到遗留模块(未定义TypeScript的npm安装包)

导入
/
导出
是使用模块的正确方式,任何东西都需要手动导入(我觉得有点乏味),要么是逻辑,要么是定义

作为一个实际用例,
export declare
允许您避免导出所有子元素,例如:

export declare namespace Redux {
    namespace Store {
        interface Definition { ... }
    }
}
这可能比以下内容更容易阅读:

export namespace Redux {
    export namespace Store {
        export interface Definition { ... }
    }
}
外部导入在这两种情况下都是相同的(例如,
import{Redux}来自'definitions/Redux';
),我不知道这是否是一个好的实践,但我发现它很整洁^^

请务必记住,将
导入
导出
添加到文件中会将其提升为一个模块,因此
声明
范围将不再处于全局级别

另外,这里有一个bug():如果您在声明中使用
const enum
(我对redux操作类型这样做),并且您指定了
transpileOnly
标志(create-react-app-typescript包会这样做,这就是我知道的原因),那么enum将不会内联!你可以跑进去,也可以不跑,但事先知道是很有用的

在typescript中声明
: typescript中的
declare
关键字有助于告诉typescript编译器声明是在其他地方定义的(在外部javascript文件或运行时环境的一部分中编写的)

假设我们在其他地方声明了一个名为foo的变量。当我们尝试引用变量时,typescript编译器将抛出一个错误:

foo = 'random'; // Error: 'foo' is not defined
我们可以使用
declare
关键字解决此问题:

declare var foo: string;
foo = 'random';  // no error anymore
这将产生以下后果:

  • foo
    实际上没有在其他任何地方声明,并且我们尝试使用该变量时,可能会发生运行时错误。因此,只有当您知道变量此时可用时,才使用
    declare
    关键字
  • 因为我们知道类型,我们(可能)可以访问我们的IDEIntellisense
  • 因为我们知道类型,typescript编译器可以在编译时检查类型,并在某些情况下使用错误的类型时发出警告

我有一个类似的场景,外部JS定义了一个变量
externalModule
。为什么
externalModule
在运行时没有定义,而其他一些变量没有定义?“这两个代码示例将产生相同的JavaScript输出”,这是不正确的:
declare var myLibrary
将传输为空:@Terrance Gil Flink博客的链接对我不起作用(建立数据库连接时出错)我认为这可能是相同的内容:模块ala
export namespace
中的名称空间是和add。关于
export declare
,请看一下AndréPena的答案。我认为它们不一样,前者需要与
import
一起使用,后者也不需要,declare不会破坏.d.ts文件的全局范围其中导出不…(声明不使文件成为模块)