2016-02-06 6 views
0

я нашел следующую ссылку: Does TypeScript support TouchEvent?Поддерживает ли TypeScript 1.7.6 поддержку dts lib для touchevents?

Она имеет дело с вопросом, что у меня возникли. Согласно сообщению в верхней части статьи, в нем указано, что TypeScript 1.5.3 добавляет объявления для событий HTML Touch в lib.d.ts.

Поддерживает ли эти версии сенсорных событий TypeScript 1.7.6? Я получаю ошибку в Visual Studio 2015, которая заявляет: свойство «changedTouches» не существует в типе «Событие».

Для чего это требуется lib.d.ts. Я попытался использовать NuGet для загрузки последней версии jquery.TypeScript.DefinitelyTyped = "2.8.8", но это не работает.

Любые предложения?

Update Я проверил, что файл JQuery d.ts от NuGet такой же, как и на https://github.com/DefinitelyTyped/DefinitelyTyped.

Код сниппета

$('#previewEvent').on('mousedown touchstart', function(e) { 
 
var original = e.originalEvent; 
 
if (original.changedTouches && CheckMobile.isTouch_p) { 
 
    const touchobj = original.changedTouches[0]; 
 
    swipedir = 'none'; 
 
    distX = 0; 
 
    distY = 0; 
 
    startX = touchobj.pageX; 
 
    startY = touchobj.pageY; 
 
    // record time when finger first makes contact with surface 
 
    startTime = new Date().getTime(); 
 
    return !0; 
 
} else if (!CheckMobile.isTouch_p) { 
 
    return !0; 
 
} 
 
return !0; 
 
});

Update Первоначально я думал, lib.d.ts упомянутые JQuery. Я ошибался, это одна из библиотек, которые установлены с помощью TypeScript.

Я обновил библиотеку, но все равно имею ту же ошибку. Файл lib.d.ts, похоже, имеет сенсорные определения, что является шагом в правильном направлении.

Эта проблема представляется несовместимой между интерфейсом jQuery BaseJQueryEventObject и интерфейсом TypeScript TouchEvent. Я еще не знаю, как решить проблему, но я могу устранить ошибку, объявив var original: any = e.originalEvent, который маскирует несовместимость.

Любые идеи о том, как правильно решить этот вопрос? Я предполагаю, что потребуется третий файл d.ts, чтобы сгладить интерфейсы.

Спасибо ...

ответ

1

В функции обработчика e имеет тип JQueryEventObject.

originalEvent исходит от BaseJQueryEventObject и относится к типу Event. Это Event, где мы вернемся к lib.d.ts. Пока все ясно.

Поскольку Event является базовым интерфейсом для многих производных типов событий (например, GamepadEvent, MutationEvent и так далее) он содержит только поля для общих данных во всех этих типов событий. Вот почему вы не можете получить доступ changedTouches, потому что в отношении компилятора TypeScript это не TouchEvent.

Я бы решил решить эту проблему с помощью функции, введенной в TypeScript 1.4 под названием type guards.

Общим шаблоном в JavaScript является использование typeof или instanceof для изучения типа выражения во время выполнения. TypeScript теперь понимает эти условия и соответственно изменяет вывод типа при использовании в блоке if.

Потому что вы задаете тот же обработчик для mousedown и touchstart событий, e.originalEvent может быть MouseEvent или TouchEvent.

Таким образом, вы должны обрабатывать эти два случая:

$("#previewEvent").on("mousedown touchstart", function(e) { 
    var original = e.originalEvent; 
    if(original instanceof TouchEvent) { 
     // Handling the touchstart event 
    } else if(original instanceof MouseEvent) { 
     // Handling the mousedown event 
    } 
}); 

Хорошая вещь, как цитата говорит, что вы получите надлежащую поддержку автодополнения в каждой отрасли, если заявление.

+0

Большое спасибо за ваш быстрый ответ. Это то, что я искал, но не знал этого! Ваша рецензия была ясной и имеет смысл. Я использовал instanceof раньше, но не связался с тем, как решить разницу типов, о которой TypeScript жаловался. Недавно я обновил TypeScript с 1.3.x до 1.7.6. Мне нужно сделать домашнюю работу, чтобы посмотреть, что еще добавлено. – Highdown

+0

У меня есть одна небольшая коррекция вашего предложения для других, у кого может быть такая же проблема. Первый, если блок генерирует исключение, когда TouchEvent НЕ определен, как это имеет место для настольного компьютера/ноутбука, который не поддерживает касание. В моем случае я изменил первый блок if, чтобы включить тест для касания, т. Е. (CheckMobile.isTouch_p && original instanceof TouchEvent), чтобы исключить исключение. – Highdown

Смежные вопросы