$shibayu36->blog;

株式会社はてなでエンジニアをしています。プログラミングや読書のことなどについて書いています。

TypeScript 3.7.2でjsonをimportした際に、json構造によっては二度目の代入が型エラーになるバグを踏んだ

表題のとおり。TypeScript 3.8.0-dev.20191126では直っていたので、3.8.0が来るまで気長に待ちましょう。

再現コードはこちら。

https://github.com/shibayu36/typescript-json-module-bug/blob/master/test.ts

import data from "./data.json";
type Data = {
  a: string;
  array: {
    hoge: number;
  }[];
};

const d1: Data = data;
const d2: Data = data; // type check error ocurred

const copiedData = data;
const d3: Data = copiedData; // type check error didn't occur

const data2 = {
  a: "b",
  c: "d",
  array: [{ hoge: 1 }, { hoge: 2, foo: "bar" }]
};

const d4: Data = data2;
const d5: Data = data2; // type check error didn't occur

https://github.com/shibayu36/typescript-json-module-bug/blob/master/data.json

{
  "a": "b",
  "c": "d",
  "array": [{ "hoge": 1 }, { "hoge": 2, "foo": "bar" }]
}
  • jsonにobjectのarrayが含まれていて、かつobjectのarray中に余分なフィールドが含まれている時(上記の例ならfooフィールド)、importした構造を一度目に代入する時は成功するのに、二度目に代入する時は型エラーが発生する
    • d1とd2への代入
  • しかし、dataを一度別の変数に代入すると、同じ型の変数にも代入が成功する
    • d3への代入
  • importではなく普通にobjectを作成した時(data2)、それは何回代入しても型チェックは通る