TypeScript 2.0:如何引用同一命名空间中但子文件夹中的对象?
使用TypeScript 2名称空间,如何让代码识别添加到子文件夹中名称空间的类 (我正在使用AngularJS 1.5和Webpack,但这两个版本都不应该参与其中。) 在下面的示例中,指令D1位于指令下的文件夹中,_bootstrap_directives.ts无法解析它。它将获得以下错误: 错误TS2339:类型“typeof directive”上不存在属性“D1Directive”。 也许我只需要创建myLibrary.d.ts来明确定义契约 - - -TypeScript 2.0:如何引用同一命名空间中但子文件夹中的对象?,typescript,typescript2.0,Typescript,Typescript2.0,使用TypeScript 2名称空间,如何让代码识别添加到子文件夹中名称空间的类 (我正在使用AngularJS 1.5和Webpack,但这两个版本都不应该参与其中。) 在下面的示例中,指令D1位于指令下的文件夹中,_bootstrap_directives.ts无法解析它。它将获得以下错误: 错误TS2339:类型“typeof directive”上不存在属性“D1Directive”。 也许我只需要创建myLibrary.d.ts来明确定义契约 - - - 我使用的是Visual Stu
我使用的是Visual Studio 2015。结果发现网页是问题所在。把这个留在这里是为了帮助社区 将这一行从d1.directive.ts移到引导文件中可以消除该问题
import './d1.scss';
所以吸取的教训是——不要在命名空间之外的子文件夹中导入。我已经为这个问题争论了好几天,尽管我现在似乎已经掌握了它,但它仍然让我发疯 对于我的项目中的本地/内部开发,我停止使用模块(或名称空间),这应该使它始终在全局范围内运行(我想不是最大的,但它现在可以工作) 你的进口破坏了东西的原因是 在TypeScript中,就像在ECMAScript 2015中一样,任何包含 顶级导入或导出被视为一个模块 那么,为什么作为一个模块,你所有的参考资料都消失了呢 模块在其自身范围内执行,而不是在全局范围内执行; 这意味着变量、函数、类等在 模块在模块外部不可见,除非它们显式显示 使用其中一个导出表单导出。相反地,消费 从不同类型导出的变量、函数、类、接口等 模块,则必须使用其中一个导入窗体导入
.一般的教训是避免使用名称空间(内部模块)。名称空间是一个概念,它是在JavaScript使用ES6迁移到适当的模块系统之前引入的。现在,你应该(也就是TypeScript中的“外部模块”)我确实切换到使用模块而不是名称空间。不幸的是,同样的问题也发生了。module Library.Blah.Blah上面的import语句会导致TS编译器找不到导出的类。即使.ts文件在同一个文件夹中,我也不会说webpack是个问题。我想说,顶部的导入是问题所在(TypeScript)。我意识到这篇文章有点老了,但我已经为此奋斗了一周。更多信息请参见我的答案。@poke你为什么这么说?在您发送的链接上,它在哪里说不使用名称空间?这种联系似乎表明opposite@AdamPlocher文档中没有提到它,因为它仍然是一个受支持的东西(并且对于某些事情来说是做某事的唯一方法)。一般建议使用(外部)模块,因为它们遵循ES6标准。另见:和
> d1.directive.ts (d2.directive is the same with a different class name and no scss import)
import './d1.scss'; // for webpack
namespace MyLibrary.Directives {
export class D1Directive implements ng.IDirective {
restrict: string = 'A';
scope: boolean = false;
constructor() {
// noop
}
static factory(): ng.IDirectiveFactory {
const directive = () => {
return new D1Directive();
}
return directive;
}
}
}
> _bootstrap_directives.ts (
// Property 'D1Directive' does not exist on type 'typeof Directives'.
import './d1/d1.directive'; // for webpack
angular.module('myLibrary')
.directive('d1', MyLibrary.Directives.D1Directive.factory());
// This one works
import './d2.directive'; // for webpack
angular.module('myLibrary')
.directive('d2', MyLibrary.Directives.D2Directive.factory());
import './d1.scss';