microsoft / microsoft/TypeScript
ThisType for Ember.computed and Ember.observer
まだ誰も着手していません。
- 主要言語
- Go
- スター
- 111k
- フォーク
- 14.3k
- 平均マージ
- 2日 4時間
- マージ済み PR(30日)
- 132
説明
TypeScript Version: 2.3.4
Thanks for your work on this great project :)
Context
We are experimenting with TypeScript 2.x in Ember, and the new TypeScript 2.x features really enable us to type most of our Ember code. There is however one thing we came across that doesn't seem like something we can solve in our interfaces/declarations:
It seems that there currently is no way to get the this context inside the Ember.computed and Ember.observer pattern.
ThisType not compatible with Ember.computed and Ember.observer?
We have set up some experimental interfaces for Ember.Object.extend() (inspired by Vue.js' type declarations, @ember/types and various other sources)
https://github.com/draios/ember-typescript2/blob/master/app/types/ember/ember-types.d.ts#L78-L83
These types/interfaces are working so far; all methods and hooks have the proper this type, and class properties are accessible through getters and setters.
However when it comes to computed properties, there seems to be no way to get the proper this context inside the function passed to Ember.computed() (see example below).
Code
export default Ember.Object.extend({
myProp: true,
myMethod: function() {
// myProp is accessible because of ThisType
this.get('someProperty');
}
computedProperty: Ember.computed('someProperty', function() {
// myProp is not accessible, because `this` is set to type <any>
let myVal = this.get('someProperty');
// ... both `this` and `myVal` are of type <any>
// and no way to fix this from an external interface?
});
});
Is this Ember pattern supported somehow in TypeScript?
Thanks!
N.B. I tried something like the following, but it doesn't work (X becomes of type {}).
// the function passed to Ember.computed
type ComputedPropertyFunc<T, X> = (this: X) => T
// Ember.computed with one observed property and a function
function computed<T, X>(observedProperty1: string, fn: ComputedPropertyFunc<T, X>): T & ThisType<X>
コントリビューションガイド
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
調査の方向性
まず、issue にリンクされている実験的な ember-types.d.ts 宣言と、例で説明されている TypeScript 2.x の ThisType の動作を読みます。Ember.computed と Ember.observer が意図されたコンテキスト this 型を受け取れるかどうかを判断します。対応している使用方法を文書化するか、必要なコンパイラーまたは宣言の変更を特定できれば完了です。
索引モデルが issue の本文から書いたものです。
評価
- 技術スタック
- typescript
- 領域
- compilers
- issue の種類
- 機能追加
- 難易度
- 5/5
- 見積もり時間
- 1週間以上
- 活発さ
- 停滞
- 明瞭さ
- 説明が足りない
- 初心者へのやさしさ
- 25/100