2017-08-08 51 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