typescript - Proprietăți într-un modul
Există o modalitate de a defini o proprietate într-un module TypeScript?
Niciunul dintre acestea nu se compilează:
module My {
// doesnt work
get Value(): number { return 42; }
// doesn't work either
get function Value(): number { return 42; }
// nope
function get Value(): number { return 42; }
}
Chiar acum sunt obligat să folosesc asta:
module My {
declare var Value: number;
Object.defineProperty(My, "Value", {
get: () => 42
});
}
A doua formulă mi se pare dezordonată și sugestiile din cod nu o tratează cu adevărat ca pe o proprietate doar în citire, ci ca pe o variabilă obișnuită.
Există vreo metodă standard de a defini proprietăți direct în module?
Răspuns #1
Nu, nu există o modalitate de a declara o proprietate pe un module în TypeScript folosind orice funcționalități documentate ale limbajului.
Poți să o faci prin mai multe tehnici ușor ocolite.
Un module poate extinde o class sau o function existentă. Așadar, am creat o clasă cu o proprietate static, și apoi am creat mai târziu un module care folosește același nume ca class.
class My
{
static get Value():Number {
return 42;
}
}
module My {
var works: boolean = true;
}
alert(My.Value);
Aceasta generează o ciudățenie în codul JavaScript generat pe care nu ai face-o manual (și care ar trebui eliminată de majoritatea optimizatorilor oricum)... va redeclara variabila My atunci când modulul este creat. Aceasta nu cauzează o problemă la rulare, deoarece variabila a fost deja ridicată în JavaScript și nu va intra în conflict cu prima utilizare.
Iată o altă opțiune:
module Global {
class Inner {
get Value():Number {
return 42;
}
}
export var My;
My = new Inner();
}
var My = Global.My;
alert(My.Value);
Deși prezintă un spațiu de nume suplimentar, îl poți manipula așa cum dorești și poți folosi clasa interioară sau o poți schimba după cum este necesar. În acest fel, variabila My este globală, exact așa cum ar fi fost ca un module.
Răspunsul #2
În loc să folosești cuvântul cheie module, ia în considerare folosirea export, ceea ce îți va permite să faci ceea ce vrei, tratând fișierul însuși ca un modul (așa funcționează atât CommonJS, cât și AMD).
// in My.ts
var My = {
get value() {
return 42;
}
};
export = My;
// in foo.ts
import My = require('My');
console.log(My.value);
Descriu acest lucru în detaliu mai mare într-un articol pe blog, Ghidul definitiv pentru TypeScript.
