Typescript 具有不同泛型值的JSON对象

Typescript 具有不同泛型值的JSON对象,typescript,generics,Typescript,Generics,我有以下通用类: type SyncReducerAction<TState> = (state: TState, ...args: any[]) => TState; type AsyncReducerAction<TState, TResult, TRest extends any[]> = { promise: (...args: TRest) => Promise<TResult>; pending?: (state: TStat

我有以下通用类:

type SyncReducerAction<TState> = (state: TState, ...args: any[]) => TState;

type AsyncReducerAction<TState, TResult, TRest extends any[]> = {
  promise: (...args: TRest) => Promise<TResult>;
  pending?: (state: TState, ...args: TRest) => TState;
  fullfilled: (state: TState, result: TResult, ...args: TRest) => TState;
  rejected: (state: TState, error: Error, ...args: TRest) => TState;
};
typesyncreduceraction=(状态:TState,…args:any[])=>TState;
类型AsyncReducerAction={
承诺:(…args:TRest)=>承诺;
挂起?:(状态:TState,…args:TRest)=>TState;
fullfilled:(状态:TState,结果:TResult,…args:TRest)=>TState;
拒绝:(state:TState,error:error,…args:TRest)=>TState;
};
我想定义一个json对象,其中值可以是这两个对象之一。下面是一个假定必须接受该对象的函数:

function get<
  T extends {
    [K in keyof T]: T[keyof T] extends SyncReducerAction<any>
      ? SyncReducerAction<Parameters<T[keyof T]>[0]>
      : T[keyof T] extends AsyncReducerAction<
          infer TState,
          infer TResult,
          infer TRest
        >
      ? AsyncReducerAction<TState, TResult, TRest>
      : never;
  }
>(input: T): ReducersToActions<T> {
  throw new Error("Not implemented");
}
函数get<
T延伸{
[K in keyof T]:T[keyof T]扩展同步还原作用

编辑:


另一个版本,它几乎可以工作,但仍然得到错误的类型:。如果我从
AsyncReducerAction
中删除
TResult
,并将其设置为
any
,它就可以工作。

好消息是,这比你做的要简单。所有这些
推断
扩展
中的
东西都可以esn实际上什么都不做。
TRest
等对于每个属性都是不同的,除了这里之外,您无法访问该
TRest
变量

您所需要的只是说您的通用
T
是一个映射对象,其中每个值都是一个同步或异步减缩器

function get<
  T extends {
    [K in keyof T]: SyncReducerAction<any> | AsyncReducerAction<any, any, any>
  }
>(input: T): ReducersToActions<T> {
  throw new Error("Not implemented");
}
需要

fullfilled: (state: CounterType) => state,
换掉它,你就可以走了

我正在对所有动作创建者进行适当的推断,因此您的
reducertoactions
看起来不错


最终解决方案:

我试过了,但当时键入不正常。例如:
ts addAsync:{promise:(count:string)=>promise.resolve(count),pending:(state:Date,count:number)=>state,fullfilled:(state:CounterType,result:number,count:number)=>state,rejected:(state:CounterType,error:error,count:number)=>state,}
是错误的,因为
pending
中的状态与其他状态不同,我还将其中一个count变量声明为
string
而不是number。我在问题中添加了另一个几乎可以正常工作的游乐场链接。
fullfilled: (state: CounterType) => state,