2016-02-06 56 views
0

我发现以下链接: Does TypeScript support TouchEvent?TypeScript 1.7.6版本是否支持touchevent的dts库?

它处理我遇到的问题。根据文章顶部的帖子,它指出TypeScript 1.5.3将HTML Touch事件的声明添加到lib.d.ts.

TypeScript 1.7.6版是否支持这些触摸事件?我在Visual Studio 2015中发现错误:状态'changedTouches'在'Event'类型上不存在。

需要什么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; 
 
});

更新 我最初以为指的jQuery的lib.d.ts。我错了,它是与TypeScript一起安装的一个库。

我已经更新了库,但仍然有相同的错误。 lib.d.ts文件似乎具有触摸定义,这是朝着正确方向迈出的一步。

这个问题似乎是jQuery BaseJQueryEventObject接口和TypeScript TouchEvent接口之间的不兼容问题。我不确定如何解决这个问题,但是我可以通过声明var original:any = e.originalEvent来消除错误,它掩盖了不兼容性。

关于如何以正确的方式解决这个问题的任何想法?我猜测它会花费第三个d.ts文件来解决接口问题。

谢谢...

回答

1

在处理函数eJQueryEventObject类型。

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语句的每个分支得到适当的自动完成的支持。

+0

非常感谢您的快速响应。这正是我正在寻找的,但不知道它!你的写作很清楚,很有道理。我之前使用过instanceof,但没有与如何解决TypeScript抱怨的类型差异有关。我最近将TypeScript从1.3.x升级到1.7.6。我将不得不做一些功课,看看还有什么添加。 – Highdown

+0

对于您可能会遇到同样问题的其他人的建议,我有一个小小的更正。当TouchEvent未定义时,第一个if块会引发异常,而不支持触摸的台式机/笔记本电脑就是这种情况。在我的情况下,我修改了第一个if块以包含触摸测试,即(CheckMobile.isTouch_p && TouchEvent的原始实例)以消除该异常。 – Highdown