Skip to content

Commit b7afd14

Browse files
committed
refactor: simplify plugin type system by removing fallback overloads
- Remove complex overload resolution system in favor of direct inheritance checking. - Remove (element: any): {} fallback overloads from PluginFn signatures - Replace complex ResolvePluginReturn with simple TKind extends P inheritance check - Simplify PluginPropsOf type with inline constraint - Fix JSDoc comment for CameraKind type This eliminates the need for R1-R5 overload complexity while maintaining full functionality through direct type inheritance matching.
1 parent 57f2d1b commit b7afd14

File tree

1 file changed

+11
-85
lines changed

1 file changed

+11
-85
lines changed

src/types.ts

Lines changed: 11 additions & 85 deletions
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ export interface Viewport {
114114
aspect: number
115115
}
116116

117-
/** Possible camera types. */
117+
/** Possible camera kinds. */
118118
export type CameraKind = PerspectiveCamera | OrthographicCamera
119119

120120
export type Loader<TSource, TResult extends object> = {
@@ -318,7 +318,6 @@ export interface PluginFn {
318318
methods: (element: T extends readonly Constructor<infer U>[] ? U : never) => Methods,
319319
): Plugin<{
320320
(element: T extends readonly Constructor<infer U>[] ? U : never): Methods
321-
(element: any): {}
322321
}>
323322

324323
// No setup - direct usage with two arguments (type guard)
@@ -327,7 +326,6 @@ export interface PluginFn {
327326
methods: (element: T) => Methods,
328327
): Plugin<{
329328
(element: T): Methods
330-
(element: any): {}
331329
}>
332330

333331
// Setup function
@@ -349,7 +347,6 @@ export interface PluginFn {
349347
) => Methods,
350348
): Plugin<{
351349
(element: T extends readonly Constructor<infer U>[] ? U : never): Methods
352-
(element: any): {}
353350
}>
354351

355352
// With setup - two arguments (type guard)
@@ -358,7 +355,6 @@ export interface PluginFn {
358355
methods: (element: T, context: TSetupContext) => Methods,
359356
): Plugin<{
360357
(element: T): Methods
361-
(element: any): {}
362358
}>
363359
}
364360
}
@@ -370,81 +366,10 @@ export type InferPluginProps<TPlugins extends Plugin[]> = Merge<{
370366
: never
371367
}>
372368

373-
/**
374-
* Helper type to resolve overloaded function returns
375-
* Matches overloads from most specific to least specific
376-
*/
377-
type ResolvePluginReturn<TFn, TTarget> = TFn extends {
378-
(element: infer P1): infer R1
379-
(element: infer P2): infer R2
380-
(element: infer P3): infer R3
381-
(element: infer P4): infer R4
382-
(element: infer P5): infer R5
383-
}
384-
? TTarget extends P1
385-
? R1
386-
: TTarget extends P2
387-
? R2
388-
: TTarget extends P3
389-
? R3
390-
: TTarget extends P4
391-
? R4
392-
: TTarget extends P5
393-
? R5
394-
: never
395-
: TFn extends {
396-
(element: infer P1): infer R1
397-
(element: infer P2): infer R2
398-
(element: infer P3): infer R3
399-
(element: infer P4): infer R4
400-
}
401-
? TTarget extends P1
402-
? R1
403-
: TTarget extends P2
404-
? R2
405-
: TTarget extends P3
406-
? R3
407-
: TTarget extends P4
408-
? R4
409-
: never
410-
: TFn extends {
411-
(element: infer P1): infer R1
412-
(element: infer P2): infer R2
413-
(element: infer P3): infer R3
414-
}
415-
? TTarget extends P1
416-
? R1
417-
: TTarget extends P2
418-
? R2
419-
: TTarget extends P3
420-
? R3
421-
: never
422-
: TFn extends { (element: infer P1): infer R1; (element: infer P2): infer R2 }
423-
? TTarget extends P1
424-
? R1
425-
: TTarget extends P2
426-
? R2
427-
: never
428-
: TFn extends { (element: infer P): infer R }
429-
? TTarget extends P
430-
? R
431-
: never
432-
: never
433-
434-
/**
435-
* Resolves what a plugin returns for a specific element type T
436-
* Handles both simple functions and overloaded functions
437-
*/
438369
type PluginReturn<TPlugin, TKind> = TPlugin extends Plugin<infer TFn>
439-
? TFn extends (...args: any[]) => any
440-
? ResolvePluginReturn<TFn, TKind> extends infer TResult
441-
? TResult extends never
442-
? TFn extends (element: TKind) => infer R
443-
? R
444-
: TFn extends (element: any) => infer R
445-
? R
446-
: {}
447-
: TResult
370+
? TFn extends { (element: infer P): infer R }
371+
? TKind extends P
372+
? R
448373
: {}
449374
: {}
450375
: {}
@@ -454,11 +379,12 @@ type PluginReturn<TPlugin, TKind> = TPlugin extends Plugin<infer TFn>
454379
* This allows plugins to provide conditional methods based on the actual element type
455380
*/
456381
export type PluginPropsOf<T, TPlugins extends Plugin[]> = Merge<{
457-
[K in keyof TPlugins]: PluginReturn<TPlugins[K], T> extends infer Methods
458-
? Methods extends Record<string, any>
459-
? {
460-
[M in keyof Methods]: Methods[M] extends (value: infer V) => any ? V : never
461-
}
462-
: {}
382+
[K in keyof TPlugins]: PluginReturn<TPlugins[K], T> extends infer Methods extends Record<
383+
string,
384+
any
385+
>
386+
? {
387+
[M in keyof Methods]: Methods[M] extends (value: infer V) => any ? V : never
388+
}
463389
: {}
464390
}>

0 commit comments

Comments
 (0)