Angular. Ferdinand Malcher

Чтение книги онлайн.

Читать онлайн книгу Angular - Ferdinand Malcher страница 22

Автор:
Серия:
Издательство:
Angular - Ferdinand Malcher

Скачать книгу

bietet uns hier ein hohes Maß an Flexibilität. Solche untypisierten Arrays können aber auch schnell zu ungewolltem Verhalten führen, denn es ist unüblich und aufwendig, die Typen der einzelnen Array-Elemente bei jeder Verwendung zu prüfen. Mit TypeScript können Arrays typisiert werden, sodass innerhalb des Arrays nur Elemente eines festgelegten Typs zulässig sind.

      const fibonacci: number[] = [0, 1, 1, 2, 3, 5, 8];

       Beliebige Werte mit any und unknown

      In JavaScript kann grundsätzlich jede Variable jeden Wert annehmen. Da TypeScript abwärtskompatibel zu JavaScript ist, wird auch dieses Verhalten abgebildet: Eine mit any oder unknown typisierte Variable kann immer beliebige Werte mit beliebigen Typen annehmen.

      let foo: any;

      let bar: unknown;

      foo = 5;

      bar = 5;

      foo = 'Hallo';

      bar = 'Hallo';

      Unsichere Typen mit any

      Diese beiden Basistypen any und unknown haben jedoch einen wichtigen Unterschied: Der Wert einer mit any typisierten Variable kann zu jeder anderen Variable zugewiesen werden. any wird übrigens auch immer als Standardtyp verwendet, wenn wir eine Variable nicht explizit typisieren und der Typ von TypeScript nicht automatisch ermittelt werden kann.

      const foo: any = 5;

      const result: string = foo; // Zuweisung ohne Fehler!

      let bar; // impliziter Typ "any"

      Der Typ any bildet also eine unsichere oder unklare Typisierung ab. Dieses Verhalten birgt Gefahren, denn die Typprüfung wird überlistet. Achten wir hier nicht genau darauf, welche Werte tatsächlich in der Variable stecken, kann es zu ungewolltem Verhalten zur Laufzeit kommen.

      Gewollt unbekannte Typen mit unknown

      Der Typ unknown schafft Abhilfe. Eine solche Variable kann ebenfalls beliebige Werte mit jedem Typen annehmen. Allerdings kann der Wert einer unknown-Variable nur dann einer anderen Variable zugewiesen werden, wenn diese auch den Typ unknown oder any trägt. Eine Zuweisung, wie wir sie im Listing 4.3 gemacht haben, ist nicht möglich. Um den Wert einer mit unknown typisierten Variable dennoch zuweisen zu können, müssen wir mithilfe von typeof eine Typprüfung vornehmen, die den konkreten Wert in Betracht zieht.

      const foo: unknown = 5;

      const a1: string = foo;

      // Type 'unknown' is not assignable to type 'string'.

      const a2: number = foo;

      // Type 'unknown' is not assignable to type 'number'.

      const a3: unknown = foo; // Zuweisung funktioniert!

      const a4: any = foo; // Zuweisung funktioniert!

      // Typprüfung nach dem Wert

      const a5: number = typeof foo === 'number' ? foo : 5;

      // Zuweisung funktioniert!

      Wenn ein Datentyp nicht genau bekannt ist, kann eine Variable also mithilfe von any oder unknown typisiert werden. Praktisch sollten Sie es aber vermeiden, any zu verwenden, denn dieser Typ ist fast immer ein Indiz dafür, dass Unklarheit über die Typisierung herrscht, die Sie beheben sollten. Wollen wir die konkrete Belegung einer Variable absichtlich im Unklaren lassen, ist unknown die bessere Wahl. Zum Beispiel sollten wir den Rückgabewert eines HTTP-Requests mit unknown typisieren, sodass wir im nachfolgenden Code weitere manuelle Typüberprüfungen vornehmen müssen, um die Werte zu verarbeiten.

       4.4Klassen

      Mit ECMAScript 2015 können in JavaScript auch Klassen definiert werden. In früheren Versionen von JavaScript war es üblich, mittels geschickter Entwurfsmuster oder ganzer Frameworks Klassen und Vererbung zu emulieren. Das Problem bestand darin, dass im gesamten Team über die exakte Verwendung Konsens herrschen musste. Um in einer modernen JavaScript-Umgebung eine Klasse zu beschreiben, müssen wir hingegen lediglich das Schlüsselwort class und einen Klassennamen angeben. Mit Klassen können einfache Datenobjekte oder auch komplexe objektorientierte Logik abgebildet werden.

      class User { }

      Listing 4–2 Deklaration einer Klasse

      Klassen besitzen drei wesentliche Bestandteile: Eigenschaften, Methoden und eine besondere Methode – den Konstruktor.

       Eigenschaften/Propertys

      Eigenschaften (engl. properties) erweitern eine Klasseninstanz mit zusätzlichen Informationen. Beispielsweise können wir die Klasse User durch die Eigenschaften firstname, lastname und id erweitern. Propertys können mit den Zugriffsmodifizierern public, private, static, protected oder readonly versehen werden. Lässt man die Angabe eines Zugriffsmodifizierers weg, so ist die Eigenschaft public. Üblicherweise verzichtet man auf das Schlüsselwort public, wenn man ein öffentliches Property deklarieren möchte.

      In TypeScript kann ein Property übrigens direkt bei der Deklaration auch initialisiert werden. Es ist außerdem nicht üblich, private Propertys mit einem Unterstrich zu beginnen.

      firstname: string; // public

       lastname: string;

       private age = 25;

      }

      Listing 4–3 Eigenschaften einer Klasse

       Typinferenz

      Das Property age haben wir sofort initialisiert und haben dabei auf einen konkreten Typen verzichtet. Wenn TypeScript den Typen automatisch anhand des Werts feststellen kann, spricht man von Typinferenz. In so einem Fall sollte man auf die Typangabe verzichten, weil der Typ bereits eindeutig bestimmt ist.

       Methoden

      Methoden sind die Funktionen einer Klasse und erweitern die Klasse mit Logik. Wir können die Methodensignatur präzisieren, indem wir Typen für die Argumente und den Rückgabewert angeben. Somit kann die Schnittstelle einer Klasse explizit festgelegt werden, und der Compiler kann die korrekte Verwendung sicherstellen.

      class User {

      // ...

      increaseAge(increaseBy: number): number {

      this.age

Скачать книгу