【问题标题】:Self-referential Type in TypeScriptTypeScript 中的自引用类型
【发布时间】:2018-01-16 16:31:26
【问题描述】:

我目前在尝试移植到 TypeScript 的 Vue.js 应用程序中有一个类似于以下内容的对象。注意这个对象的结构是由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 对象的类型。

【问题讨论】:

    标签: typescript vue.js vuex


    【解决方案1】:

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

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

    已修复

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

    更多

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

    【讨论】:

    • 这里唯一的问题是 typeof gettersany,而我希望它返回最终 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 实现中的一个错误(我猜您通过将 _state 传递给 allUsers() 来修复它)。

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

    【讨论】:

    • 这就是我正在使用的库期望定义 getter 的方式。
    猜你喜欢
    • 1970-01-01
    • 2021-12-30
    • 1970-01-01
    • 2014-08-18
    • 1970-01-01
    • 1970-01-01
    • 2017-07-09
    • 2020-10-02
    • 1970-01-01
    相关资源
    最近更新 更多