Come passare parametri facoltativi in ​​TypeScript mentre si omettono alcuni altri parametri facoltativi?

Data la seguente firma:

export interface INotificationService { error(message: string, title?: string, autoHideAfter?: number); } 

Come posso chiamare la funzione error () non specificando il parametro title, ma impostando autoHideAfter per dire 1000?

Come specificato nella documentazione , utilizzare undefined :

 export interface INotificationService { error(message: string, title?: string, autoHideAfter? : number); } class X { error(message: string, title?: string, autoHideAfter?: number) { console.log(message, title, autoHideAfter); } } new X().error("hi there", undefined, 1000); 

Collegamento al parco giochi

Sfortunatamente non c’è nulla di simile in TypeScript (maggiori dettagli qui: https://github.com/Microsoft/TypeScript/issues/467 )

Ma per aggirare questo è ansible modificare i parametri in modo che siano un’interfaccia:

 export interface IErrorParams { message: string; title?: string; autoHideAfter?: number; } export interface INotificationService { error(params: IErrorParams); } //then to call it: error({message: 'msg', autoHideAfter: 42}); 

puoi usare la variabile opzionale di ? o se hai più variabili opzionali di ... , esempio:

 function details(name: string, country="CA", address?: string, ...hobbies: string) { // ... } 

In quanto sopra:

  • name è obbligatorio
  • country è obbligatorio e ha un valore predefinito
  • address è facoltativo
  • hobbies sono una serie di parametri opzionali

Questo è quasi lo stesso della risposta di @Brocco, ma con una leggera svolta: passa solo i parametri opzionali in un object. (E anche rendere params object opzionale).

Finisce per essere un po ‘come i kwarg di Python **, ma non esattamente.

 export interface IErrorParams { title?: string; autoHideAfter?: number; } export interface INotificationService { // make params optional so you don't have to pass in an empty object // in the case that you don't want any extra params error(message: string, params?: IErrorParams); } // all of these will work as expected error('A message with some params but not others:', {autoHideAfter: 42}); error('Another message with some params but not others:', {title: 'StackOverflow'}); error('A message with all params:', {title: 'StackOverflow', autoHideAfter: 42}); error('A message with all params, in a different order:', {autoHideAfter: 42, title: 'StackOverflow'}); error('A message with no params at all:'); 

È ansible specificare più firme di metodo sull’interfaccia e quindi sovraccaricare più metodi sul metodo di class:

 interface INotificationService { error(message: string, title?: string, autoHideAfter?: number); error(message: string, autoHideAfter: number); } class MyNotificationService implements INotificationService { error(message: string, title?: string, autoHideAfter?: number); error(message: string, autoHideAfter?: number); error(message: string, param1?: (string|number), param2?: number) { var autoHideAfter: number, title: string; // example of mapping the parameters if (param2 != null) { autoHideAfter = param2; title =  param1; } else if (param1 != null) { if (typeof param1 === "string") { title = param1; } else { autoHideAfter = param1; } } // use message, autoHideAfter, and title here } } 

Ora tutti questi funzioneranno:

 var service: INotificationService = new MyNotificationService(); service.error("My message"); service.error("My message", 1000); service.error("My message", "My title"); service.error("My message", "My title", 1000); 

… e il metodo di error di INotificationService avrà le seguenti opzioni:

Sovraccarico intellisense

Terreno di gioco

Puoi farlo senza un’interfaccia.

 class myClass{ public error(message: string, title?: string, autoHideAfter? : number){ //.... } } 

usare il ? operatore come parametro opzionale.

potresti provare a impostare il titolo su null.

Questo ha funzionato per me.

errore (‘This is the’, null, 1000)