【发布时间】:2018-02-02 08:02:07
【问题描述】:
在阅读this answer 到问题How is jQuery's $ a function and an object? 之后,我开始思考。你会如何在打字稿中定义这种类型?
在普通 JS 中这是完全有效的:
var f = function() { alert('yo'); }
f.foo = "bar";
alert(f.foo); // alerts "bar"
f(); // alerts "yo"
但是在 typescript 中,f.foo 会抛出错误,Property 'foo' does not exist on type '() => void'。
虽然您可以使用bracket notation 获得类似的结果:
var f = function() { alert('yo'); }
f['foo'] = "bar";
alert(f['foo']); // alerts "bar"
f(); // alerts "yo"
这将完全绕过类型系统,以及 typescript 的类型安全。
有没有一种方法可以在不违反 typescript 的类型安全的情况下实现这种类型的功能?
【问题讨论】:
-
也许你可以在DefinitelyTyped/types/jquery/index.d.ts 中找到提示,我认为他们确实这样做了,但我没有仔细研究。
-
@t.niese 他们会这样做,但是该文件有 8000 行,当我什至不知道自己在寻找什么时,提取定义此特定行为的几行变得更加困难。
-
但这至少是一个起点;)。以防万一您没有得到任何有帮助的答案,您至少可以通过此链接找到解决方案。我还需要查看整个文档才能找到该信息,因为我也不知道。
-
@t.niese 是的,谢谢。希望我不必诉诸于此。
-
你想要什么样的功能?某种工厂函数,如 jQuery 的
$,它获取 CSS 选择器并返回带有 jQuery 函数的包装 DOM 对象?不清楚你想要什么样的功能。
标签: javascript typescript types prototype