TypeScriptadvanced
type EventMap = Record<string, unknown>;
export class TypedEmitter<Events extends EventMap> {
private listeners: { [K in keyof Events]?: Array<(payload: Events[K]) => void> } = {};
Make on() and emit() reject mismatched event names and payloads at compile time, from one map type instead of per-event overloads.
TypeScriptadvanced
export type DeepPartial<T> = T extends readonly unknown[]
? T
: T extends object
? { [K in keyof T]?: DeepPartial<T[K]> }
: T;
Make every property optional at every nesting level, for patch-style updates, without touching arrays element by element.
TypeScriptadvanced
type Getters<T> = {
[K in keyof T as `get${Capitalize<string & K>}`]: () => T[K];
};
export const toGetters = <T extends object>(obj: T): Getters<T> => {
Turn a plain object type into a matching set of getter methods, renaming every key to getX without writing each one by hand.