📝Requestの組み立てとResponseの解析を分離
現状の fetch
を注入する形式だと、汎用性が低い
データを取得できなかったときに処理を中断する、などの操作ができない
Requestの組み立てとResponseの解析を分離させる必要がある?
実装方法
今の実装と矛盾しない形にしたい
toRequest
や fromResponse
のような函数を直接exportすることはできない
名前が重複する
上手いこと階層化する必要がある
各函数に、 Request
を作る函数と Response
からデータを取り出す函数を生やしてみる?
採用
イメージ.jsconst req = getPage.makeRequest(project, title);
const res = await fetch(req);
const result = getPage.formatResponse(res);
2022-12-24
getPage
listPages
getProject
listProjects
2022-12-23
17:43:36 もっと簡単にできた
16:50:57 これで解決した
GetPage
の無名関数のJSDocは deno doc
で表示されない
getPage
にJSDocをつけないと、 getPage
自体には何も説明が表示されない
GetPage
と説明が重複してしまうけど、 getPage
にも説明つけたほうがいいかも
ts
/** 指定したページのJSONデータを取得する
*
* @param project 取得したいページのproject名
* @param title 取得したいページのtitle 大文字小文字は問わない
* @param options オプション
*/
export interface GetPage {
/** /api/pages/:project/:title の要求を組み立てる
*
* @param project 取得したいページのproject名
* @param title 取得したいページのtitle 大文字小文字は問わない
* @param options オプション
* @return request
*/
toRequest: (
project: string,
title: string,
options?: GetPageOption,
) => Request;
(project: string, title: string, options?: GetPageOption): Promise<
Result<
Page,
NotFoundError | NotLoggedInError | NotMemberError
>
>;
/** 帰ってきた応答からページのJSONデータを取得する
*
* @param res 応答
* @return ページのJSONデータ
*/
fromResponse: (res: Response) => Promise<
Result<
Page,
NotFoundError | NotLoggedInError | NotMemberError
>
>;
}
const getPage_ = async (
project: string,
title: string,
options?: GetPageOption,
) => {
const { fetch } = setDefaults(options ?? {});
const req = toRequest(project, title, options);
const res = await fetch(req);
return await fromResponse(res);
};
getPage_.toRequest = toRequest;
getPage_.fromResponse = fromResponse;
export const getPage: GetPage = getPage_;
16:46:04 実装も型推論つきの型定義も問題ないのだが、 deno doc
で追加した函数の型をうまく表示できない