使用 Ember CLI Typescript 处理混合

Handling Mixins with Ember CLI Typescript

只是想知道如何/什么是正确处理类型化 ember 应用程序的混入的最佳方法。显然从应用程序中消除混入是最好的;但是,大多数插件尚不支持打字稿。话虽如此,什么是利用 ember-simple-auth 应用程序路由混合(或与此相关的任何混合)的最佳方式。我没有测试下面的代码,但我的猜测是 should 可以工作;但是,感觉有点奇怪:

import Route from '@ember/routing/route';
import ApplicationRouteMixin from 'ember-simple-auth/mixins/application-route-mixin';

export default class ApplicationRoute extends Route.extend(ApplicationRouteMixin, {
  // Prototype Code Here?
}) {
  // Class TS Code Here?
}

再说一次,我还没有测试过这个,我才刚刚开始踏上 TS 之旅,所以请多多包涵。任何帮助和澄清将不胜感激。

你的基本策略是正确的。 Classic Ember Mixin 实例必须绑定到原型。请注意,以下所有内容同样适用于 ES6 classes; TypeScript classes 受到影响仅仅是因为它们大多只是 ES6 classes 上的类型。

import Route from '@ember/routing/route';
import ApplicationRouteMixin from 'ember-simple-auth/mixins/application-route-mixin';

export default class ApplicationRoute extends Route.extend(ApplicationRouteMixin, {
  // anything required by the mixin has to go here
}) {
  // normal class code, which can *depend* on the mixin but is effectively
  // invisible to the mixin
}

考虑这一点的一个有用方法是,您传递给 class .extend() 的对象文字本身只是一个混合。

此模式最适用于 backwards-compatible 解决方案或插件需要它的地方。 Mixins 很难(充其量)与 TypeScript 正确地 type-check ,并且它们与 classes 有令人惊讶和奇怪的交互,如这个例子所示。 (这里的奇怪之处同样适用于使用 ES6 classes 的纯 JavaScript 代码。)

每当您编写新代码时,通常最好提取功能来执行以下几个选项之一:

  • 使用普通继承,单基class。在任何只有一个 mixin 的地方,这通常是最直接的解决方案。

  • 切换到只定义纯函数,例如在 app/lib/validation 中,并使用 class 实例中的适当参数调用它们。