Расширить сторонний интерфейс - PullRequest
0 голосов
/ 30 апреля 2018

В учебник Я читал, как расширить интерфейсы. Скажем, у меня есть сторонняя библиотека с некоторым интерфейсом. Учебник заявляет, что я могу просто определить другой интерфейс с точно таким же именем, и он расширит предыдущий:

// third-party source
interface jQueryElement {
    data(name: string): any;
    data(name: string, data: any): jQueryElement;
}

// my code
interface jQueryElement {
    todo(): Todo;
    todo(todo: Todo): void;
}

Хорошо, а как их импортировать? Не произошло бы столкновения имен?

Извините, я ничего не кодировал только в Typescript, только в Angular, поэтому мне интересно, можно ли использовать этот подход или единственный способ - определить другой интерфейс с помощью extends?:

interface jQueryElement2 extends jQueryElement {
    todo(): Todo;
    todo(todo: Todo): void;
}

1 Ответ

0 голосов
/ 30 апреля 2018

Вы можете расширить интерфейсы таким образом, когда они находятся в одной области видимости. JQuery файлы объявлений объявляют интерфейсы в глобальной области видимости, так что это не проблема.

Вы просто добавляете файл jquery-extension.d.ts в свой проект (имя не имеет значения), а затем снова объявляете интерфейс, добавляя нужные методы или свойства. Затем TypeScript подберет его и смешает два объявления типов в одном.

Конечно, объявление только методов заставит TypeScript думать, что они существуют. Вам все еще нужно определить их (в другом файле, а не в файле d.ts), иначе вы получите ошибку времени выполнения при попытке их выполнить.

Пример: jquery-extension.d.ts

interface JQueryStatic {
    count(): number;
}

jquery-extension.ts:

jQuery.fn.count = function() {
    return this.length;
}

Если вы просто добавите приведенный выше код без расширения интерфейса, TypeScript будет протестовать, заявив, что count не является известным свойством интерфейса JQueryStatic. Тогда вам просто нужно импортировать jquery-extension.ts в точку входа вашего приложения:

import 'jquery-extension'

И готово. Файл d.ts импортировать не нужно, поскольку они являются файлами объявлений окружения, и компилятор сам их забирает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...