|
1 | 1 | import { useState } from 'react';
|
2 | 2 |
|
3 |
| -export interface Actions<K, V> { |
4 |
| - get: (key: K) => any; |
5 |
| - set: (key: K, value: V) => void; |
6 |
| - remove: (key: K) => void; |
| 3 | +export interface Actions<T extends object> { |
| 4 | + get: <K extends keyof T>(key: K) => T[K]; |
| 5 | + set: <K extends keyof T>(key: K, value: T[K]) => void; |
| 6 | + remove: <K extends keyof T>(key: K) => void; |
7 | 7 | reset: () => void;
|
8 | 8 | }
|
9 | 9 |
|
10 |
| -const useMap = <T extends { [key: string]: any }>(initialMap: any = {}): [T, Actions<string, any>] => { |
11 |
| - const [map, set] = useState<T>(initialMap as any); |
| 10 | +const useMap = <T extends object = any>(initialMap: T = {} as T): [T, Actions<T>] => { |
| 11 | + const [map, set] = useState<T>(initialMap); |
12 | 12 |
|
13 | 13 | return [
|
14 | 14 | map,
|
15 | 15 | {
|
16 |
| - get: (key: string) => map[key], |
17 |
| - set: (key: string, entry: any) => |
| 16 | + get: (key: keyof T) => map[key as string], |
| 17 | + set: <K extends keyof T>(key: K, entry: T[K]) => { |
18 | 18 | set({
|
19 |
| - ...(map as any), |
| 19 | + ...map, |
20 | 20 | [key]: entry,
|
21 |
| - }), |
22 |
| - remove: (key: string) => { |
23 |
| - const { [key]: omit, ...rest } = map as any; |
24 |
| - set(rest); |
| 21 | + }); |
| 22 | + }, |
| 23 | + remove: (key: keyof T) => { |
| 24 | + const { [key]: omit, ...rest } = map; |
| 25 | + set(rest as T); |
25 | 26 | },
|
26 | 27 | reset: () => set(initialMap),
|
27 | 28 | },
|
|
0 commit comments