export interface Accessor { (obj: unknown, ...args: unknown[]): T; fields?: readonly string[]; fname?: string; } export default function accessor(fn: (obj: unknown, ...args: unknown[]) => T, fields?: readonly string[], name?: string): Accessor { return Object.assign(fn, { fields: fields || [], fname: name }); } export function accessorName(fn: Accessor | null | undefined): string | null | undefined { return fn == null ? null : fn.fname; } export function accessorFields(fn: Accessor | null | undefined): readonly string[] | null | undefined { return fn == null ? null : fn.fields; }