From 4e4f50a2fcbb5a635de46cc76bd6b225301b5bc3 Mon Sep 17 00:00:00 2001 From: Anton Astashov Date: Wed, 22 May 2019 11:13:50 -0500 Subject: [PATCH] @types/koa-compose: Add more typed compose cases (#35298) * @types/koa-compose: Add more typed compose cases Right now if you want typesafe compose, you have to compose composes by 2-element arrays. I.e. if you have 4 middlewares you want to compose together, and you want to do that in a typesafe way, without losing type information, you have to do it like this: ```ts import compose from "koa-compose" const myMiddleware = compose([ firstMiddleware, compose([ secondMiddleware, compose([ thirdMiddleware, fourthMiddleware ]) ]) ]); ``` It works, but looks clunky it complicated. Would be cool to still have type-safe way of composing, but with less clunkiness. Like: ``` import compose from "koa-compose" const myMiddleware = compose([ firstMiddleware, secondMiddleware, thirdMiddleware, fourthMiddleware ]); ``` It's hard to solve that issue for general case, but we could just add typesafe compose overrides for up to e.g. 8-element arrays. If it's more than 8 - you still can compose composes. But in general IMHO it will reduce clunkiness of it. * @types/koa-compose: Add Anton Astashov to the list of maintainers --- types/koa-compose/index.d.ts | 43 ++++++++++++++++++++++++-- types/koa-compose/koa-compose-tests.ts | 10 ++++++ 2 files changed, 50 insertions(+), 3 deletions(-) diff --git a/types/koa-compose/index.d.ts b/types/koa-compose/index.d.ts index f35b9ca208..3658a8fbce 100644 --- a/types/koa-compose/index.d.ts +++ b/types/koa-compose/index.d.ts @@ -1,14 +1,51 @@ // Type definitions for koa-compose 3.2 // Project: https://github.com/koajs/compose // Definitions by: jKey Lu +// Anton Astashov // Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped // TypeScript Version: 2.3 import * as Koa from "koa"; -declare function compose( - middleware: [Koa.Middleware, Koa.Middleware] -): Koa.Middleware; +declare function compose( + middleware: [Koa.Middleware, Koa.Middleware] +): Koa.Middleware; + +declare function compose( + middleware: [Koa.Middleware, Koa.Middleware, Koa.Middleware] +): Koa.Middleware; + +declare function compose( + middleware: [Koa.Middleware, Koa.Middleware, Koa.Middleware, Koa.Middleware] +): Koa.Middleware; + +declare function compose( + middleware: [ + Koa.Middleware, Koa.Middleware, Koa.Middleware, Koa.Middleware, + Koa.Middleware + ] +): Koa.Middleware; + +declare function compose( + middleware: [ + Koa.Middleware, Koa.Middleware, Koa.Middleware, Koa.Middleware, + Koa.Middleware, Koa.Middleware + ] +): Koa.Middleware; + +declare function compose( + middleware: [ + Koa.Middleware, Koa.Middleware, Koa.Middleware, Koa.Middleware, + Koa.Middleware, Koa.Middleware, Koa.Middleware + ] +): Koa.Middleware; + +declare function compose( + middleware: [ + Koa.Middleware, Koa.Middleware, Koa.Middleware, Koa.Middleware, + Koa.Middleware, Koa.Middleware, Koa.Middleware, Koa.Middleware + ] +): Koa.Middleware; declare function compose(middleware: Array>): compose.ComposedMiddleware; diff --git a/types/koa-compose/koa-compose-tests.ts b/types/koa-compose/koa-compose-tests.ts index 56b105e900..9b2ded25c4 100644 --- a/types/koa-compose/koa-compose-tests.ts +++ b/types/koa-compose/koa-compose-tests.ts @@ -49,3 +49,13 @@ new Koa<{}, {}>() ctx.body = "Something"; await next(); }); + +new Koa<{}, {}>() + .use(compose([fooMiddleware, barMiddleware, wooMiddleware])) + .use(async (ctx, next) => { + ctx.state.foo; + ctx.state.bar; + ctx.state.woo; + ctx.body = "Something"; + await next(); + });