您如何在打字稿中定义同时属于对象和函数的类型?

奥莲04

看完这个答案的问题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"

这将完全绕过打字稿系统,并且为了打字安全而在那里。

有没有一种方法可以实现这种功能而又不损害打字稿的类型安全性?

泽夫·斯皮兹(Zev Spitz)

您可以通过在接口上指定调用签名来定义这种类型:

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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在打字稿中定义对象类型的对象

如何在打字稿中编写匿名函数的函数类型定义?

如何在打字稿中定义嵌套字典类型

如何在打字稿中定义此对象?

如何在打字稿中创建的对象中定义函数

如何在打字稿中“返回”外部函数定义

如何在打字稿中定义函数调用签名的实现和构造签名

如何在打字稿类型定义中使用常量?

如何在打字稿中键入以下对象/类型

如何在打字稿中使用函数参数类型?

如何在打字稿的函数中检查类型联合的类型

如何在打字稿中未定义函数结果的定义

在打字稿中,如何定义异步功能的类型

在打字稿中,您如何表达其中一个字段是类型名称的对象的类型?

如何在打字稿中的forEach下定义类型?

如何在打字稿中定义观察者的类型

如何在打字稿2.0 / 3.0中添加自定义“类型”

如何在打字稿配置中包括缺少的类型定义文件?

如何在打字稿中创建自定义数据类型?

如何在打字稿中为aa子类(React.Component)编写类型定义?

如何在打字稿中显式定义具有不同元组类型的元组数组?

如何在打字稿中创建动态嵌套的对象和对象属性

如何在打字稿中实现对象值的联合类型

如何在打字稿中安全地声明嵌套对象类型

如何在打字稿中获取对象值作为类型?

在打字稿中声明对象类型

在打字稿中映射对象类型

如何在打字稿中的类方法上强制执行函数类型接口?

如何在打字稿中强制转换此函数类型