jquery - TypeScript nu permite comparația între .data() și numere/string


Datorită naturii puternic tipizate a TypeScript, se pare că există probleme atunci când se compară rezultatul unui apel jQuery .data() cu un tip simplu, precum un număr sau un șir de caractere.

De exemplu:

var dataValue = $("#myDiv").data("div-index");

if(dataValue === 0)
{
    alert("first item");
}

Ceea ce este de mai sus va genera o eroare de tipul Operatorul '===' nu poate fi aplicat tipurilor 'JQuery' și 'number'.

TypeScript vede rezultatul lui .data() ca tipul JQuery și, prin urmare, evaluările între acesta, așa cum era de așteptat cu un tip complex, nu sunt posibile.

Singura soluție de evitare până acum este să apelăm .toString() la sfârșitul apelului .data(), totuși aceasta înseamnă modificarea tuturor apelurilor actuale .data() și a comparațiilor lor. Aceasta face de asemenea imposibilă comparația numerică, precum >, deoarece nu putem compara un șir de caractere cu un număr.

Această problemă pare să apară doar după actualizarea la TypeScript 1.6.

Răspuns #1

Se pare că este un bug. Tocmai am revizuit fișierul jQuery.d.ts și am găsit tipul tău de returnare, dar pentru o altă suprasarcină a metodei.

Soluție

Doar încearcă să adaugi <any> deasupra apelului metodei tale:

var dataValue = <any>$("#myDiv").data("div-index");

if(dataValue === 0)
{
    alert("first item");
}

și acest caz ar funcționa pentru tine

Caz suplimentar

De asemenea, poți raporta această problemă pe firul oficial de probleme TypeScript și pe firul de probleme DefinitelyTyped

Răspunsul #2

Actualizează la cea mai recentă versiune a jquery.d.ts. Am observat și eu acest lucru. A existat un bug care făcea să folosească data(obj: { [key: string]: any; }): JQuery; în loc de .data(key: string): any. A fost reparat în acest commit.

Odată ce faci upgrade și tipul de returnare al data(key: string) este any, poți să-i spui compilatorului că știi că va fi un număr folosind o aserțiune de tip:

var dataValue = $("#myDiv").data("div-index") as number;

if (dataValue === 0)
{
    alert("first item");
}