@@ -44,24 +44,26 @@ type SerializableValue = Serializable | Array<Serializable> | { [key: string]: S
4444
4545type FilteredKeys < T , U > = { [ P in keyof T ] : T [ P ] extends U ? P : never } [ keyof T ] ;
4646
47- type ExcludeNever < T extends StateNode > = { [ P in keyof T ] : T [ P ] extends never ? never : P } [ keyof T ]
47+ type ExcludeNever < T extends { } > = { [ P in keyof T ] : T [ P ] extends never ? never : P } [ keyof T ]
4848
49- type StateNode = { [ key : string ] : any }
50-
51- type NeverStateNode = { [ key : string ] : never }
52-
53- export type Classes <
54- T extends StateNode ,
49+ type ExtracType <
50+ T extends { } ,
51+ K
5552> = {
56- [ P in FilteredKeys < T , SerializableValue | StateNode > ] :
53+ [ P in FilteredKeys < T , K | { } > ] :
5754 T [ P ] extends SerializableValue ? ( data : any ) => Serializable :
58- T [ P ] extends StateNode ? Classes < T [ P ] > extends NeverStateNode ? never : Classes < T [ P ] > : never
55+ T [ P ] extends { } ? ExtracType < T [ P ] , K > extends { [ key : string ] : never } ? never : ExtractDeepType < T [ P ] , K > : never
56+ }
57+
58+ type ExtractDeepType < T extends { } , K , U = ExtracType < T , K > > = {
59+ [ P in ExcludeNever < U > ] : U [ P ]
5960}
6061
62+ type StateNode = {
63+ [ key : string ] : any
64+ }
6165
62- export const rehydrate = < T extends StateNode , U = Classes < T > > ( state : T , source : IMutation [ ] | StateNode , classes : {
63- [ P in ExcludeNever < U > ] : U [ P ]
64- } = { } as any ) => {
66+ export const rehydrate = < T extends StateNode > ( state : T , source : IMutation [ ] | StateNode , classes : ExtractDeepType < T , SerializableValue > = { } as any ) => {
6567 if ( Array . isArray ( source ) ) {
6668 const mutations = source as IMutation [ ]
6769 mutations . forEach ( ( mutation ) => {
0 commit comments