Answers:
找到了我想要的东西:
声明与var
var创建一个新变量。declare用于告诉TypeScript变量已在其他位置创建。如果使用declare,则不会向生成的JavaScript添加任何内容-只是对编译器的提示。
例如,如果您使用定义的外部脚本,则var externalModule可以使用它declare var externalModule来提示externalModule已经设置的TypeScript编译器。
externalModule。为什么externalModule在运行时未定义而其他一些变量未定义,这可能是什么原因呢?
要了解这一点,您必须首先了解“ declare”关键字。
这是Gil Fink博客的一个很好的解释:
TypeScript声明关键字用于声明可能不是源自TypeScript文件的变量。
例如,假设我们有一个名为myLibrary的库,它没有TypeScript声明文件,并且在全局命名空间中有一个名为myLibrary的命名空间。如果要在TypeScript代码中使用该库,则可以使用以下代码:
declare var myLibrary;TypeScript运行时将给myLibrary变量的类型是任何类型。这里的问题是,在设计时您不会对该变量使用Intellisense,但可以在代码中使用该库。不使用declare关键字而具有相同行为的另一种选择是仅使用具有任何类型的变量:
var myLibrary: any;这两个代码示例都将产生相同的JavaScript输出,但声明示例更具可读性并表示环境声明。
因此,在您理解了“ declare”关键字之后,请返回找到
export declare class Action{
...
}
该类的实际实现可能在其他地方-可能是.js文件。
declare var myLibrary将transpile落空:typescriptlang.org/play/#code/...
declare 在打字稿中:declaretypescript中的关键字可用于告诉Typescript编译器声明是在其他地方定义的(在外部javascript文件或运行时环境的一部分中编写)。
假设我们在其他地方声明了一个名为foo的变量。然后,当我们尝试引用变量时,打字稿编译器将抛出错误:
foo = 'random'; // Error: 'foo' is not defined
我们可以使用declare关键字解决此问题:
declare var foo: string;
foo = 'random'; // no error anymore
这具有以下后果:
foo实际上未在其他任何地方声明时,我们尝试使用该变量,则可能会发生运行时错误。所以只用declare当您知道变量此时可用时,关键字。在这种特定情况下,define关键字是:
export declare class Actions {
...
}
...显然是没有用的,我认为TypeScript应该考虑将此作为错误(我不知道是否存在隐藏的原因)。如果声明一个类,则永远不需要导入它。如果您导出一个类,希望有人导入它,则无需声明它。而且由于您是在声明该类,因此根据定义,该类应该是可用的,而无需导入它。但是,当您导出声明类时,情况并非如此。您需要导入它才能使用。
TL; DR
export declare class Actions {
...
}
是相同的
declare class Actions {
...
}
import,后者则不需要
declare -不带任何导入或导出关键字-定义由TypeScript自动选择的声明文件,这是将键入添加到旧模块(不带TypeScript定义的npm已安装软件包)的有用功能。
import/ export是使用模块的正确方法,所有内容都需要手动导入(我觉得有些乏味),无论是逻辑上还是定义上。
作为实际用例,export declare可以避免导出所有子元素,例如:
export declare namespace Redux {
namespace Store {
interface Definition { ... }
}
}
可能比以下内容更容易阅读:
export namespace Redux {
export namespace Store {
export interface Definition { ... }
}
}
在两种情况下,外部导入都是相同的(例如, import { Redux } from 'definitions/redux';),我不知道这是否是一个好习惯,但我觉得它很整洁!^^
请务必记住,将import或添加export到文件中会将其提升为模块,因此declare作用域将不再处于全局级别。
PS,有一个错误(问题16671):如果您const enum在声明中使用(我对redux动作类型进行此操作),并且指定了transpileOnly标志(create-react-app-typescript包做了,这就是我知道的原因),枚举不会被内联!您可以运行它,也可以不运行它,但是事前了解很有用!