const el: HTMLElement = document.querySelector('.tip');
 el.onmouseout = function() {
    this.scrollLeft += 10;
 };

Сообщение об ошибке TS2339: scrollLeft не существует для типа GlobalEventHandlers. this просто указывает на el, почему неправильно?

Машинопись: 3.7.0, 3.5.2

0
ZhouYX 18 Окт 2019 в 05:28

1 ответ

Попробуйте этот код:

const el: HTMLElement | null = document.querySelector('.tip');
if (el) {
    el.onmouseout = () => { el.scrollLeft += 10;};
 }

Проблема в том, что все функции в JS могут вызываться с изменением контекста, например: el.onmouseout.call(newContext, arg1, arg2, ...) или el.onmouseout.apply(newContext, [arg1, arg2, ...]). Итак, что вы делаете, так это создаете функцию, а затем назначаете ее свойству el, поэтому эта функция ничего не знает о своем контексте, поэтому у вас есть ошибка. И когда вы измените this на конкретную константу, TS узнает ее тип и сможет ее обработать.

1
iamolegga 18 Окт 2019 в 10:42
Контекст очень ясен, и операция правильная. Ошибка только в том, что eslint считает контекст текущим классом.
 – 
ZhouYX
21 Окт 2019 в 05:14