我很尴尬地问这个问题,因为我花了数小时来寻找其他问题,而且我知道这个问题已经被问过十遍了,但我仍然很困惑。
我正在使用打字稿和Vuex,并试图对Getters对象进行包装,以检查该模块是否已首先初始化。
用法看起来像
//index.ts
import { Module } from 'vuex';
import { makeSafeGetters } from './safeGetters'
export const testModule: Module<testState, RootState> = {
getters: makeSafeGetters(getters),
//safeGetters.ts
/**
* This takes the getters from a module and wraps in a safety call that ensures
* you are not accessing uninitialized stores
*
* @param getterList - the getter tree exported from the `<module>.getters.ts`
*/
export function makeSafeGetters<U extends BaseState<any>>
(getterList: GetterTree<U, RootState>) {
const getters: GetterTree<U, RootState> = {};
for (const key in getterList) {
if (Object.prototype.hasOwnProperty.call(getterList, key)) {
const getter = getterList[key];
getters[key] = safeGetter(getter);
}
}
return getters;
}
/**
* Wraps a getter with a call to make sure the store has been initialized
*
* @param getter - the getter to be wrapped
*/
function safeGetter<V, T extends Getter<V extends BaseState<any> ? V : never, RootState>>
(getter: T): T {
return (state, ...args): ReturnType<T> => {
if (!state.initialized && !state.loading) {
console.error(`${getter.name}: <ModuleNameHere> not initialized, make sure store has been fetched.\
Check stack for module name`,
{ state });
}
return getter(state, ...args);
};
}
//type.ts
export interface BaseState<T> {
initialized: boolean;
loading: Promise<any> | null | boolean;
values: T;
}
我的问题出在safeGetter
函数中。在行return (state, ...args)
上
我收到以下错误
Type '(state: V extends BaseState<any> ? V : never, getters: any, rootState: RootState, rootGetters: any) => ReturnType<T>' is not assignable to type 'T'.
'(state: V extends BaseState<any> ? V : never, getters: any, rootState: RootState, rootGetters: any) => ReturnType<T>' is assignable to the constraint of type 'T', but 'T' could be instantiated with a different subtype of constraint 'Getter<V extends BaseState<any> ? V : never, RootState>'.ts(2322)
对我来说重要的是,吸气剂的类型通过makeSafeGetters
是透明的,因此,如果将鼠标悬停在makeSafeGetters
中的index.ts
上,我会得到
(alias) makeSafeGetters<TestState>(getterList: GetterTree<TestState, RootState>): GetterTree<TestState, RootState>
这里https://stackoverflow.com/a/59148659/6100005提出了类似的问题,但是我不知道如何在不破坏类型的情况下将其应用于我的情况