piątek, 21 czerwca 2013

TypeScript 0.9 (3)

Kilka uwag po “zeskanowaniu” najnowszej specyfikacji –;)

 

Funkcje generyczne

interface Comparable<T> { localeCompare(other: T): number; }
function compare<T extends Comparable<T>>(x: T, y: T): number { if (x == null) return y == null ? 0 : -1; if (y == null) return 1; return x.localeCompare(y); }

class Person { name: string; localeCompare(other: Person) { return compare(this.name, other.name); } }

Wywołanie funkcji generycznej - typ jest podawany jawnie lub - jeśli jest to możliwe - może być wnioskowany z typów argumentów przekazanych do funkcji (jak powyżej w funkcji compare)

 

Interfejsy rozszerzające klasy

Interfejs rozszerzający klasę dziedziczy po niej wszystkie elementy (także prywatne!), ale bez ich implementacji. Przy prywatnych elementach bazowej klasy interfejs może być implementowany przez tą klasę lub klasy, które po niej dziedziczą.

class Control { private state: any; }

interface SelectableControl extends Control { select(): void; }

Podtypem SelectableControl jest klasa Button:

class Button extends Control { select() { } }

ale nie są nimi klasy Image i Location:

class Image extends Control { }

class Location { select() { } }

 

Typy wyliczeniowe

Podtypy number. Definicji:

enum Color { Red, Green, Blue }

odpowiada zmienna Color typu:

var Color: { [x: number]: string; Red: Color; Green: Color; Blue: Color; };

Elementami enum mogą być stałe lub elementy wyliczane! Wyrażenia wyliczające mogą zwracać typy: any, number, enum.

enum Test { A, B, C = 10, D, E = Math.floor(Math.random() * 1000) }   // 0, 1, 10, wartość wyliczana

Wartości wyliczane mogą być referencjami na zadeklarowane już elementy:

enum Style { None = 0, Bold = 1, Italic = 2, Underline = 4, Emphasis = Style.Bold | Style.Italic, Hyperlink = Style.Bold | Style.Underline }

W przypadku wielu deklaracji w każdej z nich jest ustalany numer dla pierwszego elementu, nie ma kontynuowania numeracji.

Brak komentarzy: