TypeScript不允许比较.data()和数字/字符串

时间:2015-09-25 12:13:53

标签: jquery typescript typescript1.6

由于打字稿的强类型特性,在比较jQuery .data()调用的结果和一些简单类型(如一些字符串)时似乎存在问题。

例如:

var dataValue = $("#myDiv").data("div-index");

if(dataValue === 0)
{
    alert("first item");
}

以上将产生Operator '===' cannot be applied to types 'JQuery' and 'number'.

的错误

TypeScript将.data()的结果视为JQuery类型,因此无法按照预期的复杂类型进行评估。

到目前为止,唯一的解决方法是在.toString()调用结束时调用.data(),但这意味着修改所有当前.data()调用及其比较。这也使得>之类的数字比较变得不可能,因为我们无法在字符串和数字之间进行比较。

此问题似乎仅在更新到TypeScript 1.6后发生。

3 个答案:

答案 0 :(得分:3)

看起来像个bug。我刚刚查看了jQuery.d.ts文件并找到了您的返回类型,但是另一种方法是重载。

解决方案

尝试在方法调用上方添加CKEDITOR.on( 'dialogDefinition', function( evt ) { var dialogName = evt.data.name; var dialogDefinition = evt.data.definition; var editor = evt.editor; if ( dialogName == 'link' ) { var defaultOnOk = dialogDefinition.onOk; dialogDefinition.onOk = function() { defaultOnOk.apply( this, arguments ); var sel = editor.getSelection(), range = sel.getRanges()[ 0 ], path = range.startPath(); range.moveToPosition( path.contains( 'a' ), CKEDITOR.POSITION_AFTER_END ); range.select(); } } });

<any>

这个案子对你有用

附加案例

您也可以在官方TypeScript问题主题和DefinitelyTyped问题主题

上报告此问题

答案 1 :(得分:2)

升级到jquery.d.ts的最新版本。我也注意到了这一点。有一个错误可以使用data(obj: { [key: string]: any; }): JQuery;代替.data(key: string): any。它已在this commit中修复。

升级后,data(key: string)的返回类型为any,您可以通过使用类型断言告诉编译器您知道它将是一个数字:

var dataValue = $("#myDiv").data("div-index") as number;

if (dataValue === 0)
{
    alert("first item");
}

答案 2 :(得分:1)

实际上,根据jQuery.d.ts,对$("#myDiv").data("div-index")的调用是返回类型<any>

可能是,你在元素中存储的值实际上是一个jQuery对象吗?