带有2.0库的三斜杠Typescript引用

带有2.0库的三斜杠Typescript引用,typescript,typescript2.0,Typescript,Typescript2.0,我有一个最初基于Typescript 1.4构建的项目 它的主文件设置如下: /// <reference path="typedefinitions/jquery/jquery.d.ts" /> /// <reference path="typedefinitions/jqueryui/jqueryui.d.ts" /> /// <reference path="typedefinitions/moment/moment.d.ts" /> module my

我有一个最初基于Typescript 1.4构建的项目

它的主文件设置如下:

/// <reference path="typedefinitions/jquery/jquery.d.ts" />
/// <reference path="typedefinitions/jqueryui/jqueryui.d.ts" />
/// <reference path="typedefinitions/moment/moment.d.ts" />
module myApp {
   ...
}
引用的类型似乎没有出现在任何地方。如果我这样做:

import * as router from 'angular-ui-router';
然后所有其他文件都不能再引用“myApp”

在通过重构摆脱这种情况的同时,我仍然能够将所有TS文件编译成单个javascript文件,那么我的最佳选择是什么


是否有可以更改的tsconfig设置?还是我遗漏了什么?

这里有几个选项

建议的方法 如今,摩擦最小的选项是包括一个bundler来处理您的单个文件需求,并使用ES6风格的模块系统来建立依赖关系(以前称为外部模块)。据我所知,名称空间系统并没有被正式弃用,但在我看来,从社区的角度来看,名称空间系统基本上已经被放弃了。它与import语句和@types系统不兼容,您将看到的大多数示例和代码都将使用@types系统。使用此选项需要通过每个文件中的导入建立显式依赖关系,而不是利用C风格的名称空间

然后,您可以使用systemjs、uglify、browserify等工具遍历依赖关系树并创建javascript包。原则上,有些人更喜欢这样做,纯粹是为了将编译任务与缩小和捆绑分离开来。这还将解决使用纯名称空间时可能遇到的一些无序问题,因为每个文件(模块)都明确指定了其确切的依赖关系

其他选择 短期内,您可以通过从DefinitelyTyped repo手动下载.d.ts文件来处理名称空间(当然也可以使用打字,如果您遵循此方法,我建议您使用打字)。现在有几个npm包在其依赖项中列出了@types包,因此您可能需要设置
types:[]
config属性,以确保不使用@types中的任何内容,从而避免冲突


虽然这仍然是一个可行的选择,但我建议采用ES6模块。这不是由typescript决定的问题,JS社区显然正在朝着这个方向发展,作为JS的超集,主要的结构JS决策将逐渐进入TS,这将成为默认值。我觉得命名空间将很快成为遗留代码,有些已经考虑命名空间遗产。 这里有几个选项

建议的方法 如今,摩擦最小的选项是包括一个bundler来处理您的单个文件需求,并使用ES6风格的模块系统来建立依赖关系(以前称为外部模块)。据我所知,名称空间系统并没有被正式弃用,但在我看来,从社区的角度来看,名称空间系统基本上已经被放弃了。它与import语句和@types系统不兼容,您将看到的大多数示例和代码都将使用@types系统。使用此选项需要通过每个文件中的导入建立显式依赖关系,而不是利用C风格的名称空间

然后,您可以使用systemjs、uglify、browserify等工具遍历依赖关系树并创建javascript包。原则上,有些人更喜欢这样做,纯粹是为了将编译任务与缩小和捆绑分离开来。这还将解决使用纯名称空间时可能遇到的一些无序问题,因为每个文件(模块)都明确指定了其确切的依赖关系

其他选择 短期内,您可以通过从DefinitelyTyped repo手动下载.d.ts文件来处理名称空间(当然也可以使用打字,如果您遵循此方法,我建议您使用打字)。现在有几个npm包在其依赖项中列出了@types包,因此您可能需要设置
types:[]
config属性,以确保不使用@types中的任何内容,从而避免冲突


虽然这仍然是一个可行的选择,但我建议采用ES6模块。这不是由typescript决定的问题,JS社区显然正在朝着这个方向发展,作为JS的超集,主要的结构JS决策将逐渐进入TS,这将成为默认值。我觉得命名空间将很快成为遗留代码,有些已经考虑命名空间遗产。 Parth,我想我将以angular 2的类似方式来处理这个问题,我将在其父组件中注册子组件:

hello.component.ts:

import Component from './component.decorator';

@Component('hello', {
    controllerAs: 'vm',
    template: '<div>Hi</div>'
})
export default class HelloComponent { }
import Component from './component.decorator';
import HelloComponent from './hello.component';

@Component('app', {
    controllerAs: 'vm',
    directives: [HelloComponent],
    template: `<div>
                <div>{{vm.Message}}</div>
                <hello></hello>
               </div>`
})
export class AppComponent {
    Message: string;

    $onInit() {
        this.Message = 'Hi!!!';
    }
}

Paarth,我想我将以angular 2的类似方式来处理这个问题,我将在其父组件中注册子组件:

hello.component.ts:

import Component from './component.decorator';

@Component('hello', {
    controllerAs: 'vm',
    template: '<div>Hi</div>'
})
export default class HelloComponent { }
import Component from './component.decorator';
import HelloComponent from './hello.component';

@Component('app', {
    controllerAs: 'vm',
    directives: [HelloComponent],
    template: `<div>
                <div>{{vm.Message}}</div>
                <hello></hello>
               </div>`
})
export class AppComponent {
    Message: string;

    $onInit() {
        this.Message = 'Hi!!!';
    }
}

不幸的是,如果可能的话,我会切换到为您打包文件的模块加载器。不值得与JavaScript的发展作斗争。请记住,一旦http2被广泛使用,单文件捆绑将不是一件好事。幸运的是,如果可能的话,我将切换到为您捆绑文件的模块加载器。不值得与JavaScript的发展作斗争。记住,一旦http2被广泛使用,单文件包就不是一件好事。我的问题是,没有任何东西真正引用我的组件(它们都引用主应用程序将自己注册为组件,但仅此而已,没有任何东西引用它们),它们永远不会被SystemJs加载。我该如何解决这个问题?我是否需要在某个地方手动引用文件中的每个组件,以便将它们注册到angular?@John TBH我的公司就是这样做的,但我并不热衷于此,因为您必须在两个地方维护更改。就个人而言,我更喜欢将其反转,以便在真空中定义组件,并在模块定义中导入和注册。这两个选项都不是很好,后者是clo
import * as angular from 'angular';
import app from './main';

export interface ComponentBridgeOptions extends ng.IComponentOptions {
    directives?: any[];
}

export default function Component(selector: string, options: ComponentBridgeOptions) {
    return (controller: Function) => {
        app.component(selector, angular.extend(options, { controller: controller }));
    }
}