デバッグ目的で変数dbを露出させたくてwindow.db = db;
したら「windowはそんなプロパティ持ってないよ」と言われる。
Quick Fixでdeclareできそうだったのでやってみたらlib.dom.d.tsの中のinterface Windowの定義に db : any が追加された。これは絶対に後で戻すのを忘れるのでいやだ。
TypeScriptにおいて宣言はだいたいマージされる。だから直接編集しなくてもこれで良い:
typescript
declare global {
interface Window { db: any; }
}
window.db = db;
このglobalははModule Augmentationの一種、Global augmentationだ。see Declaration Merging · TypeScript
typescript
declare module "./modulename" {
interface Foo { Bar: Baz; }
}
「この宣言が書かれているモジュールで新しいWindowを定義するんじゃなくて、グローバルのWindowに対してマージせよ」という意味でglobalがついている。