- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有一个使用 requirejs 编写的模块,我需要它才能在 Angular 4 中工作。为了理解这个过程,我创建了一个简化的 requirejs 模块,并试图为其创建一个 .d.ts 文件,但是我在编译代码时遇到了问题。
我的目录结构是这样的
.
+--index.html
+--lib
| +-require
| +--require.js
|
+--js
| +-bootstrap.ts
+-test.js
+-test
+-index.d.ts
我的 index.html 文件是这样的
<html>
<body>
...
<script type="text/javascript" src="lib/require/require.js" data-main="js/bootstrap"></script>
</body>
</html>
我的 bootstrap.js
import test from 'test';
add(5,6);
我的测试.js
define(function(){
return {
add: function(x, y){
console.log(x + y);
return x+y;
}
};
});
我的测试/index.d.ts
export function add(a:number, b:number):number;
当我尝试编译我的 bootstrap.ts 时出现此错误
bootstrap.ts(2,18): error TS2307: Cannot find module 'test'.
bootstrap.ts(3,1): error TS2304: Cannot find name 'add'.
最佳答案
JavaScript 中有 3 种常见的模块系统类型:AMD (require.js),Common.js (由 Node 使用)和 ES6 modules (在 Node.js 中仍然不可用,没有标志,但被 TypeScript 使用,尽管 TypeScript 可以编译到所有 3 个模块系统)。
AMD 是异步的.. 这意味着,当您需要
某物时,该某物在可用时将在回调中提供。
示例:
// AMD
require("x", (x) => { /* x is available here */ })
另外两个是同步的
// CommonJS
var x = require("x")
// x is available here, synchronously (no callback)
// ES6 Modules
import x from "x"
// x is available here, synchronously (no callback)
首先,你的test.d.ts
有问题。如果test.js
是这样的:
define(function(){
return {
add: function(x, y){
console.log(x + y);
return x+y;
}
};
});
这个模块没有像您假设的那样返回函数 add
。它实际上是返回一个包含函数 add 的对象。所以,这个 JavaScript 文件的声明应该是这样的:
declare module "test" {
const math: {
add: (a:number, b:number) => number
}
export default math
}
请注意,在此处为 test
创建声明时,我完全忽略 define
函数。为什么?因为 TypeScript 总是在语法上使用 ES6 模块,然而,当您编译时,您可以使用 tsconfig.json
中的 compilerOptions.module
来指定使用哪个模块系统。
现在,当您导入
test
模块时,您再次使用 ES6 模块并让 TypeScript 将其编译为 AMD,如果您愿意的话。
这就是您的 bootstrap
文件的样子:
import test from "test"
console.log(test.add(3,4))
同样,你的假设是错误的。如果你正在导入模块 test
,你不能无中生有地调用 add
。你必须调用 test.add
😄
现在,如果您使用 amd
作为 TypeScript 模块系统,您的编译 bootstrap
文件将如下所示:
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
define(["require", "exports", "test"], function (require, exports, test_1) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
test_1 = __importDefault(test_1);
console.log(test_1.default.add(3, 4));
});
关于typescript - 为 requirejs 模块创建 .d.ts 文件时遇到问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52239403/
如何使用 requirejs 导入 recaptcha。我已经尝试了几件事,但没有任何效果。 我需要这样做,以便能够在加载后使用 reCaptcha 的渲染方法自行渲染它。 require.confi
我正在尝试将 OpenLayers 库与 RequireJS 一起使用。 问题是,OpenLayers 一直处于“未定义”状态,即使它被列为我的模块的唯一依赖项: define(['OpenLayer
我正在尝试使用 gulp-requirejs构建一个演示项目。我希望结果是一个包含所有 js 依赖项和模板的单个文件。这是我的 gulpfile.js var gulp = require('gulp
没有 Require.js 就可以在浏览器控制台中调用全局对象,例如 app app.movies 当我将代码包装在 RequireJS 模块中时,如何在浏览器控制台中访问模块中的数据?我会发现这有助
这个问题有 3 个部分。我有两个模块 a 和 b。 如何在最初需要 b 后重新定义它? 如果 a 依赖于 b,我该如何更新 a 以使用新的 b? 如何找到所有依赖于 b 的模块并更新它们? 例如;
我正在尝试找到一种将 Backbone-relational 子模型与 RequireJS 一起使用的方法,其中子模型与 super 模型位于不同的文件中。 例如: // app.js define(
使用 require.js (r.js) 优化 js 代码时,将所有 js 源代码复制到目标目录(dir 属性)。 有没有办法(一些配置)来防止 requirejs 复制源文件? 最佳答案 如果添加
main.js 文件中的代码如下: phantom.injectJs("libs/require-1.0.7.js"); require.config( {
我在 require-config.js 中配置了一些路径,如下所示: var require = { baseUrl: '/javascript', paths: {
我正在重构一个大型 javascript 代码库以使用 RequireJS。不幸的是,我正在处理的许多文件都不是面向对象的,并且在不进行重大修改的情况下无法返回对象。是否有更有效的方法让“依赖”模块访
我是 RequireJS 的新手,我对加载顺序感到困惑。 我有一个全局项目配置,需要在位于 js/app/* 的模块之前加载。 这是我的结构: index.html config.js js/
我已经使用 requireJS 设置了一个 Angular 应用程序。在部署之前,我将所有内容捆绑到一个唯一的文件中。通常,外部库没有 requireJS“定义”包装器。 例如Angular Para
假设我有一个如下所示的模块: define(['jquery', 'actions', 'util', 'text!../templates/dialog.html!strip', 'text!../
如何使用 grunt-contrib-requirejs配置或什至r.js Config不缩小特定文件。 我可以使用optimize: 'none'选项禁用所有文件的缩小。但我不知道如何对单个文件禁用
好吧,我已经知道你应该像这样使用 RequireJS 配置路径 require.config({ paths: { name: 'value' } }); 并这样调用它。 requir
我希望能够有选择地定义一个模块,然后在我的代码中使用或不使用它。我正在考虑的特殊情况是在调试/测试环境中加载模拟/ stub 模块,但不是在我上线时加载。这是示例: 在 html 文件中,可以选择加载
我为构建过程创建了一个任务,其中 requirejs 作为它的子任务之一,并且在 requirejs 之后几乎没有其他任务。该任务在运行 requirejs 后停止,即使使用详细信息也不会抛出错误。任
我想创建一个可以从我的 RequireJS 项目中的任何模块访问的变量。 例如,在初始化时我想设置: this.myVar = 123; 并且能够在我的 RequireJS 项目内部(但不是外部)的任
我正在使用 TypeScript、Backbone 和 Mustache 编写网络应用程序。我想使用 Requirejs 进行依赖加载。 我还在使用 TypeScript 的 Web Essentia
我正在尝试创建一个节点样板,并尝试创建一个任务来运行 Jasmine 测试。我的 Gruntfile.js 中有以下配置: jasmine: { src : ['static/test/spec/
我是一名优秀的程序员,十分优秀!