【问题标题】:Correctly typing a vuex getter's getters parameter正确输入 vuex getter 的 getters 参数
【发布时间】:2021-10-29 21:20:27
【问题描述】:

如何正确键入引用其他 getter 的 vuex getter?例如:

import { GetterTree } from 'vuex';

class State {
    foo: string[] = [];
}

const getters = <GetterTree<State, any>>{
    bar: state => state.foo.filter(...something...),
    baz: (state, getters) => getters.bar.filter(...something else...)
}

这里getters.bazgetters 参数由vuex 定义键入为any。如果它可以基于const getters 声明隐式键入为{ bar: string[] },而不必将其声明为接口等两次,那就太好了。有没有办法做到这一点?

【问题讨论】:

  • 请提供语法有效的代码示例
  • 您的意思是...something... 占位符...?
  • 我的意思是&lt;GetterTree&lt;State, any&gt;&gt;{
  • 那……是……有效……?
  • 好的,我明白了。这是断言。

标签: typescript vuex


【解决方案1】:

我们来看看GetterTree接口:

export interface GetterTree<S, R> {
  [key: string]: Getter<S, R>;
}

因此,state =&gt; state.foo.filter(...something...) 对应于 Getter&lt;S, R&gt;

不幸的是,第二个参数getters 不是通用的,默认输入为any

export type Getter<S, R> = (state: S, getters: any, rootState: R, rootGetters: any) => any;

来自GetterTree 的通用参数R 对应于rootState,这对我们来说并不有趣。

我看到了两个选项。

首先 - 最简单。

只需将显式类型添加到第二个参数:

const getters: GetterTree<State, any> = {
  bar: state => state.foo.filter(e => e.length > 1),
  baz: (state, getters: { bar: string[] }) => getters.bar
}

第二个,是覆盖GetterTree内置的实用程序类型。

import { GetterTree, Getter } from 'vuex';

class State {
  foo: string[] = [];
}

type CustomGetter<T extends Getter<any, any>, Getters> =
  T extends (state: infer State, getters: infer _, rootState: infer RootState, rootGetters: infer RootGetters) => any
  ? (state: State, getters: Getters, rootState: RootState, rootGetters: RootGetters) => any
  : never

type CustomGetterTree<T extends GetterTree<any, any>, Getters> = T extends GetterTree<infer S, infer R> ? {
  [key: string]: CustomGetter<Getter<S, R>, Getters>;

} : never

const getters: CustomGetterTree<GetterTree<State, any>, { bar: string[] }> = {
  bar: state => state.foo.filter(e => e.length > 1),
  baz: (state, getters /** {  bar: string[];} */) => getters.bar
}

Playground

【讨论】:

  • 确实需要在CustomGetterTree&lt;...&gt; 中重复声明{ bar: string[] },对吗?对于大量吸气剂来说,这将变得相当笨拙。我很害怕,我也没有看到更好的选择……谢谢。
  • 不幸的是我也没有看到。他们没有为getters 提供额外的通用参数。也许值得创建公关?
猜你喜欢
  • 2018-05-07
  • 1970-01-01
  • 2021-01-06
  • 2021-11-05
  • 2019-06-11
  • 2018-04-09
  • 2017-11-18
  • 2018-04-20
  • 1970-01-01
相关资源
最近更新 更多