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 Adeclare var myPoint: { x: number; y: number; };// Sample Binterface 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.tsinterface Point {x: number; y: number;}declare var myPoint: Point;// Lib b.d.tsinterface Point {z: number;}// Your codevar 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 };}}// Becauseconst 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.