TS2322:“ T”可以用不同的约束子类型实例化

时间:2020-09-08 22:07:42

标签: typescript vuex typescript-typings typescript-generics

我很尴尬地问这个问题,因为我花了数小时来寻找其他问题,而且我知道这个问题已经被问过十遍了,但我仍然很困惑。

我正在使用打字稿和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提出了类似的问题,但是我不知道如何在不破坏类型的情况下将其应用于我的情况

0 个答案:

没有答案