22 lines
609 B
TypeScript
22 lines
609 B
TypeScript
|
// @declaration: true
|
||
|
// Any instance type
|
||
|
type Client = string
|
||
|
|
||
|
// Modified instance
|
||
|
type UpdatedClient<C> = C & {foo: number}
|
||
|
|
||
|
export const createClient = <
|
||
|
D extends
|
||
|
| (new (...args: any[]) => Client) // accept class
|
||
|
| Record<string, new (...args: any[]) => Client> // or map of classes
|
||
|
>(
|
||
|
clientDef: D
|
||
|
): D extends new (...args: any[]) => infer C
|
||
|
? UpdatedClient<C> // return instance
|
||
|
: {
|
||
|
[K in keyof D]: D[K] extends new (...args: any[]) => infer C // or map of instances respectively
|
||
|
? UpdatedClient<C>
|
||
|
: never
|
||
|
} => {
|
||
|
return null as any
|
||
|
}
|