RequireJS Module的TypeScript定义返回而不导出

时间:2017-11-16 00:11:09

标签: typescript typescript2.0

不使用TypeScript的用法

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

RequireJS模块:

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

该模块没有任何导出,但使用return语句可以在其他需要模块中使用它,如:

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

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

变体1: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上调用generate。因为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编译器说:Property' generate'类型

上不存在

问题

我的Router.d.ts和import语句必须如何才能获得正确的输出并且TypeScript知道正确的类型?

1 个答案:

答案 0 :(得分:1)

当您使用导出 默认 东西时,您告诉编译器导出的对象有一个名为 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系统没有先验知识,所以我无法分析在函数体内扩展或设置exports对象的后果。我不认为所做的改变很重要,但无论如何都要更好地检查自己。