/** * @description Makes a subset of properties K in type T required, while keeping others as they are. * @template T The original type. * @template K A union of keys from T that should be made required. */ type MarkRequired = T & { [P in K]-?: T[P] }; // --- Usage Example --- interface User { id: string; name?: string; email: string; age?: number; } // UserConfig will have 'name' and 'age' as required, 'id' and 'email' remain required. type UserConfig = MarkRequired; const user1: UserConfig = { id: '123', name: 'Alice', email: 'alice@example.com', age: 30, // Required }; // This would cause a type error because 'name' and 'age' are required // const user2: UserConfig = { // id: '456', // email: 'bob@example.com', // };