Ошибка компиляции TypeScript - свойство не существует для типа

Даниэль, удивительное объяснение! Несколько слов по этому и хорошему списку указателя контекста выполнения 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)">
1
задан Jamie Sykes 3 March 2019 в 21:26
поделиться

1 ответ

Просто интересно, может кто-нибудь объяснить, почему возникает первая проблема с использованием импорта и как обе эти проблемы могут быть решены одновременно?

Первая проблема возникает из-за того, что модуль collectionsjs не имеет файла объявления TypeScript. В результате компилятор TypeScript не имеет никакой информации о типе Collection. Несмотря на то, что во время выполнения Collection будет иметь определенный интерфейс, для компилятора тип Collection несколько 1 эквивалентен этому:

const Collection: any = {};

Способ решения проблем состоит в том, чтобы добавить объявление типа для модуля collectionsjs и создать тип, который описывает, что этот пакет экспортирует.

Вот начало этого файла объявления типа:

collectionjs.d.ts

declare module 'collectionsjs' {
    export default class Collection {
        add(item);
        all();
    }
}

Чтобы завершить работу, добавьте каждый из публичные члены из Collection класса .


  1. Это только «в некоторой степени» эквивалентно типу any, потому что, хотя мы можем extend Collection, мы не можем extend типа any.
0
ответ дан Shaun Luttin 3 March 2019 в 21:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: