Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
TypeScript 2.0:如何引用同一命名空间中但子文件夹中的对象?_Typescript_Typescript2.0 - Fatal编程技术网

TypeScript 2.0:如何引用同一命名空间中但子文件夹中的对象?

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

使用TypeScript 2名称空间,如何让代码识别添加到子文件夹中名称空间的类

(我正在使用AngularJS 1.5和Webpack,但这两个版本都不应该参与其中。)

在下面的示例中,指令D1位于指令下的文件夹中,_bootstrap_directives.ts无法解析它。它将获得以下错误:

错误TS2339:类型“typeof directive”上不存在属性“D1Directive”。

也许我只需要创建myLibrary.d.ts来明确定义契约

-

-

-


我使用的是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';