Er det mulig å modellere jQuery.fn.extend ved hjelp av TypeScript
Mitt gjetning er at svaret på dette er «nei», men jeg ville sjekke at det ikke var noe jeg hadde gått glipp av.
jQuery har en fn.extend-metode som lar deg utvide jQuery-objektet med ekstra metoder. Her er et eksempel fra API-dokumentasjonen:
jQuery.fn.extend({
check: function() {
return this.each(function() {
this.checked = true;
});
},
uncheck: function() {
return this.each(function() {
this.checked = false;
});
}
});
// Use the newly created .check() method
$( "input[type='checkbox']" ).check();
Jeg har fylt ut jQuery JSDoc og tester for DefinitelyTyped-prosjektet. Tidligere var jQuery.fn definert som any. For å bringe det i samsvar med dokumentasjonen har jeg sett på å endre det for å dekke extend-metoden:
fn: {
/**
* Merge the contents of an object onto the jQuery prototype to provide new jQuery instance methods.
*
* @param object An object to merge onto the jQuery prototype.
*/
extend(object: any): any;
}
Jeg tror imidlertid ikke det finnes en måte i TypeScript å modellere dynamisk i stedet for statisk utvidelse av metoder. Dette betyr at det ikke er mulig å etterfølgende bruke disse dynamisk utvidede metodene i din TS med mindre du enten:
- kast jQuery til
anyeller - bruk hakeparentesnotasjon som
$ ("input[type='checkbox']")["check"]();
Så mitt spørsmål: er det noe jeg har gått glipp av? Finnes det en bedre måte å modellere jQuery.fn på slik at TypeScript kan fange opp at jQueryStatic får tildelt disse dynamiske metodene? Som jeg sier, jeg tror svaret er «nei», men jeg ville være sikker.
Svar #1
Det er et definitivt nei.
Det ville vært fint å kunne kjøre kode i kompilatoren inne i definisjonen, men slik syntaks finnes ikke. Dette er hva jeg ønsker at det hadde:
interface Foo{
bar(member:any):any @ execute { // execute this code inside the compiler language service:
var keys = compiler.getArgs().keys();
compiler.getIdentifier('JQueryStatic').addMembers /// you get the point.
}
}
Men det har potensial til å gjøre kompileringen treg, og ville være full av kanttilfeller, for ikke å nevne at det er mer arbeid som antagelig ikke er på bordet.
