2017-08-08 32 views
3

現在、Vue.jsアプリケーションで、TypeScriptに移植しようとしているオブジェクトが次のようなものがあります。なお、このオブジェクトの構造はVuex libraryによって決定されます。TypeScriptの自己参照型

const getters = { 
    allUsers(state) { 
    return state.users; 
    }, 
    firstUser(_state, getters) { 
    return getters.allUsers()[0] 
    } 
} 

私はここにfirstUserでゲッターのための適切なタイプを提供することができますどのように?

const getters = { 
    allUsers(state: State) { 
    return state.users; 
    }, 
    firstUser(_state: State, getters: typeof getters) { 
    return getters.allUsers()[0] 
    } 
} 

現在、私は次のエラーを取得する:

[ts] 'getters' is referenced directly or indirectly in its own type annotation. 

更新:あなたはそのエラーが引数の名前を変更することにより、離れて行くことができます決定@basarat。

const getters = { 
    allUsers(state: State) { 
    return state.users; 
    }, 
    firstUser(_state: State, theGetters: typeof getters) { 
    return theGetters.allUsers()[0] 
    } 
} 

しかし、typeof gettersむしろgettersオブジェクトの型よりanyなってしまいます。

答えて

2

私は本当に理解できませんなぜあなたはこのように行動するgettersが必要ですが、私はあなたが何をしているのかを推測します。

これはTypeScriptコンパイラの制限です。gettersの型は再帰的であり、any型になります。この場合の唯一の方法は、タイプ名をgettersにして使用することです。クラスについてはどうですか?

class Getters { 
    allUsers(state: State) { 
    return state.users; 
    } 
    firstUser(_state: State, theGetters: Getters) { 
    return theGetters.allUsers()[0]; // hey, a bug! 
    } 
} 
const getters = new Getters(); 

これが正しく入力され、さらにはあなたに(あなたがallUsers()_stateを渡し、私は推測による修正)firstUserの実装のバグを示しています。

希望に役立ちます。がんばろう。

+0

これは、私が使用しているライブラリがゲッターを定義する方法を示しています。 – fny

2

[ts] 'getters' is referenced directly or indirectly in its own type annotation.

範囲内に2つのゲッターがあります。パラメータと変数。 1つを変更してください。

固定

const getters = { 
    allUsers(state: State) { 
    return state.users; 
    }, 
    firstUser(_state: State, _getters: typeof getters) { // Rename 
    return _getters.allUsers()[0] 
    } 
} 

もっと

あり、他のエラーがありますが、これはあなたが助けを求めているものです。

+0

ここで唯一の問題は 'typeof getters'は' any'ですが、最終的なgettersオブジェクトの型を返すことを期待しています。 – fny