Rozhraní

Rozhraní mají nulový dopad na běh JS. V rozhraních TypeScriptu je velká moc deklarovat strukturu proměnných.

Následující dvě deklarace jsou ekvivalentní, první používá inline anotaci, druhá rozhraní:

// Sample A
declare var myPoint: { x: number; y: number; };
// Sample B
interface Point {
x: number; y: number;
}
declare var myPoint: Point;

Krása ukázky B však spočívá v tom, že pokud někdo vytvoří knihovnu, která naváže na knihovnu myPoint a přidá do ní nové členy, může snadno doplnit stávající deklaraci myPoint:

// Lib a.d.ts
interface Point {
x: number; y: number;
}
declare var myPoint: Point;
// Lib b.d.ts
interface Point {
z: number;
}
// Your code
var myPoint.z; // Allowed!

To proto, že rozhraní v jazyce TypeScript jsou otevřená. To je zásadní princip jazyka TypeScript, který umožňuje napodobit rozšiřitelnost jazyka JavaScript pomocí rozhraní.

Třídy mohou implementovat rozhraní

Pokud chcete používat třídy, které musí dodržovat objektovou strukturu, kterou pro vás někdo deklaroval v interface, můžete použít klíčové slovo implements, abyste zajistili kompatibilitu:

interface Point {
x: number; y: number;
}
class MyPoint implements Point {
x: number; y: number; // Same as Point
}

Zásadně v přítomnosti tohoto implements povede jakákoli změna v tomto externím Point rozhraní k chybě při kompilaci ve vaší kódové základně, takže ji můžete snadno synchronizovat:

interface Point {
x: number; y: number;
z: number; // New member
}
class MyPoint implements Point { // ERROR : missing member `z`
x: number; y: number;
}

Všimněte si, že implements omezuje strukturu instancí tříd, tj.Tj.:

var foo: Point = new MyPoint();

A věci jako foo: Point = MyPoint nejsou totéž.

Ne každé rozhraní je snadno implementovatelné

Rozhraní jsou určena k deklaraci libovolně šílené struktury, která se může v JavaScriptu vyskytovat.

Považte následující rozhraní, kde je něco volatelné pomocí new:

interface Crazy {
new (): {
hello: number
};
}

V podstatě byste měli něco jako:

class CrazyClass implements Crazy {
constructor() {
return { hello: 123 };
}
}
// Because
const crazy = new CrazyClass(); // crazy would be {hello:123}

Všechny bláznivé JS můžete deklarovat pomocí rozhraní a dokonce je bezpečně používat z TypeScriptu. To ale neznamená, že k jejich implementaci můžete používat třídy v jazyce TypeScript.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.