- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我在让WebPack为用TypeScript编写的项目注入(inject)导入的依赖项时遇到麻烦。我的第一个问题是让TypeScript识别导入的模块。
我有一个 header.ts 文件,该文件声明嵌套在vi.input下的模块并导出VIInputDirective类。在 main.ts 文件中,我尝试从 header.ts 文件导入导出的VIInputDirective类,但似乎无法让TypeScript识别它。
header.ts
module vi.input.header {
import IDirective = angular.IDirective;
export class VIInputDirective implements IDirective {
...
}
}
import {VIInputDirective} from "./header.ts"; // Nothing imported; Cannot Resolve issue
VIInputDirective.whatever(); // Does not work
declare module vi.input {
...
}
import {VIInputDirective} from "./header.ts";
交换为
import VIMHeaderDirective = vi.input.header.VIInputDirective;
,则可以正常工作,但是在转译/注入(inject)时使用webpack会出现以下错误:
VM1469:1Uncaught ReferenceError: vi is not defined
///<reference path="file_path"/>
。
最佳答案
您没有使用模块。模块具有一个或多个顶级import
或export
语句。而是使用全局 namespace 并创建全局 namespace 的子 namespace 来组织程序。这称为显示模块模式。它不涉及使用模块。
不幸的是,TypeScript曾经将此模式称为使用内部模块。此后,该术语已被弃用,强烈建议不要使用module x {}
语法(请注意"
周围缺少x
)。
该语言引入了同义词namespace
,以减少困惑。
Webpack,RequireJS和SystemJS之类的JavaScript加载程序和 bundle 程序可与模块一起使用,这就是TypeScript所称的外部模块。
为了澄清您提到的以下构造,与模块无关
module
/ namespace
语法声明module vi.input.header { ... }
现在写成namespace vi.input.header { ... }
为了最大程度地减少困惑,但无论如何,总是会产生辐射。var vi;
(function (vi) {
var input;
(function (input) {
var header;
(function (header) {
})(header = input.header || (input.header = {}));
})(input = vi.input || (vi.input = {}));
})(vi || (vi = {}));
请注意,这会以各种库常用的模式更改全局范围。类似于上面的namespace
s(以前称为内部模块)具有有趣的属性,即多个文件可以贡献其内容,这实际上是其主要目的。这就解释了嵌套的程度以及上面的输出中对变量的条件赋值。这与使用模块无关。import
成员的
namespace
分配,例如import IDirective = angular.IDirective;
不属于顶级import
声明,因此不会导致其包含文件被视为模块。即使将它们放在文件的顶层也是如此。原因是模块系统(无论是AMD,CommonJS,System还是ES2015),所有都使用字符串作为模块说明符,并从此类字符串中导入。可能代表文件路径,URL,解析的简单名称或合成模块ID。import name = qualified.global.name
语句是TypeScript特定功能,与
模块无关。它们对于嵌套类型和值的别名很有用,但是它们却不能创建模块。
namespace
可以使用,并且有时很优雅地与外部模块中的
一起使用,但它们的语义却大不相同
export namespace app {
export class SomeService { }
}
编译成以下JavaScript
export var app;
(function (app) {
class SomeService {
}
app.SomeService = SomeService;
})(app || (app = {}));
main.ts
export namespace app {
export function bootstrap() { }
}
编译成以下JavaScript
export var app;
(function (app) {
function bootstrap() { }
app.bootstrap = bootstrap;
})(app || (app = {}));
上面的两个都是外部模块,也就是真正的模块,它们使用 namespace 作为内部代码组织机制,但是它们的主要要点是,它们
不为共享的app
命名空间提供,它们各自具有自己的文件范围的
app
变量。双方都没有对另一方成员的隐式访问,
namespace app
的声明不跨文件合并,并且它们具有相似的内部命名方案与它们的模块化无关。
module vi.input.header {
import IDirective = angular.IDirective;
export class VIInputDirective implements IDirective {
static whatever() { }
}
}
如上所述,该文件不是模块,而是使用全局 namespace 公开其声明。如果我们今天写这篇文章,按照惯例,我们将使用
namespace
关键字而不是
module
关键字。
import {VIInputDirective} from "./header.ts"; // Nothing imported; Cannot Resolve issue
VIInputDirective.whatever(); // Does not work
实际上,这两行都行不通,因为您正在将
headers.ts 当作模块来导入,但是正如我们刚刚看到的,它不是模块。此外,第一行是从模块说明符字符串导入的顶级
import
语句,具有讽刺意味的是,它使
main.ts 本身就是一个模块。
declare module vi.input {
....
}
If I swap import {VIInputDirective} from "./header.ts"; in the main.ts file with import VIMHeaderDirective = vi.input.header.VIInputDirective; it works fine, but then webpack on transpile/inject gives me the following error:
import
的目标不是模块说明符字符串,并且不存在其他任何顶级导入或导出操作,它会更改
main.ts ,使其不再是模块。这将导致TypeScript对其进行TypeCheck正确检查,使用
import = namespace.value
相互引用的全局变量是完全合法的,但是它们不是模块,而JavaScript工具(例如Webpack)则在模块上运行。
import {VIInputDirective} from "./header.ts";
VIInputDirective.whatever();
headers.ts
import {IDirective} from 'angular';
export class VIInputDirective implements IDirective {
static whatever() { }
}
不再像您编写本文时的样子,因为它已更新为可以使用适当的模块。如果您需要引用其中的内容,请使用模块语法
import {material} from 'angular';
const dialogOptions: material.IDialogOptions = { ... };
export default dialogOptions;
我尝试过分简化,但为避免就该主题写中篇小说,有必要挥手致意,但我相信我希望能涵盖并传达要点。
关于javascript - TypeScript模块导入和WebPack,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39758237/
我最近在我的机器上安装了 cx_Oracle 模块,以便连接到远程 Oracle 数据库服务器。 (我身边没有 Oracle 客户端)。 Python:版本 2.7 x86 Oracle:版本 11.
我想从 python timeit 模块检查打印以下内容需要多少时间,如何打印, import timeit x = [x for x in range(10000)] timeit.timeit("
我盯着 vs 代码编辑器上的 java 脚本编码,当我尝试将外部模块包含到我的项目中时,代码编辑器提出了这样的建议 -->(文件是 CommonJS 模块;它可能会转换为 ES6 模块。 )..有什么
我有一个 Node 应用程序,我想在标准 ES6 模块格式中使用(即 "type": "module" in the package.json ,并始终使用 import 和 export)而不转译为
我正在学习将 BlueprintJS 合并到我的 React 网络应用程序中,并且在加载某些 CSS 模块时遇到了很多麻烦。 我已经安装了 npm install @blueprintjs/core和
我需要重构一堆具有这样的调用的文件 define(['module1','module2','module3' etc...], function(a, b, c etc...) { //bun
我是 Angular 的新手,正在学习各种教程(Codecademy、thinkster.io 等),并且已经看到了声明应用程序容器的两种方法。首先: var app = angular.module
我正在尝试将 OUnit 与 OCaml 一起使用。 单元代码源码(unit.ml)如下: open OUnit let empty_list = [] let list_a = [1;2;3] le
我在 Angular 1.x 应用程序中使用 webpack 和 ES6 模块。在我设置的 webpack.config 中: resolve: { alias: { 'angular':
internal/modules/cjs/loader.js:750 return process.dlopen(module, path.toNamespacedPath(filename));
在本教程中,您将借助示例了解 JavaScript 中的模块。 随着我们的程序变得越来越大,它可能包含许多行代码。您可以使用模块根据功能将代码分隔在单独的文件中,而不是将所有内容都放在一个文件
我想知道是否可以将此代码更改为仅调用 MyModule.RED 而不是 MyModule.COLORS.RED。我尝试将 mod 设置为变量来存储颜色,但似乎不起作用。难道是我方法不对? (funct
我有以下代码。它是一个 JavaScript 模块。 (function() { // Object var Cahootsy; Cahootsy = { hello:
关闭。这个问题是 opinion-based 。它目前不接受答案。 想要改进这个问题?更新问题,以便 editing this post 可以用事实和引文来回答它。 关闭 2 年前。 Improve
从用户的角度来看,一个模块能够通过 require 加载并返回一个 table,模块导出的接口都被定义在此 table 中(此 table 被作为一个 namespace)。所有的标准库都是模块。标
Ruby的模块非常类似类,除了: 模块不可以有实体 模块不可以有子类 模块由module...end定义. 实际上...模块的'模块类'是'类的类'这个类的父类.搞懂了吗?不懂?让我们继续看
我有一个脚本,它从 CLI 获取 3 个输入变量并将其分别插入到 3 个变量: GetOptions("old_path=s" => \$old_path, "var=s" =
我有一个简单的 python 包,其目录结构如下: wibble | |-----foo | |----ping.py | |-----bar | |----pong.py 简单的
这种语法会非常有用——这不起作用有什么原因吗?谢谢! module Foo = { let bar: string = "bar" }; let bar = Foo.bar; /* works *
我想运行一个命令: - name: install pip shell: "python {"changed": true, "cmd": "python <(curl https://boot
我是一名优秀的程序员,十分优秀!