看完这个答案的问题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"
但是在打字稿中,f.foo
会引发错误Property 'foo' does not exist on type '() => void'
。
使用括号表示法可以达到类似的结果:
var f = function() { alert('yo'); }
f['foo'] = "bar";
alert(f['foo']); // alerts "bar"
f(); // alerts "yo"
这将完全绕过打字稿系统,并且为了打字安全而在那里。
有没有一种方法可以实现这种功能而又不损害打字稿的类型安全性?
您可以通过在接口上指定调用签名来定义这种类型:
interface MyFoo {
(): void;
foo: string;
}
您可以通过将函数强制转换为来初始化对象,any
然后再将其分配给变量:
let f: MyFoo = function() { alert('yo'); } as any;
f.foo = 'bar';
x();
顺便说一句,在JQuery定义中类似地定义了JQueryStatic
类型(即$
变量的类型):
interface JQueryStatic<TElement extends Node = HTMLElement> {
...
Deferred: JQuery.DeferredStatic;
...
(html: JQuery.htmlString, ownerDocument_attributes: Document | JQuery.PlainObject): JQuery<TElement>;
...
(selector: JQuery.Selector, context: Element | Document | JQuery | undefined): JQuery<TElement>;
(无法将链接内联,所以就在这里)
但是,这并没有真正的帮助,因为您的问题还在于如何使用此类型初始化变量。JQuery库没有这个问题,因为它不是用Typescript编写的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句