Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- The following function creates a Proxy object with event methods attached.
- This might be useful for adding api calls or data checks whenever your object changes.
- Example use case:
- On the client side you keep a data object which stores user or app data,
- whenever a key is changed you make an api call to write this new object to your database.
- */
- export const watchObj = <T extends {}, V extends T[keyof T]>(
- /** Base Object to attach watchers */
- obj: T,
- /** Event that triggers pre get */
- preGet?: (
- targetRef?: T,
- property?: keyof T
- ) => void ,
- /** Event that fires after setting key value pair in object */
- afterSet?: (
- targetRef?: T,
- property?: keyof T,
- value?: V,
- beforeSetValue?: V | undefined
- ) => void,
- /** Event that triggers after delete attempt */
- afterDelete?: (
- targetRef?: T,
- property?: keyof T,
- deletedValue?: V | undefined
- ) => void
- ) => {
- const get = (targetRef: T, property: keyof T) => {
- if (preGet) {
- preGet(targetRef, property);
- }
- return targetRef[property];
- };
- const set = (targetRef: T, property: keyof T, value: V) => {
- const currentValue = targetRef[property] as V | undefined;
- targetRef[property] = value;
- if (afterSet) {
- afterSet(targetRef, property, value, currentValue);
- }
- return true;
- };
- const deleteProperty = (targetRef: T, property: keyof T) => {
- const valToDelete = targetRef[property] as V | undefined;
- if (property in targetRef) {
- delete targetRef[property];
- }
- if (afterDelete) {
- afterDelete(targetRef, property, valToDelete);
- }
- return true;
- };
- return new Proxy(obj, { get, set, deleteProperty });
- };
- // Example Code
- type testObj = {
- test?: string;
- };
- const t: testObj = {};
- const onGet = (targetRef?: testObj, property?: keyof testObj) => {
- console.log(property); // prints test since this is the property being looked up
- };
- const x = watchObj<testObj, testObj[keyof testObj]>(t, onGet);
- console.log(x.test); // prints undefined since there is no test key in the object
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement