首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >正确键入vuex getter的getter参数

正确键入vuex getter的getter参数
EN

Stack Overflow用户
提问于 2021-08-31 08:53:31
回答 2查看 609关注 0票数 2

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

代码语言:javascript
代码运行次数:0
运行
复制
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定义将getters.bazany参数键入为any。如果可以根据{ bar: string[] }声明隐式地将其键入为const getters,而不必将其声明两次为接口之类的,那就太好了。有办法吗?

EN

回答 2

Stack Overflow用户

发布于 2021-08-31 09:30:10

让我们来看看GetterTree接口:

代码语言:javascript
代码运行次数:0
运行
复制
export interface GetterTree<S, R> {
  [key: string]: Getter<S, R>;
}

因此,state => state.foo.filter(...something...)对应于Getter<S, R>

不幸的是,第二个参数getters不是泛型的,默认情况下输入为any

代码语言:javascript
代码运行次数:0
运行
复制
export type Getter<S, R> = (state: S, getters: any, rootState: R, rootGetters: any) => any;

来自R的泛型参数GetterTree对应于rootState,我们对此并不感兴趣。

我有两种选择。

优先--最简单的.

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

代码语言:javascript
代码运行次数:0
运行
复制
const getters: GetterTree<State, any> = {
  bar: state => state.foo.filter(e => e.length > 1),
  baz: (state, getters: { bar: string[] }) => getters.bar
}

第二种方法是覆盖构建在实用程序类型中的GetterTree

代码语言:javascript
代码运行次数:0
运行
复制
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
}

游乐场

票数 0
EN

Stack Overflow用户

发布于 2022-06-18 17:24:01

编辑:,如果在Vuex中使用Vue3和TypeScript,我会切换到皮皮亚,它似乎具有良好的类型安全性。至少为我工作过。

不知道是否值得考虑另一种方法。我喜欢尝试使用帮助函数推断getter的返回类型。我发现它节省了复杂类型的定义,尽管它会在引用getter的键上引起一些重复。

代码语言:javascript
代码运行次数:0
运行
复制
const getters = {
    gridHeight(): number {
        return 32;
    },
    message(): string {
        return 'hello ';
    },
};
const store = createStore<State>({ getters });

type ReturnOfGetter<T> = T extends (state: infer _, getters: infer _, rootState: infer _, rootGetters: infer _) => infer Return
    ? Return                                                                                                                          
    : never;

export function useGetter<K extends keyof typeof getters>(key: K): ReturnOfGetter<typeof getters[K]> {
    return store.getters[key];                                                                                           
};                                                                                                                       

这允许这样的访问:

代码语言:javascript
代码运行次数:0
运行
复制
const gridHeight = useGetter<'gridHeight'>('gridHeight');
const message = useGetter<'message'>('message');
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68995690

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档