首页 文章

如何改变/扩展 property 的类型?

提问于
浏览
0

鉴于以下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 回答

  • 0

    有这些:

    interface EnhancedWidget extends Widget {
        displayName: string;
    }
    interface EnhancedEvent extends Event {
        widget: EnhancedWidget;
    }
    

    然后为 addListener 添加另一个签名:

    declare function addListener(listener: (event: EnhancedEvent) => void):void;
    

    这仍然会失败:

    addListener(event => console.log(event.widget.displayName));
    

    附:

    'Widget'类型中不存在属性'displayName'

    但这会奏效:

    addListener((event: EnhancedEvent) => console.log(event.widget.displayName))
    

相关问题