鉴于以下javascript库的环境类型定义(我无法更改):
// a library with typings I cannot change
interface Widget {
name: string;
}
interface Event {
widget: Widget;
}
declare function addListener(listener: (event: Event) => void):void;
declare function showWidget(renderFn: (widget: Widget) => void): void;
并且有一个扩展模块到该javascript库,通过这样的东西增强 event.widget
(但不是一般的Widget);
interface EnhancedWidget {
displayName: string;
}
function eventExtender(event:Event) {
(event.widget as any).displaName = '....';
}
现在我想用这个定义增强 Event
,但是typescript抱怨
interface Event {
widget: Widget & EnhancedWidget;
}
允许添加新属性,但不允许更改属性的类型 . 但这是现实中可能发生的事情 . 我想知道是否有办法在打字稿中表达这一点 .
最后,我想使用 event.widget
的新 displayName
属性:
addListener( event => console.log(event.widget.displaName) )
但这应该抱怨(因为在这种情况下小部件没有增强):
showWidget(widget => console.log(event.displaName))
因此像这样扩展 Widget
是一个选项: not :
// does not work, because it will enhance all Widget usages and
// not just in the specific context
interface Widget {
displayName: string;
}
1 回答
有这些:
然后为
addListener
添加另一个签名:这仍然会失败:
附:
但这会奏效: