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,