TypeScript版本1.7.6是否支持dts lib for touchevents?

时间:2016-02-06 19:58:45

标签: jquery typescript definitelytyped

我找到了以下链接:  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文件来解决这些问题。

...谢谢

1 个答案:

答案 0 :(得分:1)

在处理程序中,函数e的类型为JQueryEventObject

originalEvent来自BaseJQueryEventObject,而且类型为Event。这个Event是我们回到lib.d.ts的地方。到目前为止一切都清楚了。

因为Event是许多派生事件类型(如GamepadEventMutationEvent等)的基本接口,所以它只包含所有这些事件类型中共享数据的字段。这就是为什么你无法访问changedTouches,因为就TypeScript编译器而言,它不是TouchEvent

我会使用TypeScript 1.4中引入的名为type guards的功能来解决这个问题。

  

JavaScript中的常见模式是使用typeof或instanceof在运行时检查表达式的类型。 TypeScript现在可以理解这些条件,并且在if块中使用时会相应地更改类型推断。

由于您为mousedowntouchstart事件指定了相同的处理程序,e.originalEvent可以是MouseEventTouchEvent

所以你必须处理这两种情况:

$("#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语句的每个分支中获得适当的自动完成支持。