Однак принадність Sample B полягає в тому, що якщо хтось створює бібліотеку, яка будується на бібліотеці myPoint для додавання нових учасників, вони можуть легко додати до існуючої декларації myPoint:
Це тому, що interfaces in TypeScript are open ended. Це життєво важливий принцип TypeScript, який дозволяє вам імітувати розширюваність JavaScript за допомогою interfaces.
Classes can implement interfaces
Якщо ви хочете використовувати classes які повинні відповідати структурі об’єкта, яку хтось оголосив для вас в interface ви можете використати ключове слово implements для забезпечення сумісності:
По суті, за наявності цих implements, будь-які зміни в цьому зовнішньому інтерфейсі Point призведуть до помилки компіляції у вашій кодовій базі, тому ви можете легко підтримувати його в синхронізації:
Зауважте, що implements обмежує структуру instances класу, тобто:
І такі речі, як foo: Point = MyPoint, це не те саме.
TIPs
Not every interface is implementable easily
Інтерфейси призначені для оголошення any arbitrarily crazy структури, яка може бути присутня в JavaScript
Розглянемо наступний інтерфейс, де щось можна викликати за допомогою new:
По суті, у вас буде щось на зразок:
Ви можете декларувати всі божевільні JS з інтерфейсами та навіть безпечно використовувати їх із TypeScript. Це не означає, що ви можете використовувати класи TypeScript для їх реалізації.
interface Point {
x: number; y: number;
}
class MyPoint implements Point {
x: number; y: number; // Same as Point
}
interface Point {
x: number; y: number;
z: number; // New member
}
class MyPoint implements Point { // ERROR : missing member `z`
x: number; y: number;
}
var foo: Point = new MyPoint();
interface Crazy {
new (): {
hello: number
};
}
class CrazyClass implements Crazy {
constructor() {
return { hello: 123 };
}
}
// Because
const crazy = new CrazyClass(); // crazy would be {hello:123}