type SinglePropertyChangedEvents = { [K in keyof T as `${string & K}Changed`]: PropertyChangedEventArgs | ArrayPropertyChangedEventArgs; }; type AllPropertiesChangedEvents = { propertyChanged: PropertyChangedEventArgs | ArrayPropertyChangedEventArgs; }; export type PropertyChangedEvents = AllPropertiesChangedEvents & SinglePropertyChangedEvents; export type PropertyChangedEventArgs = { propertyName: keyof T; oldValue: unknown; newValue: unknown; }; export type ArrayPropertyChangedEventArgs = PropertyChangedEventArgs & { added: { item: unknown; index: number; }[]; removed: { item: unknown; index: number; }[]; }; export {};