typera
これらを型付けできる
path params
query params
body
header
例
tsimport { 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の型を追加できる
これによって、②-2の hoge
は number
に推論される
これが必要な理由は、そもそもquery paramsというものがstringしか受け付けないという仕様だから。
でも、この制限も突破できる
型の部分が追加されただけで、他の箇所は元のExpressとさほど変わりない
record | null
のようなqueryを表現する
例えば、日付の範囲指定をするqueryを作る時
tsexport 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
ともに指定している
両方指定していない
片方のみは許容しない

t.union([DateRange, t.unknown])
のように書けばいい
普通に考えたら t.null
や t.undefined
だけどvalidation errorになる
例
tsconst 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
);
複数ある時は、まとめて作れる
tsimport { 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