RequireJS 模块的 TypeScript 定义返回而不导出

标签 typescript typescript2.0

不使用 TypeScript 的用法

我有一个无法编辑的 RequireJS 模块

RequireJS 模块:

//app/Router.js
define([], function() {
  return {
    generate: function(route) { /*do something*/ }
  }
});

该模块没有任何导出,但通过 return 语句,它可以在其他 require 模块中使用,如下所示:

define(['app/Router'], function(router) {
  router.generate('myRoute');
});

我想在 TypeScript 中使用 app/Router.js

变体一:TypeScript 知道类型,但 JS 有错误

所以我尝试制作我的定义模块:

//Router.d.ts
export interface Router
{
    generate(route:string): string;
}
declare let router: Router;
export default router;

在我的 TypeScript 文件中使用它,例如:

import router from 'app/Router'

router.generate('something');

将生成该文件:

define(
  ["require", "exports", "app/Router"], 
  function (require, exports, Router_1)
) {
   Router_1.default.generate();
}

问题是默认属性。 JS 说不能在 null 上调用生成。因为 Router_1 已经是我想要的对象了。

变体 2:JS 是正确的,但 TypeScript 不知道类型

我也试过:

//Router.d.ts
export interface Router
{
    generate(route:string): string;
}
declare let router: Router;
declare module "router" {
    export = router;
}

像这样使用它:

import * as router from 'app/Router'

router.generate('something');

输出是正确的:

define(["require", "exports", "app/Router"], function (require, exports, router) {
  router.generate();
});

但是 TypeScript 编译器说:属性 'generate' 在类型上不存在

问题

为了获得正确的输出并且 TypeScript 知道正确的类型,我的 Router.d.ts 和 import 语句必须是什么样子?

最佳答案

当您使用export default stuff 时,您是在告诉编译器导出的对象有一个名为default 的值为 stuff,如果在 .js 文件中 object.default == undefined 它将在作为函数调用时抛出 TypeError。试试这个方法:

//Router.d.ts

declare module "app/Router" { // <- this must contain the path and the file's name;

    const router: { 
        generate: (route: string) => string; 
    }

    export = router;
}

// in the .ts file ...

import * as router from "app/Router";

router.generate("go/some/url");

使用 tsc 2.6.1 输出:

define(["require", "exports", "app/Router"], function (require, exports, router) {
                                                               //^^^^^^^
    "use strict";                                              //|||||||      
    exports.__esModule = true; // <- it extends this object that was passed as argument ... 
    router.generate("go/some/url");// <- but this was the desired effect, right?
});

我之前不了解 amd 系统,所以我无法判断在函数体内扩展或设置导出对象的后果是什么。我认为所做的更改并不重要,但最好还是自己检查一下。

关于RequireJS 模块的 TypeScript 定义返回而不导出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47319454/

相关文章:

angular - 并行运行多个查询动画

javascript - 如何在 http 拦截器 Angular 中处理/检测取消的请求?

javascript - Typescript/Vue - 当我为 Prop 声明默认对象时,如何访问 vuex 存储?

TypeScript 通用映射可变元组值到嵌套映射类型

angular - 对 decorators visual studio 2017 的实验性支持

javascript - 如何定义或让 Typescript 忽略相关环境模块?

angular - Typescript 装饰器如何让 Angular 2 发现类型元数据

sorting - typescript 中排序错误的类型

typescript - 未初始化的 TypeScript 类属性不会被迭代