为什么我们在语句中需要declare?
declare
export declare class Actions { ...}
export declare class Actions {
...
}
字符串
ar7v8xwq1#
找到了我要找的东西December vs. varvar创建一个新变量。declare用于告诉TypeScript该变量已在其他地方创建。如果使用declare,则不会向生成的JavaScript添加任何内容-它只是对编译器的提示。例如,如果您使用定义var externalModule的外部脚本,则可以使用declare var externalModule向TypeScript编译器提示externalModule已经设置
var
var externalModule
declare var externalModule
externalModule
20jt8wwn2#
要理解这一点,首先要理解“declare”关键字。下面是Gil Fink's Blog的一个很好的解释:TypeScript declare关键字用于声明可能不是源自TypeScript文件的变量。例如,假设我们有一个名为myLibrary的库,它没有TypeScript声明文件,并且在全局命名空间中有一个名为myLibrary的命名空间。如果你想在TypeScript代码中使用这个库,你可以使用以下代码:
declare var myLibrary;
字符串TypeScript运行时将给予myLibrary变量的类型是any类型。这里的问题是,您在设计时不会为该变量提供Intellisense,但您可以在代码中使用该库。另一个不使用declare关键字的相同行为的选项是使用具有any类型的变量:
var myLibrary: any;
型这两个代码示例将导致相同的JavaScript输出,但declare示例更具可读性,并表示环境声明。所以在你理解了“declare”关键字之后,回到你找到以下内容的地方:
export declare class Action{ // ...}
export declare class Action{
// ...
型类的真实的实现可能在其他地方,可能是一个.js文件。为了突出@apollo的评论,请查看以下内容:x1c 0d1x的数据
.js
xkftehaa3#
typescript中的declare关键字用于告诉typescript编译器某个声明是在其他地方定义的(在外部JavaScript文件或运行时环境的一部分中)。假设我们在其他地方声明了一个名为foo的变量。当我们试图引用这个变量时,typescript编译器会抛出一个错误:
foo = 'random'; // Error: 'foo' is not defined
字符串我们可以使用declare关键字来解决这个问题:
declare var foo: string;foo = 'random'; // no error anymore
declare var foo: string;
foo = 'random'; // no error anymore
型这会产生以下后果:
foo
mfpqipee4#
declare关键字在本例中:
字符串.显然是无用的,我认为TypeScript应该考虑将其视为错误(我不知道是否有隐藏的原因)。如果你声明了一个类,你将永远不需要导入它。如果你导出一个类期待有人导入它,你不需要声明它。而且因为你声明了这个类,根据定义,这个类应该是可以使用的,而不需要导入它。但是当你导出声明一个类的时候,这是不正确的。你需要**导入它才能使用。
TL;DR
型是一样的
declare class Actions { ...}
declare class Actions {
型
a8jjtwal5#
declare-没有任何导入或导出关键字-定义了TypeScript自动选择的声明文件,这是一个有用的功能,可以将类型添加到遗留模块(npm安装的没有TypeScript定义的包)。import/export是使用模块的正确方式,所有内容都需要手动导入(我觉得有点繁琐),无论是逻辑还是定义。作为一个实际的用例,export declare允许您避免导出所有子元素,例如:
import
export
export declare
export declare namespace Redux { namespace Store { interface Definition { ... } }}
export declare namespace Redux {
namespace Store {
interface Definition { ... }
字符串这可能比阅读更容易:
export namespace Redux { export namespace Store { export interface Definition { ... } }}
export namespace Redux {
export namespace Store {
export interface Definition { ... }
型两种情况下的外部导入是相同的(例如import { Redux } from 'definitions/redux';),我不知道这是否是一个好的做法,但我发现它很整洁!^^重要的是要记住,向文件中添加import或export将使其成为一个模块,因此declare范围将不再处于全局级别。PS,这里有一个bug(issue 16671):如果你在声明中使用const enum(我为redux操作类型这样做),并且你指定了transpileOnly标志(* repeat-react-app-typescript* 包,这就是我知道的原因),枚举将不会内联!你可能会在其中运行,也可能不会,但是提前知道是很有用的!
import { Redux } from 'definitions/redux';
const enum
transpileOnly
5条答案
按热度按时间ar7v8xwq1#
找到了我要找的东西
December vs. var
var
创建一个新变量。declare
用于告诉TypeScript该变量已在其他地方创建。如果使用declare
,则不会向生成的JavaScript添加任何内容-它只是对编译器的提示。例如,如果您使用定义
var externalModule
的外部脚本,则可以使用declare var externalModule
向TypeScript编译器提示externalModule
已经设置20jt8wwn2#
要理解这一点,首先要理解“declare”关键字。
下面是Gil Fink's Blog的一个很好的解释:
TypeScript declare关键字用于声明可能不是源自TypeScript文件的变量。
例如,假设我们有一个名为myLibrary的库,它没有TypeScript声明文件,并且在全局命名空间中有一个名为myLibrary的命名空间。如果你想在TypeScript代码中使用这个库,你可以使用以下代码:
字符串
TypeScript运行时将给予myLibrary变量的类型是any类型。这里的问题是,您在设计时不会为该变量提供Intellisense,但您可以在代码中使用该库。另一个不使用declare关键字的相同行为的选项是使用具有any类型的变量:
型
这两个代码示例将导致相同的JavaScript输出,但declare示例更具可读性,并表示环境声明。
所以在你理解了“declare”关键字之后,回到你找到以下内容的地方:
型
类的真实的实现可能在其他地方,可能是一个
.js
文件。为了突出@apollo的评论,请查看以下内容:
x1c 0d1x的数据
xkftehaa3#
declare
在typescript中:typescript中的
declare
关键字用于告诉typescript编译器某个声明是在其他地方定义的(在外部JavaScript文件或运行时环境的一部分中)。假设我们在其他地方声明了一个名为foo的变量。当我们试图引用这个变量时,typescript编译器会抛出一个错误:
字符串
我们可以使用
declare
关键字来解决这个问题:型
这会产生以下后果:
foo
实际上没有在其他任何地方声明时,我们试图使用该变量可能会发生运行时错误。所以只有在你知道该变量在此时可用时才使用declare
关键字。mfpqipee4#
declare关键字在本例中:
字符串
.显然是无用的,我认为TypeScript应该考虑将其视为错误(我不知道是否有隐藏的原因)。如果你声明了一个类,你将永远不需要导入它。如果你导出一个类期待有人导入它,你不需要声明它。而且因为你声明了这个类,根据定义,这个类应该是可以使用的,而不需要导入它。但是当你导出声明一个类的时候,这是不正确的。你需要**导入它才能使用。
TL;DR
型
是一样的
型
a8jjtwal5#
declare
-没有任何导入或导出关键字-定义了TypeScript自动选择的声明文件,这是一个有用的功能,可以将类型添加到遗留模块(npm安装的没有TypeScript定义的包)。import
/export
是使用模块的正确方式,所有内容都需要手动导入(我觉得有点繁琐),无论是逻辑还是定义。作为一个实际的用例,
export declare
允许您避免导出所有子元素,例如:字符串
这可能比阅读更容易:
型
两种情况下的外部导入是相同的(例如
import { Redux } from 'definitions/redux';
),我不知道这是否是一个好的做法,但我发现它很整洁!^^重要的是要记住,向文件中添加
import
或export
将使其成为一个模块,因此declare
范围将不再处于全局级别。PS,这里有一个bug(issue 16671):如果你在声明中使用
const enum
(我为redux操作类型这样做),并且你指定了transpileOnly
标志(* repeat-react-app-typescript* 包,这就是我知道的原因),枚举将不会内联!你可能会在其中运行,也可能不会,但是提前知道是很有用的!