我最难让 typescript 和 Ember 一起工作。我将所有定义文件都保存在definitely typed中,并在该站点的Ember指南上浏览了ToDo演练。我正在尝试将js转换为 typescript ,并查看设置项目的最佳方法是什么,但是我想我不太了解 typescript 定义。

如果我做:

/// <reference path="typings/ember.d.ts" />

var App = Ember.Application.create();

应用是“{}”类型,我无法访问“路由器”来完成指南的下一行
App.Router.map( ... )

我在网上发现的最好的东西是this,它不适用于当前的输入。

我已经看过 typescript ember-app-kit,但是它几乎没有帮助,因为它几乎不包含任何 typescript ,而且它们的设置几乎不像ember指南那样。我只需要指出正确的方向。谢谢你们。

最佳答案

我不熟悉Ember,但是通过检查ember.d.ts,我可以看到create()被定义为对象上的静态泛型函数:

static create<T extends {}>(arguments?: {}): T;

因此,您应该可以通过传递实际类型来获得更好的类型信息:
var App = Ember.Application.create<Ember.Application>();

但是,我也看到ember typedef在应用程序类中不包括“Router”成员,即使这样做,Router类也没有定义map()。我可以通过创建扩展的类型定义来使其工作:
// ./EmberExt.d.ts
/// <reference path="typedef/ember/ember.d.ts" />

declare class RouterExt extends Ember.Router {
    map: ItemIndexEnumerableCallbackTarget;
}

declare class ApplicationExt extends Ember.Application {
    Router: RouterExt;
}

然后从我的组合路由器/应用程序文件中引用它:
/// <reference path="typedef/ember/ember.d.ts" />
/// <reference path="./EmberExt.d.ts" />

var App = Ember.Application.create<ApplicationExt>();
App.Router.map(function () {
    this.resource('todos', { path: '/' });
});

完成此操作后,尽管实际上并没有执行任何操作(但我认为在本演练的这一阶段还可以),但它可以毫无错误地进行编译和加载。

关于ember.js - Emberjs和Typescript设置,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21127413/

10-12 00:22
查看更多