TypeScript

时间:2017-08-08 23:46:08

标签: typescript vue.js vuex

我目前在Vue.js应用程序中有一个类似于以下内容的对象,我试图移植到TypeScript。请注意,此对象的结构由Vuex library

决定
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 个答案:

答案 0 :(得分:2)

  

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

范围内有两个吸气剂。参数和变量。换一个。

固定

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

更多

还有其他错误,但这是您被要求帮助的错误。

答案 1 :(得分: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实施中的错误(我猜测,将_state传递给allUsers())。

希望有所帮助。祝你好运。