Typescript - знайомимося з typescript

Продукти та технології:

У статті розглядаються:

Наприклад, як і C #, TypeScript є мовою з типізований даними, що дає вам підтримку IntelliSense і перевірки при компіляції, не кажучи вже про інших засобах. Як і C #, TypeScript включає узагальнення і лямбда-вирази (або їх еквіваленти).

TypeScript - мова з типізацією даних

У цьому прикладі змінна оголошується як string:

Практично вся типізація даних в TypeScript не є обов'язковою.

Завдяки структурному породження підтипів я можу застосовувати CustomerDevient зі змінними, визначеними за допомогою мого класу CustomerShort або інтерфейсу ICustomerShort. У наступних прикладах CustomerDeviant використовується як взаємозамінні зі змінними, оголошеними як CustomerShort або ICustomerShort:

Спадкування в TypeScript працює по-іншому

Все це виглядає вам знайомим, якщо ви програміст на C #, за винятком деяких дивних ключових слів (на зразок extends). Але розширення класу або інтерфейсу - не зовсім те ж саме, що механізми успадкування в C #. У специфікації TypeScript використовуються звичайні терміни для розширюваного класу (базовий клас) і класу, що розширює його (похідний клас). Однак ця специфікація, наприклад, посилається на специфікацію успадкування класу замість вживання слова «успадкування».

Перш за все в TypeScript менше варіантів, ніж в C #, коли справа доходить до визначення базових класів. Ви не можете оголосити клас або члени як і підлягають перевантаженню, як абстрактні або віртуальні (хоча інтерфейси забезпечують багато в чому ту ж функціональність, що і віртуальні базові класи).

Немає ніякого способу запобігти успадкування від деяких членів. Похідний клас успадковує всі члени базового класу, включаючи відкриті і закриті члени (всі відкриті члени базового класу можуть бути перевантажені, а закриті - немає). Щоб перевизначити відкритий член, просто визначте член в похідному класі з тією ж сигнатурою. Хоча ви можете користуватися ключовим словом super для доступу до відкритого методу з похідного класу, це ключове слово не дозволяє звертатися до будь-якого властивості в базовому класі (але властивість можна перевизначити).

Мал. 5. Інтерфейс ICustomerMerge визначено через два визначення інтерфейсу

Класи можуть розширювати інші класи, але не інтерфейси. У TypeScript інтерфейси можуть розширювати і класи, але тільки таким способом, який використовує спадкування. Розширюючи клас, інтерфейс включає всі члени класу (відкриті і закриті), але без реалізацій в класі. На рис. 6 інтерфейс ICustomer отримає закритий член id, відкритий член Id і відкритий член MiddleName.

Мал. 6. Розширений клас з усіма членами

Інтерфейс ICustomer має істотне обмеження: ви можете використовувати його тільки з класами, що розширюють той же клас, який розширено інтерфейсом (в даному випадку це клас Customer). TypeScript вимагає, щоб ви включали закриті члени в інтерфейс, який повинен успадковуватися від класу, розширюється цим інтерфейсом, а не заново реалізували їх в похідному класі. Нового класу, котрі використовують інтерфейс ICustomer знадобилося б, наприклад, надати реалізацію для MiddleName (оскільки в інтерфейсі він лише вказано). Розробник, який використовує ICustomer, міг би вибрати або успадкування, або перевизначення відкритих методів класу Customer, але не зміг би перевизначити закритий член id.

Класи можуть розширювати інші класи точно так же, як в разі інтерфейсів.

У наступному прикладі показаний клас (з ім'ям NewCustomer), який реалізує інтерфейс ICustomer і розширює клас Customer так, як це потрібно. У цьому прикладі NewCustomer успадковує реалізацію Id від Customer і надає реалізацію для MiddleName:

TypeScript знає про ваші бібліотеках

«Читання документації», звичайно, має на увазі, що ви отримуєте підтримку IntelliSense по типізованим даними і перевірки етапу компіляції при використанні об'єктів, що утворюють бібліотеку. Крім того, це дозволяє TypeScript при певних обставинах логічно розпізнавати тип змінної по контексту, в якому вона застосовується. Завдяки файлу визначень lib.d.ts, включеному в TypeScript, ця мова передбачає, що змінна anchor має тип HTMLAnchorElement в наступному коді:

Файл визначень вказує, що це результат, що повертається методом createElement, коли йому передається рядок «a». Знаючи, що anchor - це HTMLAnchorElement, TypeScript знає, що змінна anchor буде підтримувати, наприклад, метод addEventListener.

Логічне розпізнавання типів даних в TypeScript також працює з типами параметрів. Наприклад, метод addEventListener приймає два параметри. Другий з них - це функція, через яку addEventListener передає об'єкт типу PointerEvent. TypeScript відомо це, і він підтримує доступ до властивості cancelBubble класу PointerEvent всередині функції:

Якщо вас цікавлять подробиці того, як використовувати TypeScript з Backbone і Knockout, почитайте статті в моїй рубриці «Practical TypeScript» за посиланням bit.ly/1BRh8NJ. У новому році я буду розглядати деталі застосування TypeScript з Angular.

Пітер Вогел (Peter Vogel) - один з керівників PHV Information Services, спеціалізується в веб-розробці, експерт по SOA, розробці клієнтського ПЗ і дизайну UI. У число клієнтів PHV входять Canadian Imperial Bank of Commerce, Volvo і Microsoft. Він також займається навчанням і пише навчальні курси для Learning Tree International. Веде рубрику Practical .NET на сайті VisualStudioMagazine.com.

Висловлюю подяку за рецензування статті експерту Microsoft Райен Кевено (Ryan Cavanaugh).

Схожі статті