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



没有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 中使用应用程序/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();
}

Problem是默认属性。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编译器说:属性"generate"在类型上不存在

问题

我的Router.d.ts和import语句必须是什么样子,才能有正确的输出和TypeScript知道正确的类型?

当您使用exportdefaultstuff时,您告诉编译器导出的对象有一个名为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系统没有任何先验知识,所以我无法判断在函数体内扩展或设置导出对象会产生什么后果。我认为所做的改变并不重要,但无论如何,最好还是自己检查一下。

最新更新