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.
