TypeScript中的自引用类型

TypeScript中的自引用类型,typescript,vue.js,vuex,Typescript,Vue.js,Vuex,我目前在Vue.js应用程序中有一个类似于以下内容的对象,我正试图将其移植到TypeScript。注意:此对象的结构由以下命令决定: 如何在firstUser中为getter提供合适的类型 const getters = { allUsers(state: State) { return state.users; }, firstUser(_state: State, getters: typeof getters) { return getters.allUsers

我目前在Vue.js应用程序中有一个类似于以下内容的对象,我正试图将其移植到TypeScript。注意:此对象的结构由以下命令决定:

如何在
firstUser
中为getter提供合适的类型

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]
  }
}
但是,
typeofgetters
最终是
any
,而不是
getters
对象的类型

[ts]“getters”在其自己的类型注释中直接或间接引用

范围中有两个getter。参数和变量。换一个

固定的 更多 还有其他错误,但这是向您寻求帮助的错误。

我真的不明白为什么您需要
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
实现中的一个bug(我想您可以通过将
\u state
传递到
allUsers()
来修复它)


希望有帮助。祝你好运。

这里唯一的问题是
typeof getters
any
,而我希望它返回最终getters对象的类型。这正是我使用的库希望定义getters的方式。
const getters = {
  allUsers(state: State) {
    return state.users;
  },
  firstUser(_state: State, _getters: typeof getters) { // Rename
    return _getters.allUsers()[0]
  }
}
class Getters {
  allUsers(state: State) {
    return state.users;
  }
  firstUser(_state: State, theGetters: Getters) {
    return theGetters.allUsers()[0]; // hey, a bug!
  }
}
const getters = new Getters();