Správny spôsob deklarovania definícií TypeScriptu pre window


Snažím sa definovať nové typy v objekte window, ako napríklad webkitAudioContext. Vytvoril som samostatný súbor nazvaný window.d.ts a do neho som pridal nasledujúci kód,

interface Window {
    AudioContext: Constructable;
    webkitAudioContext: Constructable;
}

interface Constructable {
    new();
}

Z iného modulu importujem definčný súbor nasledovne,

/// <reference path="./window.d.ts" />

let contextClass = window.AudioContext || window.webkitAudioContext;
let context = new contextClass();

Vyššie uvedené dva riadky fungujú úplne dobre.

Ak zmením súbor definície takto,

declare module window {
   export interface Window {
        AudioContext: Constructable;
        webkitAudioContext: Constructable;
    }

    interface Constructable {
        new();
    }
}

Tak to nefunguje. Aký je správny spôsob, ako definovať definície pre okno?

Odpoveď č. 1

Už existujú komunitou napísané definície pre AudioContext a webkitAudioContext tu. Ak s @types nie ste oboznámení, môžete si o tom prečítať viac tu, stručne - obsahuje veľa definícií pre veľa knižníc (môžete dokonca použiť JQueryPromise ako typ).
Tiež je dobrou praxou vytvoriť súbor global.d.ts s vašimi vlastnými definíciami, ktorý bude obsahovať kód ako tento:

declare var myCustomLib: any;

Potom by ste mali pridať global.d.ts do tsconfig.json, aby kompilátor bol informovaný o vašich definíciách:

{
  "compilerOptions": {
    "module": "commonjs",
    "target": "es5",
    "outDir": "./build"
  },
  "exclude": ["node_modules"],
  "files": ["./src/globals"]
}

A ak čelíte situáciám, keď sa snažíte pristupovať k zastaraným funkciám, môžete k nim pristúpiť pomocou konštrukcie (... as any), takto:

let Ctx = window.AudioContext || (window as any).webkitAudioContext;

Dúfam, že niektoré z týchto techník vám pomôžu.