📝Requestの組み立てとResponseの解析を分離
現状のfetchを注入する形式だと、汎用性が低い
データを取得できなかったときに処理を中断する、などの操作ができない
Requestの組み立てとResponseの解析を分離させる必要がある?
実装方法
今の実装と矛盾しない形にしたい
toRequestやfromResponseのような函数を直接exportすることはできない
名前が重複する
上手いこと階層化する必要がある
各函数に、Requestを作る函数とResponseからデータを取り出す函数を生やしてみる?
採用takker.icon
code:イメージ.js
const 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にも説明つけたほうがいいかも
code: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で追加した函数の型をうまく表示できない