typera
これらを型付けできる
path params
query params
body
header
例
code: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の型を追加できる
これによって、②-2のhogeはnumberに推論される
これが必要な理由は、そもそもquery paramsというものがstringしか受け付けないという仕様だから。
でも、この制限も突破できる
型の部分が追加されただけで、他の箇所は元のExpressとさほど変わりない
record | nullのようなqueryを表現する
例えば、日付の範囲指定をするqueryを作る時
code: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.icon
t.union([DateRange, t.unknown])のように書けばいい
普通に考えたらt.nullやt.undefinedだけどvalidation errorになる
例
code:ts
const getPostsCount: Get<{ count: number }> = route
.get('/posts/count')
.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
);
複数ある時は、まとめて作れる
code: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