generated at
typera
Koaにも型を付けられる




これらを型付けできる
path params
query params
body
header


ts
import { Router } from 'express'; import { Parser, Response, Route, route, router as r } from 'typera-express'; import * as t from 'io-ts'; import { IntFromString } from 'io-ts-types/lib/IntFromString'; const router = Router(); interface User { id: number; hoge: number; } const updateUser: Route< Response.Ok<User> | Response.NotFound | Response.BadRequest<string> > = route .get('/:id(int)') // ①-1 .use(Parser.query(t.type({ hoge: IntFromString }))) // ②-1 .handler(async req => { const id = req.routeParams.id; // ①-2 const hoge = req.query.hoge; // ②-2 return Response.ok({ id, hoge }); }); router.use(r(updateUser).handler());
ポイント
①-1の箇所でpath paramsに型を付けている
こうすることで、①-2が0より大きい number になる
この (int) の部分は独自に定義することもできる ref
②でquery paramsに型を付けている
この use にbodyやheaderの型を追加できる
IntFromString io-ts-typesの機能で、StringをNumberにcastする
これによって、②-2の hoge number に推論される
これが必要な理由は、そもそもquery paramsというものがstringしか受け付けないという仕様だから。
でも、この制限も突破できる
型の部分が追加されただけで、他の箇所は元のExpressとさほど変わりない






record | null のようなqueryを表現する
例えば、日付の範囲指定をするqueryを作る時
ts
export const DateRange = t.type({ start: DateFromISOString, // e.g. 2022-01-01 00:00:00 end: DateFromISOString // e.g. 2022-01-01 00:00:00 });
以下の2つのみを許容したい
start end ともに指定している
両方指定していない
片方のみは許容しないmrsekut
t.union([DateRange, t.unknown]) のように書けばいい
普通に考えたら t.null t.undefined だけどvalidation errorになる
ts
const getPostsCount: Get<{ count: number }> = route .get('/posts/count') .use(Parser.query(t.union([DateRange, t.unknown]))) .handler(async req => { try { const dateRange = DateRange.is(req.query) ? { start: req.query.start, end: req.query.end } : undefined; const count = await Usecase.getUserPostPicsCount( dateRange );






Router ref
複数ある時は、まとめて作れる
ts
import { router as r } from 'typera-express'; // ... export const router = r( root, getFirstGenres, getSecondGenres, getGenre, ).handler();
r.add(...routes) という関数もある
router() と異なり、新しいinstanceを返す
いつこれが必要になるのかわからない #??


Route parameter capturaring ref
'/:id(int)' とか '/:id' とかのformat
() を付けない場合はstringになる
複数の変数を使う場合は、 - . で連結する
e.g.
/flights/:from-:to
stringの from to が得られる
/plantae/:genus.:species(int)
stringの genus と、intの species が得られる
(int) は、正の整数のみにmatchする
ok: /1
ok: /01
1 と解釈される
ng: /-1
ng: /1.1
独自の



redirectもできる



docsを読む todos
Responses
Common responses
Middleware
next
stop
ChainedMiddleware
Request parsers
query
body
headers
cookies
Customizing the error response
Using express middleware
wrapNative
Routes
route
route.use
applyMiddleware