Module Typescript、Requirejs、导入语句和别名

Module Typescript、Requirejs、导入语句和别名,module,typescript,requirejs,Module,Typescript,Requirejs,使用Java,导入非常简单和清晰 您可以使用以下语句进行导入: import fr.domain.MyUtils; 然后你可以这样使用它: MyUtils.myStaticMethod(); 仅当同一文件中有两个MyUtils时,才需要为其命名名称空间 对于Typescript AMD和requirejs,它似乎更加复杂 以下是进口声明: import u = require('fr/domain/MyUtils'); import u = require('fr/domain/MyUti

使用Java,导入非常简单和清晰

您可以使用以下语句进行导入:

import fr.domain.MyUtils;
然后你可以这样使用它:

MyUtils.myStaticMethod();
仅当同一文件中有两个MyUtils时,才需要为其命名名称空间

对于Typescript AMD和requirejs,它似乎更加复杂

以下是进口声明:

import u = require('fr/domain/MyUtils');
import u = require('fr/domain/MyUtils');
import MyUtils = u.fr.domain.MyUtils;
以及使用方法:

u.fr.domain.MyUtils.myStaticMethod();
相当冗长

我发现使用别名的唯一方法是将import语句加倍:

import u = require('fr/domain/MyUtils');
import u = require('fr/domain/MyUtils');
import MyUtils = u.fr.domain.MyUtils;
完成此操作后,您可以将其写入模块:

MyUtils.myStaticMethod();
它更干净,但是EclipseTS插件完全丢失了,自动完成变得不稳定。在VisualStudio中,自动完成是可以的,但“F12转到定义”必须执行两次,这很烦人


有更好的方法吗?还是我们应该尽可能地缩短名称空间?

你做错了

您的'fr/domain/MyUtils'模块应该只导出应该是MyUtils的内容。i、 e.它应该是这样的:

export function myStaticMethod() { /* ...code... */ }
import MyUtils = require('fr/domain/MyUtils');
MyUtils.myStaticMethod();
它不应该导出某个全局名称空间对象,也不应该向从其他地方获得的某个全局名称空间对象添加任何内容。模块文件在目录中的自然放置方式是在使用外部模块时创建“名称空间”的方式

如果操作正确,则您的消费者如下所示:

export function myStaticMethod() { /* ...code... */ }
import MyUtils = require('fr/domain/MyUtils');
MyUtils.myStaticMethod();
或者,更恰当地使用ES模块语法:

import { myStaticMethod } from 'fr/domain/MyUtils';
myStaticMethod();

请出示您的
fr/domain/MyUtils
文件您是对的,我现在明白了。这里有很好的解释:当他们将我所做的描述为“不必要的名称空间”时:“因为外部模块文件本身已经是一个逻辑分组,其顶级名称由导入它的代码定义,所以没有必要为导出的对象使用额外的模块层。”,导入(外部)模块的首选方式是ES6模块语法。我认为你答案中的这一部分需要更加强调——目前,它只不过是一个脚注。