Open3
snippet

パンくずリスト
ul
派と ol
派がいる。順序があるから ol
現在のパスには、aria-current
を付与。これもpage
派とlocation
派がいる。
<nav aria-label="breadcrumbs">
<ol>
<li>
<a href="/">home</a>
</li>
<li aria-current="location">
<a href="test">test</a>
</li>
</ol>
</nav>

一度呼び出したメソッドを呼び出せなくする型。
type Expand<T> = T extends infer U ? { [K in keyof U]: U[K] } : never;
type Consumable<Methods extends { [key: string]: Function }> = {
[P in keyof Methods]: (
...value: Parameters<Methods[P]>
) => Consumable<Expand<Omit<Methods, P>>>;
};
const obj = {} as Consumable<{ a: () => void; b: () => void }>;
obj.a().b(); // 以降 a も b も呼び出せない。

papaparse
をサーバーサイドで呼ぶ際は、File
をReadable
に変換して渡す。
complete()
が非同期で実行されるため、パース結果が得られていないうちに後続処理が走り、不便。
確実に使うためにPromise
でラップして終わるのを待つ。
async function parseAsync<T>(file: File, config: ParseLocalConfig<T, File>) {
const arrayBuffer = await file.arrayBuffer();
const buffer = Buffer.from(arrayBuffer);
const stream = Readable.from(buffer);
return new Promise((resolve, reject) => {
Papa.parse(stream, {
...config,
complete: (results) => {
resolve(config.complete?.(results, file));
},
error: (error) => {
reject(config.error?.(error, file));
},
});
});
}