2012-10-16 13 views
16

headjs esegue alcune cose di tipo JavaScript molto pazzo per la sua API. Ad esempio, per una funzione prende un numero arbitrario di stringhe (non un array di stringhe). A volte termina la stessa chiamata di funzione, ad esempio puoi opzionalmente terminarla con una funzione.File di dichiarazione TypeScript per la funzione con numero/tipo di argomenti variabile

head.js("scripturl1", "scripturl2",...,callback); 

È anche possibile (con la stessa facilità) effettuare le seguenti operazioni

head.js({scriptlabel:"scripturl1"},{scriptlabel2:"scripturl2"},...., callback); 

mia domanda è come diavolo facciamo a descrivere che in un file di dichiarazione? Sono tutte orecchie qui perché il mio passaggio attuale sembra completamente sbagliato.

+0

Ho inviato un [richiesta di funzionalità dattiloscritto] (https://github.com/Microsoft/TypeScript/issues/15190) per questo in quanto è un modello (moderatamente utile) che ho visto altrove. – AJP

risposta

30

Le specifiche del linguaggio TS si riferiscono ai parametri numero variabile/spread come "Parametri rest". Un esempio di interfaccia con una firma di funzione che accetta parametri di riposo:

interface IExample { 
    fn : (...args : any[]) => any; 
} 

var x : IExample = { 
    fn: function(...args : any[]) { 
     for (var i = 0, arg; arg = args[i]; i++) { 
      console.log(arg); 
     } 
    } 
} 

x.fn(1); 
x.fn(1, 2); 
x.fn("cat", "dog", "mouse"); 

Sfortunatamente, ci sono alcune limitazioni. Il "Rest Parameter" deve essere l'ultimo nella firma di una funzione, quindi non sarà possibile acquisire il tipo del parametro di callback poiché è dopo il parametro ripetuto.

Se non fosse stato, si sarebbe potuto fare qualcosa di simile:

var fn = function(cb: Function, ...args : string[]) { 
    ... 
} 
+0

ya dopo averlo iniziato con esso per un po 'sono arrivato alla stessa conclusione che hai fatto ... vorrei poter ho fatto un ... string: string [], callback:() => void ma ahimè no fortuna :-(..) Grazie per il post. –

+0

C'è in realtà una soluzione più pulita, che tecnicamente non è la risposta a questa domanda reale (quindi downvote se è necessario), ma più di una raccomandazione: basta mettere i parametri in un oggetto. come questo.... myFunc ("param1", "param2", {"varParam1": 4 "varParam2": 3}); Questo è in realtà un codice più leggibile e, se si desidera dichiarare un'interfaccia per l'oggetto Parametri, questo funziona in modo pulito con il codice precedente. Quindi tutto ciò che voglio dire, javascript è già così bello nel modo in cui gestisce gli oggetti REST, che non hai nemmeno bisogno di funzioni di argomenti variabili nella lingua, né TypeScrip –

+0

@ClayFerguson ... il pattern di riposo viene usato quando hai 1 su n valori (forse anche da 0 a n valore?) per passare alla funzione insieme ad altri parametri come un callback. Ad esempio: [drop (arg1, arg2, ..., argn, callback))] (https://github.com/hapijs/hapi/blob/master/API.md#servermethodname-method-options) – AJP

-3

La dichiarazione è semplicemente:

function foo() { //... 

gli argomenti della funzione parte di una dichiarazione di funzione in Javascript è solo consultivo. Quando si chiama una funzione Javascript consente di chiamare con meno del numero dichiarato di argomenti (argomenti non passati in default a undefined) o con più del numero dichiarato di argomenti.

Quando viene chiamata una funzione, viene creato uno arguments object. L'oggetto arguments è un po 'come un array (sebbene non sia un vero oggetto Array) che trattiene ogni argomento passato in argomento.

Così, per esempio, per gestire infiniti argomenti si può semplicemente fare:

function foo() { 
    for (var n=0; n<arguments.length; n++) { 
    alert(arguments[n]); 
    } 
} 

Così ora si può chiamare foo come:

foo(1,2,3); 
foo(1,2,3,4,5,6,7,8); 

Oltre a ciò, è semplicemente una questione di usare typeof, itstanceof ecc. Per rilevare il tipo di argomento passato e elaborarli di conseguenza.

+0

Capisco il javascript dietro questo, ma la vera domanda era specifica per TypeScript ... Ma grazie per il post :-) –

Problemi correlati