import { LiteralUnion } from "type-fest"; type KeyOfOrAny = P extends keyof T ? T[P] : any; export default function hookDefineProperty< T extends object, P extends LiteralUnion >(target: T, property: LiteralUnion, cb: (val: KeyOfOrAny) => KeyOfOrAny) { const targetAsAny = target as any; if (property in target) { return void cb(targetAsAny[property]); } let value: any; Object.defineProperty(targetAsAny, property, { get: () => value, set(v) { value = cb(v) ?? v; }, configurable: true, enumerable: false }); return () => { delete targetAsAny[property]; targetAsAny[property] = value; }; }