Даниэль, удивительное объяснение! Несколько слов по этому и хорошему списку указателя контекста выполнения this
в случае обработчиков событий.
В двух словах this
в JavaScript указывает объект, у которого (или из контекста выполнения которого) текущая функция была запущена, и она всегда доступна только для чтения, вы все равно не можете ее установить (такая попытка закончится сообщением «Недопустимая левая сторона в присваивании».
Для обработчиков событий: встроенный обработчики событий, такие как <element onclick="foo">
, переопределяют любые другие обработчики, прикрепленные ранее и раньше, поэтому будьте осторожны, и лучше не вмешиваться в встроенное делегирование событий. И благодаря Заре Алавердян, которая вдохновила меня на этот список примеров через несогласие обсуждение:)
el.onclick = foo; // in the foo - obj
el.onclick = function () {this.style.color = '#fff';} // obj
el.onclick = function() {doSomething();} // In the doSomething -
Window
el.addEventListener('click',foo,false) // in the foo - obj
el.attachEvent('onclick, function () { // this }') // window, all the
compliance to IE :)
<button onclick="this.style.color = '#fff';"> // obj
<button onclick="foo"> // In the foo - window, but you can <button
onclick="foo(this)">
Просто интересно, может кто-нибудь объяснить, почему возникает первая проблема с использованием импорта и как обе эти проблемы могут быть решены одновременно?
blockquote>Первая проблема возникает из-за того, что модуль
collectionsjs
не имеет файла объявления TypeScript. В результате компилятор TypeScript не имеет никакой информации о типеCollection
. Несмотря на то, что во время выполненияCollection
будет иметь определенный интерфейс, для компилятора типCollection
несколько 1 sup> эквивалентен этому:const Collection: any = {};
Способ решения проблем состоит в том, чтобы добавить объявление типа для модуля
collectionsjs
и создать тип, который описывает, что этот пакет экспортирует.Вот начало этого файла объявления типа:
collectionjs.d.ts
declare module 'collectionsjs' { export default class Collection { add(item); all(); } }
Чтобы завершить работу, добавьте каждый из публичные члены из
Collection
класса .
- Это только «в некоторой степени» эквивалентно типу
any
, потому что, хотя мы можемextend
Collection
, мы не можемextend
типаany
.