2015-06-09 19 views

Antwort

113

Wie in den documentation angegeben verwenden, 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); 

Playground link.

32

Leider gibt es nichts Vergleichbares in Typoskript (mehr Details hier: https://github.com/Microsoft/TypeScript/issues/467)

Aber, dies zu umgehen Sie Ihre params ändern können eine Schnittstelle sein:

export interface IErrorParams { 
    message: string; 
    title?: string; 
    autoHideAfter?: number; 
} 

export interface INotificationService { 
    error(params: IErrorParams); 
} 

//then to call it: 
error({message: 'msg', autoHideAfter: 42}); 
+0

Brocco, THX für die kreative Idee mit optionalen Eigenschaften. Ich denke, wir verlieren mehr als wir gewinnen: jetzt ist es _mandatory_, um die "Parameter" zu nennen, wie die Nachricht: 'msg'. Wenn wir mehr obligatorische Parameter haben, ist das eine große Auswirkung. Auch thx für den entsprechenden Link zum Thema 467. und naja ... es ist 42. –

+0

Kein Problem, worauf es hinausläuft ist, dass es mehr als eine Möglichkeit gibt, eine Katze zu häuten. Es ist nur eine Frage der Auswahl der Lösung, die am besten für Sie und Ihr Team funktioniert. – Brocco

+1

Ich komplizierte Parameter (jQuery Ajax zum Beispiel) das ist eine fantastische Lösung! –

4

Sie mehrere Methodensignaturen auf der Schnittstelle angeben können dann mehrere Verfahren Überlastungen auf der Klassenmethode:

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 = <string> param1; 
     } 
     else if (param1 != null) { 
      if (typeof param1 === "string") { 
       title = param1; 
      } 
      else { 
       autoHideAfter = param1; 
      } 
     } 

     // use message, autoHideAfter, and title here 
    } 
} 

Und dies alles funktioniert:

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); 

... und die error Methode von INotificationService wird die folgenden Optionen haben:

Overload intellisense

Playground

+4

Nur eine Anmerkung, die ich dagegen empfehlen würde und stattdessen ein Objekt übergeben und diese Parameter als Eigenschaften auf dieses Objekt setzen ... es ist viel weniger Arbeit und der Code wird besser lesbar sein. –

5

Dies ist fast die gleiche wie @Brocco ‚s Antwort, aber mit einer leichten Drehung: nur optionale Parameter in einem Objekt übergeben. (Und auch params -Objekt optional).

Es endet irgendwie wie Pythons ** Kwargs, aber nicht genau.

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:'); 
0

Sie können ohne Schnittstelle dies tun.

Verwenden Sie den Operator ? als optionalen Parameter.

+0

aber dies erlaubt Ihnen keine Möglichkeit, "Nachricht" und "AutoHideAfter" –

+0

zu spezifizieren Sie beantworten die Frage nicht oder Sie haben es nicht gelesen. Er möchte wissen, wie man eine Methode mit mehreren optionalen Parametern aufruft, ohne das erste optionale angeben zu müssen, wenn er nur das zweite eingeben möchte. – Gregfr

13

können Sie optionale Variable von ? oder wenn Sie durch ... mehrere optionale Variable haben, Beispiel:

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

In der oben:

  • name erforderlich ist
  • country erforderlich ist und hat einen Standardwert
  • address ist optional
  • hobbies ein Array von optionalem params ist
+1

Dies sollte die ausgewählte Antwort sein. Der optionale rest-Parameter ist äußerst nützlich, um abstrakte Basisklassenmethoden zu definieren, die erweitert werden sollen. –