@@ -10,9 +10,11 @@ import type {
1010 EnumKey ,
1111 EnumValue ,
1212 FindEnumKeyByValue ,
13+ FindLabelByValue ,
1314 IEnumItems ,
1415 MenuItemOption ,
1516 ObjectFirstOptionConfig ,
17+ PrimitiveOf ,
1618 ToSelectConfig ,
1719 ValueMap ,
1820 ValueTypeFromSingleInit ,
@@ -70,13 +72,66 @@ export class EnumItemsArray<
7072 */
7173 readonly [ ENUM_ITEMS ] = true ;
7274
73- label ( keyOrValue ?: string | V ) : string | undefined {
74- // First find by value, then find by key
75- return ( this . find ( ( i ) => i . value === keyOrValue ) ?? this . find ( ( i ) => i . key === keyOrValue ) ) ?. label ;
75+ label < KV extends V | K | NonNullable < PrimitiveOf < V > > | NonNullable < PrimitiveOf < K > > | undefined > (
76+ keyOrValue : KV
77+ ) :
78+ | ( undefined extends KV ? undefined : never )
79+ | ( KV extends undefined
80+ ? undefined
81+ : NonNullable < KV > extends K
82+ ? T [ NonNullable < KV > ] extends { label : unknown }
83+ ? T [ NonNullable < KV > ] [ 'label' ] extends undefined
84+ ? NonNullable < KV >
85+ : string
86+ : NonNullable < KV >
87+ : NonNullable < KV > extends V
88+ ? FindLabelByValue < T , NonNullable < KV > >
89+ : PrimitiveOf < K > extends KV
90+ ? string | undefined
91+ : PrimitiveOf < V > extends KV
92+ ? string | undefined
93+ : undefined ) {
94+ // Find by value, then try key
95+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
96+ return ( this . find ( ( i ) => i . value === keyOrValue ) ?? this . find ( ( i ) => i . key === keyOrValue ) ) ?. label as any ;
7697 }
7798
78- key ( value ?: string | V ) : K | undefined {
79- return this . find ( ( i ) => i . value === value ) ?. key ;
99+ key < IV extends V | NonNullable < PrimitiveOf < V > > | undefined > (
100+ value ?: IV
101+ ) :
102+ | ( undefined extends IV ? undefined : never )
103+ | ( IV extends undefined
104+ ? undefined
105+ : NonNullable < IV > extends V
106+ ? FindEnumKeyByValue < T , NonNullable < IV > >
107+ : PrimitiveOf < V > extends NonNullable < IV >
108+ ? K | undefined
109+ : undefined ) {
110+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
111+ return this . find ( ( i ) => i . value === value ) ?. key as any ;
112+ }
113+
114+ raw ( ) : T ;
115+ raw < IK extends V | K | Exclude < EnumValue , string > | NonNullable < string > > (
116+ keyOrValue : IK
117+ ) : IK extends K ? T [ IK ] : IK extends V ? T [ FindEnumKeyByValue < T , IK > ] : T [ K ] | undefined ;
118+ raw < IK extends EnumValue > ( value ?: IK | unknown ) : T | T [ K ] | T [ FindEnumKeyByValue < T , IK > ] | undefined {
119+ if ( value == null ) {
120+ // Return the original initialization object
121+ return this . #raw;
122+ } else {
123+ if ( Object . keys ( this . #raw) . some ( ( k ) => k === ( value as string ) ) ) {
124+ // Find by key
125+ return this . #raw[ value as K ] ;
126+ }
127+ // Find by value
128+ const itemByValue = this . find ( ( i ) => i . value === value ) ;
129+ if ( itemByValue ) {
130+ return itemByValue . raw ;
131+ } else {
132+ return undefined ;
133+ }
134+ }
80135 }
81136
82137 has ( keyOrValue ?: string | V ) : boolean {
@@ -162,30 +217,6 @@ export class EnumItemsArray<
162217 return this . toFilter ( ) ;
163218 }
164219
165- raw ( ) : T ;
166- // eslint-disable-next-line @typescript-eslint/ban-types
167- raw < IK extends V | K | Exclude < EnumValue , string > | ( string & { } ) > (
168- keyOrValue : IK
169- ) : IK extends K ? T [ IK ] : IK extends V ? T [ FindEnumKeyByValue < T , IK > ] : T [ K ] | undefined ;
170- raw < IK extends EnumValue > ( value ?: IK | unknown ) : T | T [ K ] | T [ FindEnumKeyByValue < T , IK > ] | undefined {
171- if ( value == null ) {
172- // Return the original initialization object
173- return this . #raw;
174- } else {
175- if ( Object . keys ( this . #raw) . some ( ( k ) => k === ( value as string ) ) ) {
176- // Find by key
177- return this . #raw[ value as K ] ;
178- }
179- // Find by value
180- const itemByValue = this . find ( ( i ) => i . value === value ) ;
181- if ( itemByValue ) {
182- return itemByValue . raw ;
183- } else {
184- return undefined ;
185- }
186- }
187- }
188-
189220 /** @deprecated Stub method, only for typing usages, not for runtime calling */
190221 get valueType ( ) : V {
191222 throw new Error (
0 commit comments