不慣れによる失敗、配列の宣言

まだTypeScriptが手に馴染むには書いた量が少なく、日々失敗が多い。

type Book = { title: string, vols: [string] };
type BooksPayload = { books: [Book] }; // 正解は、= { books: Book[ ] };

こんなコードを書いていた。意図としてはBookの配列をActionのpayloadに搭載したいために書いてるのだけど、その型宣言を[Book]と書いていました。また、Book.volsの[string]も間違いです。ここの正解はbooks: Book[ ](およびvols: string[ ])と書くこと。間違ったままだとこれは「一つだけBook型の要素を持つTuple型」の表記になっています。恐ろしいことに大概のケースでトランスパイルもできてしまうのですが、引っかかるのは以下の場合。

const books: Books = []; // エラー。never[]と[Book]は型が違うと怒られる

空の配列が代入できない。また、複数の要素を持っても当然NG。Flowの時にTupleがあるんだなーと流し見してたけどTypeScriptにもTupleがあるとは。Tupleは(もう何年も書いてないけど)Swiftを書くとAPIの戻値で頻出だった記憶がある。

再発防止策

配列の型宣言を、string[ ]とかとせずに、Arrayと徹底したほうが良いのかな?しかしtslint-config-airbnbが配列リテラルで書けって怒る。