打字稿在内部模块中导入外部模块

时间:2014-10-16 17:58:30

标签: knockout.js module typescript amd

我需要一些与Typescript相关的帮助以及如何在内部模块中使用外部模块。

我想将所有ViewModel代码逻辑存储在ViewModels内部模块中。

** HomePageViewModel.ts **

module ViewModels {
export class HomePageViewModel {
    constructor() {
        console.log('Creating HomePageViewModel');
    }

    public SayHello(): void {
        console.log('Hello from HomePageViewModel');
    }
}
}

** ViewModelFactories **

public static CreateHomePageViewModel(): ViewModels.HomePageViewModel {
    return new ViewModels.HomePageViewModel();
} 

这是正常工作,我可以编译,一切都在执行时工作正常。

现在,如果我在HomePageViewModel中添加导入(例如,淘汰赛)

import ko = require('knockout');

Typescript不再编译。 ViewModelFactories代码在Views下面显示下划线,并告诉我它无法找到符号视图'。

如何从ViewModel模块中访问挖空模块?

3 个答案:

答案 0 :(得分:2)

基本上,您无法混合两种模块类型。

只要您需要其他外部模块,您的内部模块就会变为外部模块。 你必须在&#34;内部&#34;中访问淘汰赛。方式:将其作为<script>导入到您的起始HTML文件中(因为您可能已经在为其他文件执行此操作),然后使用全局ko变量。

另一种解决方案是将模块设置为外部。

答案 1 :(得分:1)

你需要得到&#34; knockout.d.ts&#34;文件(或类似)与&#34; ko.xxxxxx&#34;定义。您可以从nugetgithub获取。 之后你就能写下来了。

var observable = ko.observable<number>(100);
在TypeScript代码中

。当然你还需要包含&#34; knockout.x.x.x.js&#34;文件在你的页面上。

可能应该使用namspase,如TypeScript Documentation所述:

不必要的命名空间

如果您要将程序从内部模块转换为外部模块,可以很容易地得到如下所示的文件: shapes.ts

export module Shapes {
    export class Triangle { /* ... */ }
    export class Square { /* ... */ }
}

此处的顶级模块Shapes无缘无故地包装了Triangle和Square。这对您的模块的消费者来说是令人困惑和恼人的: shapeConsumer.ts

import shapes = require('./shapes');
var t = new shapes.Shapes.Triangle(); // shapes.Shapes?

答案 2 :(得分:0)

您的HomePageViewModel是在ViewModels模块中定义的,而不是Views模块。

public static CreateHomePageViewModel(): ViewModels.HomePageViewModel {
    return new ViewModels.HomePageViewModel();
} 
相关问题