2016-04-23 26 views
1

Ich möchte meine super tolle Containerklasse erstellen, die einen einzigen Wert enthält.Kann ich eine Funktion in TypeScript erweitern?

let a = new Container(42); 

Ein Ich möchte Werte erhalten wie diese

a(); // 42 

und die eingestellten Werte wie diese

a(43); 

Gibt es eine Möglichkeit, dies in Typoskript zu erreichen?

+0

Klingt wie, welche Eigenschaften sind für. – Stilgar

Antwort

2

Operatorüberladung wird in JavaScript/TypeScript nicht ordnungsgemäß unterstützt. Sie können keine Funktionen (außer Konstruktoren) definieren, die aufgerufen werden, wenn Sie versuchen, eine Klasse aufzurufen.

+0

Es ist wahr, dass es keine echte Operation Überladung gibt, aber Sie können immer noch einige - sicher begrenzte - Dinge tun, die der Operation overloading ähnlich ist [hier ein Beispiel] (https://jsfiddle.net/gvo86g6c/). –

2

Gibt es eine Möglichkeit, dies in TypeScript zu erreichen?

Warum nicht. Weil es in einfachem JavaScript gemacht werden kann, sollte es auch in TypeScript leicht erreicht werden. Wie fast immer bei Funktionen, ist Scope das Schlüsselwort für unseren Ansatz. Ein Konstruktor wird dann natürlich nur als eine Schließung missbraucht, ohne Typen zu erzeugen, die z.B. Container über den Operator typeof. Eine solche Factory-Funktion gibt nur eine andere Funktion zurück, die dann als Getter/Setter für den eingeschlossenen Anfangswert des Konstruktors verwendet wird.

Typoskript Beispiel ...

class Container { 

    constructor(storageValue: any) { 
     return (function (value: any) { 

      if (arguments.length !== 0) { 
       storageValue = value; 
      } 
      return storageValue; 
     }); 
    } 
} 

... im Klar JavaScript ...

var Container = (function ContainerClass() { 

    var Constructor = (function Container (storageValue) { 
     return (function (value) { 

      if (arguments.length !== 0) { 
       storageValue = value; 
      } 
      return storageValue; 
     }); 
    }); 
    return Constructor; 

}()); 

var a = new Container(24); 

console.log("a() : ", a()); // 24 
console.log("a(4) : ", a(4)); // 4 
console.log("a() : ", a()); // 4 

var b = new Container(72); 

console.log("b() : ", b()); // 72 
console.log("b(5) : ", b(5)); // 5 
console.log("b() : ", b()); // 5 

console.log("a() : ", a()); // 4 
+1

Anstelle von 'if (UNDEFINED_VALUE! == value) {'könnte es besser sein,' arguments.length === 0' zu verwenden, weil 'a()' und 'a (undefined)' zwei verschiedene Dinge sind. –

+0

Sie haben offensichtlich recht. –

+0

Es ist nicht typsicher. Es macht keinen Sinn, TypeScript zu verwenden, wenn Sie 'any' überall platzieren. – Yaroslav

Verwandte Themen