diff --git a/packages/koishi-core/src/parser.ts b/packages/koishi-core/src/parser.ts index 3abea953d8..b3ffecc671 100644 --- a/packages/koishi-core/src/parser.ts +++ b/packages/koishi-core/src/parser.ts @@ -19,21 +19,23 @@ export interface Domain { export namespace Domain { type Builtin = keyof Domain - type GetDomain = T extends Builtin ? Domain[T] : F - - type GetParamDomain - = S extends `${any}${X}${infer T}` ? GetDomain : F + type ParamType + = S extends `${any}:${infer T}` ? T extends Builtin ? Domain[T] : F : F type Replace = S extends `${infer L}${X}${infer R}` ? `${L}${Y}${Replace}` : S - type Extract - = S extends `${infer L}${Y}${infer R}` ? [GetParamDomain, ...Extract] : [] + type ExtractAll + = S extends `${infer L}]${infer R}` ? [ParamType, ...ExtractAll] : [] + + type ExtractFirst + = S extends `${infer L}]${any}` ? ParamType : boolean - type ExtractFirst - = S extends `${infer L}${Y}${any}` ? GetParamDomain : boolean + type ExtractSpread = S extends `${infer L}...${infer R}` + ? [...ExtractAll, ...ExtractFirst[]] + : [...ExtractAll, ...string[]] - export type ArgumentType = [...Extract', ']'>, ':', ']', string>, ...string[]] + export type ArgumentType = ExtractSpread', ']'>> // I don't know why I should write like this but // [T] extends [xxx] just works, so don't touch it @@ -41,7 +43,7 @@ export namespace Domain { = [T] extends [Builtin] ? Domain[T] : [T] extends [RegExp] ? string : T extends (source: string) => infer R ? R - : ExtractFirst', ']'>, ':', ']', any> + : ExtractFirst', ']'>, any> export type Type = Builtin | RegExp | Transform