Skip to content

Instantly share code, notes, and snippets.

@devhammed
Created October 31, 2025 14:07
Show Gist options
  • Select an option

  • Save devhammed/395d3bcc4690a13af3cfdf0ce30375d9 to your computer and use it in GitHub Desktop.

Select an option

Save devhammed/395d3bcc4690a13af3cfdf0ce30375d9 to your computer and use it in GitHub Desktop.
Implementation Of Laravel "tap" Helper In TypeScript
type TapProxy<T extends object> = {
[K in keyof T]: T[K] extends (...args: infer A) => unknown
? (...args: A) => T
: T[K];
};
function tap<T extends object>(obj: T): TapProxy<T>;
function tap<T extends object>(obj: T, fn: (target: T) => void): T;
function tap<T extends object>(
obj: T,
fn?: (target: T) => void,
): T | TapProxy<T> {
if (!fn) {
return new Proxy(obj, {
get(target, prop, receiver) {
const value = Reflect.get(target, prop, receiver);
if (typeof value === "function") {
return function (...args: unknown[]) {
value.apply(obj, args);
return obj;
};
}
return value;
},
});
}
fn(obj);
return obj;
}
const user = {
name: "Hammed Oyedele",
save() {
console.log("saving");
},
};
console.log("Proxy", tap(user).save().name); // "Hammed Oyedele"
console.log("Callback", tap(user, (u) => u.save()).name); // "Hammed Oyedele"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment