/**
 * Refers to the class (constructor/`new`-able) of a type. Don't use this to instantiate objects at
 * runtime, because it doesn't preserve constructor parameter types.
 *
 * @example
 * ```typescript
 * class Thing {
 *     constructor(n: number, s: string) {}
 * }
 * function make<C>(c: Class<C>): C {
 *     return new c();
 *     // Valid TypeScript, but this would fail at runtime because the 2 parameters aren't provided.
 * }
 * const t = make(Thing);
 * // t is of type Thing. Typing t correctly in APIs like this, is why Class<T> exists.
 * ```
 */
export type Class<T> = Function & (new (...args: any) => T);
/**
 * Union of all keys whose values are functions.
 *
 * @example
 * ```typescript
 * class Thing {
 *     s = '';
 *     f1() {}
 *     f2() {}
 * }
 * function doWithThing(t: Thing, name: FunctionNames<Thing>): void {
 *     // name is 'f1' | 'f2'
 * }
 * ```
 */
export type FunctionNames<T> = {
    [K in keyof T]: T[K] extends Function ? K : never;
}[keyof T];
