【问题标题】:How to cast JQuery to String - or how to avoid the need?如何将 JQuery 转换为 String - 或如何避免需要?
【发布时间】:2014-07-21 09:39:17
【问题描述】:

typeahead.js 使用 val “方法”返回输入字段的值:

jQuery#typeahead('val')

(https://github.com/twitter/typeahead.js/blob/master/doc/jquery_typeahead.md#api)

很遗憾DefinitelyTypedd.ts for typeahead.sj 不包含这个“方法”的存在。

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

typeahead(methodName : 'val'): string;

我收到此错误

TS2154:专用重载签名不可分配给任何非专用签名。

现在,如果我做对了,那是因为已经存在具有不同签名的其他方法,例如这个

typeahead(methodName: 'destroy'): JQuery;

如果我创建一个返回 JQuery 对象的签名,一切正常

typeahead(methodName : 'val'): JQuery;

除了“方法”现在返回 JQuery 而不是 String 并且当我尝试像这样将它转换为 String 时

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

我收到这个错误

TS2012:无法将“JQuery”转换为“字符串”:缺少“字符串”类型 来自类型“JQuery”的属性“ajaxComplete”。

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

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

【问题讨论】:

标签: jquery typescript typeahead.js


【解决方案1】:

在使用专门的重载签名时需要遵循一些规则:

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

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

• 实现签名必须兼容所有 签名。

(来源:Ch1, Pro TypeScript

因此,在您的情况下,您不需要更改您尝试添加的专用重载;但您确实需要添加一个非专用签名以使其兼容(即返回字符串而不是 jQuery 的签名):

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

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

【讨论】:

  • 顺便说一句,这本书很有趣
  • 谢谢 :) - 也快完成了!
  • 哦!我没注意到,你是作者:)。太好了,我完全需要有经验/专业级的打字稿资源。当我购买 alpha 时,我会得到完整版吗?令人惊讶的是,FAQ 没有回答这个问题apress.com/customer-support/#alpha-book-info
  • 是的 - 您可以提前访问,然后在完成后获得完整的最终访问权限。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-26
  • 2011-01-11
  • 2011-01-26
  • 2011-04-25
  • 1970-01-01
  • 1970-01-01
  • 2023-03-06
相关资源
最近更新 更多