From b30dde442b55955893d952f71ccedacab4e115fe Mon Sep 17 00:00:00 2001 From: Hide_D Date: Mon, 7 Aug 2023 18:23:37 +0000 Subject: [PATCH] Solve --- server/api/decorator/test2.ts | 72 +++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 server/api/decorator/test2.ts diff --git a/server/api/decorator/test2.ts b/server/api/decorator/test2.ts new file mode 100644 index 0000000..7d6f2b5 --- /dev/null +++ b/server/api/decorator/test2.ts @@ -0,0 +1,72 @@ +import { InvalidConversion } from "./base"; + +export interface Converter> { + (inCtx: In): Out; +} + +type Empty = Record; + +interface Login { + userID: number; +} +interface GameLogin { + userID: number; + generalID: number; +} +interface UserLevel { + userID: number; + userLevel: number; +} + +export function ParseUserLevel(): Converter { + return (inCtx: Q): Q & UserLevel => { + return { + userLevel: 123, + ...inCtx, + }; + } +} + +export function ReqLogin(): Converter { + return (inCtx: Q): Q & Login => { + return { + userID: 999, + ...inCtx, + }; + } +} + +export function ReqGameLogin(): Converter { + return (inCtx: Q): Q & GameLogin => { + return { + generalID: inCtx.userID * 4, + ...inCtx, + }; + } +} + +const x = [ + ReqLogin(), + ParseUserLevel(), +] as const; + +const y = [ + ReqLogin, + ParseUserLevel, + ReqGameLogin, +] as const; + +type Split = A extends (q: infer Q) => infer R ? [Q, R] : never; + +type Compose = B extends A ? B : never; +type Compose2 = D & B extends A & C ? B extends C ? Converter : never : never; +type Chain = + T extends readonly [() => Converter] ? Converter : + T extends readonly [() => Converter, () => Converter] ? Compose2 : + T extends readonly [() => Converter, () => Converter, ... infer R] ? Chain<[() => Compose2, ...R]> : + never; + + +type Solve = T extends Converter ? Empty extends A ? B : never : never; + +type Z = Solve>;