2014-07-20 21 views
1

typeahead.js使用VAL “方法”,返回输入字段的值:如何将JQuery转换为字符串 - 或者如何避免这种需要?

不幸DefinitelyTyped d.ts为typeahead.sj

jQuery#typeahead('val') 

https://github.com/twitter/typeahead.js/blob/master/doc/jquery_typeahead.md#api)不包含存在这个“方法”。

但是当我尝试添加新的签名

typeahead(methodName : 'val'): string; 

我得到这个错误

TS2154:专业超载签名是不能分配给任何非专业的签名。

现在,如果我弄清楚了,那是因为其他具有不同签名的方法已经存在,例如,如果我创建一个返回jQuery对象

typeahead(methodName : 'val'): JQuery; 

除“方法”现在返回,而不是字符串JQuery的,当我尝试将其转换为字符串这样的签名本

typeahead(methodName: 'destroy'): JQuery; 

一切正常

<string>$('#typeahead').typeahead('val') 

我得到这个错误

TS2012:无法将'JQuery'转换为'string':类型'String'丢失 类型'JQuery'的属性'ajaxComplete'。

如何正确实现val“方法”?

PS:我一直使用单词“方法”的撇号,因为我觉得在2014年JQuery插件使用字符串作为方法名称是很荒谬的。

+0

修正:https://github.com/borisyankov/DefinitelyTyped/pull/2538 – basarat

回答

1

有一些规则,使用专门的过载签名时遵循:

•必须有至少一个非专业的签名。

•每个 专用签名必须返回非专用 签名的子类型。

•执行签名必须与所有 签名兼容。

(来源:Ch1, Pro TypeScript

所以你的情况,你不需要改变你正在尝试添加专门的过载;但您确实需要添加一个非专用签名才能与之兼容(即一个返回一个字符串,而不是jQuery的):

interface JQuery { 
    // Non-specialized (but matching) signature 
    typeahead(methodName: string): string; 

    // Specialized signature 
    typeahead(methodName : 'val') : string; 
} 
+0

顺便说一句,有趣的书 –

+0

谢谢:) - 几乎已经完成了! – Fenton

+3

哦!我没有注意到,你是作者:)。这很好,我总是需要经验丰富的/专业级别的打字稿资源。当我购买阿尔法时,我会得到完整版吗?这个FAQ令人意外地没有回答这个问题http://www.apress.com/customer-support/#alpha-book-info –

相关问题