我找到了以下链接: Does TypeScript support TouchEvent?
它涉及我遇到的问题。根据文章顶部的帖子,它指出TypeScript 1.5.3将HTML Touch事件的声明添加到lib.d.ts。
TypeScript版本1.7.6是否支持这些触摸事件?我在Visual Studio 2015中遇到错误,该错误表明:Property' changedTouches'类型'事件'。
上不存在需要什么lib.d.ts才能使其正常工作。我已经尝试使用NuGet下载最新的jquery.TypeScript.DefinitelyTyped版本=" 2.8.8",但这似乎不起作用。
有什么建议吗?
更新 我验证了NuGet中的jquery d.ts文件与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;
});

更新 我最初认为lib.d.ts是指jQuery。我错了,它是使用TypeScript安装的库之一。
我更新了库,但仍然有相同的错误。 lib.d.ts文件似乎确实有触摸定义,这是朝着正确方向迈出的一步。
问题似乎是jQuery BaseJQueryEventObject接口和TypeScript TouchEvent接口之间不兼容。我还不确定如何解决这个问题,但我可以通过声明var原来消除错误:any = e.originalEvent,它掩盖了不兼容性。
关于如何以正确的方式解决这个问题的任何想法?我猜这需要第三个d.ts文件来解决这些问题。
...谢谢
答案 0 :(得分: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
}
});
正如引言所说,好处是你将在if语句的每个分支中获得适当的自动完成支持。