typescript - TypeScript 中的自引用类型

标签 typescript vue.js vuex

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

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

如何在 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]
  }
}

但是,typeof getters 最终是 any 而不是 getters 对象的类型。

最佳答案

我真的无法理解为什么您需要getter 来执行此操作,但我假设您知道自己在做什么。

这是 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 来解决这个错误()).

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

关于typescript - TypeScript 中的自引用类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45579584/

相关文章:

javascript - 在挂载的生命周期中保存 Vuex 状态

typescript - 如何从 typescript 中的类中提取类型?

typescript - 如何从名称或 cidr 获取子网 ID

vue.js - Vuetify Combobox 多选对象

django - 如何在 vuejs 发布期间设置 cookie

javascript - 将 vuex 状态的值指定为另一个参数的初始值

javascript - 如何重构重复的条件 Vue.js 代码?

vue.js - 将route.params.id传递给vuex操作

node.js - 声明合并和别名不能一起工作

typescript - 有没有办法在 typescript 中自动生成 Azure Functions 的 swagger 文档?