2017-08-08 105 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最終被any而非getters對象的類型。

回答

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(); 

現在這類型正確,甚至會顯示一個錯誤在你執行firstUser(你確定由我猜,路過_stateallUsers())。

希望有所幫助。祝你好運。

+0

這就是我正在使用的庫如何定義獲取者。 – fny

2

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

在範圍內有兩個getter。參數和變量。改一個。

固定

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