2016-09-29 3 views
1

Wirklich neu in TypeScript. Ich habe eine Reihe von Voreinstellungen, die der Benutzer hinzufügen oder ändern kann. Da es nur ein paar Tasten hat, habe ich eine Schnittstelle erstellt.Akzeptieren Array von Schnittstellen ODER einzelne Schnittstelle in TypeScript

interface IStylePreset { 
    type : string; 
    backgroundColor : string; 
    color? : string 
} 

Und die Umsetzung ist hier:

static stylePresets : Array<IStylePreset> = [ 
    { type: "default", backgroundColor: "#37474f" , color: "#ECEFF1"}, 
    { type: "success", backgroundColor: "#37474f", color: "#ECEFF1" }, 
    { type: "error", backgroundColor: "#d32f2f", color: "#EEE"} 
]; 

Jetzt habe ich eine Config-Funktion, die eine benutzerdefinierte Vorgabe nimmt entweder vorhandene Voreinstellungen ändern oder neue hinzufügen.

static config = { 
    types(newPresets) : void { 
     newPresets = [].concat(newPresets); 
     for(var i = 0, len = newPresets.length, current; i< len; i++){ 
      var pos = Message.Util.find(Message.stylePresets, newPresets[i].type) 
      current = newPresets[i]; 
      if(pos !== -1) for(var key in current) Message.stylePresets[pos][key] = current[key]; 
      else Message.stylePresets[Message.stylePresets.length] = current; 
      } 
     } 
    }; 

Das Problem ist, kann ich nicht herausfinden, was in der Art der newPresets zu spezifizieren, da es sowohl eine Reihe von Objekten und auch als ein einziges Objekt zu akzeptieren (die zu einer einzigen Elementanordnung macht newPresets = [].concat(newPresets);) .

Ich versuche, TypeScript zu lernen, und ich weiß nicht, ob das, was ich mache, richtig ist. Kann mir bitte jemand hier helfen? Weiterführende Literatur oder Dokumente wären Gold.

+0

Es wurde darauf hingewiesen, dass die Frage ein Duplikat ist so bin ich Ich stimme es ab. –

Antwort

1

Verwenden Sie ein TypeScript union type: IStylePreset | IStylePreset[].

Im Funktionskörper können Sie mit Array.isArray() überprüfen, ob ein Array oder eine einzelne Instanz übergeben wurde. Eigentlich in diesem Fall nicht concat() bereits intern prüfen, ob ein Array oder eine Instanz verknüpft ist, so dass die Lösung einfach:

ZB:

class Config { 
    private presets: IStylePreset[] = []; 

    public addPresets(presetOrArray: IStylePreset | IStylePreset[]) { 
     // Concat will concat either Array or instance 
     this.presets = this.presets.concat(presetOrArray); 
    } 

    public getPresets(): IStylePreset[] { 
     return this.presets; 
    } 
} 

let config = new Config(); 
config.addPresets(stylePresets); 
config.addPresets(stylePresets[0]); 
console.log(config.getPresets().length); // prints 4 
+0

Danke! Ich dachte eigentlich über die gleichen Zeilen nach .. Aber ich versuche, isArray zu vermeiden, wenn ich [] .concat gehen kann. Es ist 43% schneller auf Chrom plus wir bleiben trocken, weil der Code in beiden if und anderen bis auf ein paar Änderungen identisch ist. Können Sie bitte bestätigen, ob Typen (newPresets: IStylePreset | Array ) funktionieren? Der Compiler sagt, es ist sauber, aber ich bin immer noch nicht sicher, ob es richtig ist oder nicht .. Versucht, die Dokumente zu suchen, kann es aber nicht finden .. –

+0

Ja, IStylePreset [] und Array sind nur zwei verschiedene Notationen für die gleichen Ding. Guter Punkt in Bezug auf concat. Es ist tatsächlich effizienter als eine Vor-Each-Schleife. Ich habe das obige Beispiel entsprechend modifiziert. Sie benötigen weiterhin isArray, um zu überprüfen, ob ein Array oder eine einzelne Instanz übergeben wurde. – Jens

+0

Wenn eine einzelne Instanz übergeben wird, wird concat es in ein Array machen. Wenn ein Array übergeben wird, führt [] .concat zu keinen Änderungen. + 1 die Antwort.Wird es nach einer Weile akzeptieren, um zu sehen, ob es bessere Leistungslösungen dafür gibt. Danke, Mann! –

1

Sie könnte entweder:

1) verwenden, um die any Typ wie folgt aus: types(newPresets : any)

oder

2) halten den IStylePreset[] Typ (zB types(newPresets : IStylePreset[]) und wenn nur ein einzelnes Objekt vorbei wickeln Sie es in Ein Array wie dieses: config.types([{ type: "default", backgroundColor: "#37474f" , color: "#ECEFF1"}]);

+0

Danke. Ich versuche es zu vermeiden. Ich denke, dass ich möglicherweise eine alternative Lösung gefunden habe, indem ich Typen verwendet habe (newPresets: IStylePreset | Array ): void {... Der Compiler sagt, es ist sauber, aber ich weiß nicht, ob das stimmt .. Können Sie bestätigen es? –

+1

Das klingt aus Sicht der Methodensignatur gut. Außerdem habe ich gerade gesehen, dass deine Frage hier schon beantwortet ist: http://stackoverflow.com/questions/35749833/typescript-function-taking-one-or-of-objects – user2846469

+0

Habe es einfach gesehen. Vielen Dank! –

Verwandte Themen