declconverter 연습
This commit is contained in:
@@ -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,
|
||||
}
|
||||
}
|
||||
}
|
||||
Vendored
+18
@@ -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]>];
|
||||
@@ -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);
|
||||
@@ -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,
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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,
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user