type Signal<T extends object> = T & {
onChange: (callback: Callback<T>) => () => void;
} & {
[K in keyof T as `on${Capitalize<string & K>}Change`]: (callback: (value: T[K], oldValue: T[K]) => void) => () => void;
} & {
[K in keyof T as `${string & K}AsSignal`]: T[K] extends object ? Signal<T[K]> : Signal<{value: T[K]}>;
}
Mapped types: transform generic object keys into new types using key mapping and template literals. Recursively create new signatures per object key. Enables scalable, type-safe contracts at the type level. (see image)
#TypeScript #StaticTyping #MappedTypes