declconverter 연습

This commit is contained in:
2023-08-07 17:14:27 +00:00
parent 35f5726659
commit d928241e00
7 changed files with 168 additions and 0 deletions
+32
View File
@@ -0,0 +1,32 @@
import { type BaseConverter, InvalidConversion } from "./base";
import { Request, Response, NextFunction } from "express";
interface GameLoginIn {
userID: number;
[key: string]: unknown;
}
interface UserLevelOut {
userID: number;
userLevel: number;
[key: string]: unknown;
}
/*export class ReqGameLogin0 extends BaseConverter<SessionIn, SessionOut> {
override transform(inCtx: SessionIn, request: Request, response: Response): SessionOut | InvalidConversion {
return {
generalID: inCtx.userID * 4,
...inCtx,
}
}
}*/
export function ParseUserLevel(): BaseConverter<GameLoginIn, UserLevelOut> {
return (inCtx: GameLoginIn, request: Request, response: Response): UserLevelOut | InvalidConversion => {
return {
userLevel: 123,
...inCtx,
}
}
}
+18
View File
@@ -0,0 +1,18 @@
// eslint-disable-next-line @typescript-eslint/no-explicit-any
type C = (...args: any) => any;
type Rev<A> = ()=> A;
type ChainResult<T> =
T extends [infer R0 extends C] ? ReturnType<R0> :
T extends [infer R1 extends C, infer R0 extends C] ? ReturnType<R1> & ReturnType<R0> :
T extends [infer R2, infer R1, ...infer RX] ? ChainResult2<R2, R1, ChainResult<[R2, R1]>, ChainResult<[Rev<ChainResult<[R2, R1]>>, ...RX]>> :
never;
type ChainResult2<A, B, T, ANS> = T extends ChainResult<[A, B]> ? ANS: never;
declare function DeclConverter<R0 extends C>(r0: R0): [[R0], ReturnType<R0>];
declare function DeclConverter<R0, R1>(r0: R0, r1: R1): [[R0, R1], ChainResult<[R0, R1]>];
declare function DeclConverter<R0, R1, R2>(r0: R0, r1: R1, r2:R2) : [[R0, R1, R2], ChainResult<[R0, R1, R2]>];
declare function DeclConverter<R0, R1, R2, R3>(r0: R0, r1: R1, r2:R2, r3:R3) : [[R0, R1, R2, R3], ChainResult<[R0, R1, R2, R3]>];
declare function DeclConverter<R0, R1, R2, R3, R4>(r0: R0, r1: R1, r2:R2, r3:R3, r4:R4) : [[R0, R1, R2, R3, R4], ChainResult<[R0, R1, R2, R3, R4]>];
+44
View File
@@ -0,0 +1,44 @@
import { Request, Response, NextFunction } from "express";
import { ReqLogin } from "./reqLogin";
import { ReqGameLogin } from "./reqGameLogin";
import { ParseUserLevel } from "./ParseUserLevel";
export type InvalidConversion = {
isInvalid: true;
reason?: string;
alreadyProcessed?: boolean;
}
export interface BaseConverter<In extends object, Out extends In,>{
(inCtx: In, request: Request, response: Response): Out | InvalidConversion;
}
function Chain<In>(args: In, request: Request, response: Response) {
return {
next: <Out extends In,>(inner: (payload: In, request: Request, response: Response) => Out) => {
return Chain(inner(args, request, response), request, response);
}
}
}
type ExtendsType<U, T> = T extends U ? T : never;
// eslint-disable-next-line @typescript-eslint/no-explicit-any
//export function DeclConverter(): [[], Record<string, unknown>];
//TODO: ReqLogin이 위에 있을 경우에만 통과시켜야..?
const a = DeclConverter(
ParseUserLevel(),
ReqLogin(),
ReqGameLogin(),
)
type b = Exclude<(typeof a)[1], InvalidConversion>;
const c: b = undefined as unknown as b;
//흠....
console.log(c.generalID);
console.log(c.userID);
console.log(c.userLevel);
+32
View File
@@ -0,0 +1,32 @@
import { type BaseConverter, InvalidConversion } from "./base";
import { Request, Response, NextFunction } from "express";
interface GameLoginIn {
userID: number;
[key: string]: unknown;
}
interface GameLoginOut {
userID: number;
generalID: number;
[key: string]: unknown;
}
/*export class ReqGameLogin0 extends BaseConverter<SessionIn, SessionOut> {
override transform(inCtx: SessionIn, request: Request, response: Response): SessionOut | InvalidConversion {
return {
generalID: inCtx.userID * 4,
...inCtx,
}
}
}*/
export function ReqGameLogin(): BaseConverter<GameLoginIn, GameLoginOut> {
return (inCtx: GameLoginIn, request: Request, response: Response): GameLoginOut | InvalidConversion => {
return {
generalID: inCtx.userID * 4,
...inCtx,
}
}
}
+42
View File
@@ -0,0 +1,42 @@
import { BaseConverter, InvalidConversion } from "./base";
import { Request, Response, NextFunction } from "express";
interface SessionIn {
[key: string]: unknown;
}
interface SessionOut {
userID: number;
[key: string]: unknown;
}
/*export class ReqLogin extends BaseConverter<SessionIn, SessionOut> {
override transform(inCtx: SessionIn, request: Request, response: Response): SessionOut | InvalidConversion {
if(request.params['something'] === 'haha'){
return {
isInvalid: true,
reason: 'haha',
}
}
return {
generalID: inCtx.userID * 4,
...inCtx,
}
}
}*/
export function ReqLogin(): BaseConverter<SessionIn, SessionOut> {
return (inCtx: SessionIn, request: Request, response: Response): SessionOut | InvalidConversion => {
if(request.params['something'] === 'haha'){
return {
isInvalid: true,
reason: 'haha',
}
}
return {
userID: 123,
...inCtx,
}
}
}
View File