declare function nameof<T extends Function>(fn: T): string;
declare function nameof<T extends object>(key: keyof T): keyof T;
declare function nameof<T extends object>(obj: T): keyof T;
declare function nameof<
	T,
	K1 extends keyof T
>(obj: T, k1: K1): K1;
declare function nameof<
	T,
	K1 extends keyof T,
	K2 extends keyof T[K1]
>(obj: T, k1: K1, k2: K2): K2;
declare function nameof<
	T,
	K1 extends keyof T,
	K2 extends keyof T[K1],
	K3 extends keyof T[K1][K2]
>(obj: T, k1: K1, k2: K2, k3: K3): K3;
declare function nameof<
	T,
	K1 extends keyof T,
	K2 extends keyof T[K1],
	K3 extends keyof T[K1][K2],
	K4 extends keyof T[K1][K2][K3]
>(obj: T, k1: K1, k2: K2, k3: K3, k4: K4): K4;
export { nameof, nameof as default };
