TypeScript:访问本地类定义隐藏的全局类型?

时间:2016-03-31 08:45:02

标签: class typescript global typescript1.8

假设我有一个类与之前定义的类型具有相同的名称,该类在 lib.d.ts 中定义。我将如何在这个类中使用该类型。

例如,我有类 Event ,它必须处理浏览器 Event 对象,它被定义为lib.d.ts中的接口。< / p>

export class Event { // own definition of Event which hides original Event

  public dealWithBrowserEvent(event: Event): void { // Event object defined by lib.d.ts
    // deal with it
  }

}

我如何告诉Typescript这是两种不同的类型。当然我可以简单地重命名我的课程,但我不想这样做,因为这个名字非常适合我的用例。

2 个答案:

答案 0 :(得分:0)

您可以通过以下方式归档:

E.ts:

class CustomEvent 
{ 
    public dealWithBrowserEvent(event: Event): void 
    { 

    }
}

export default CustomEvent;

A.ts:

import Event from './E'

export class SomeClass 
{ 
    //Parameter e here is instance of your CustomEvent class
    public someMethod(e: Event): void 
    { 
        let be: any;
        //get browser event here
        e.dealWithBrowserEvent(be)
    }
}

有关声明合并的更多内容,以及可以合并的内容以及不合并的内容:link

我强烈建议你不要这样做。这段代码会让你的同事稍后阅读/修改它会引起很多困惑,更不用说无法在同一个文件标准类中使用Event了。

答案 1 :(得分:0)

与此同时,我找到了一个非常可行的解决方案。我定义了一个导出重命名接口的附加模块。如果我导入此模块,我可以使用重命名的类型,就好像它们是原始类型一样。

browser.ts

// Event will be the one from lib.d.ts, because the compiler does not know anything about 
// the class Event inside this module/file.
// All defined properties will be inherited for code completion.
export interface BrowserEvent extends Event {
    additionalProperty1: SomeType;
    additionalProperty2: SomeType;
}

如果您不需要其他属性,只需输入别名:

browser.ts

// Alias for Event
export type BrowserEvent = Event;

event.ts

import {BrowserEvent} from './browser.ts';

export class Event { // Definition of Event hides original Event, but not BrowserEvent

  public dealWithBrowserEvent(event: BrowserEvent): void {
    // deal with it
  }

}

我对此解决方案非常满意,但也许有更好的解决方案。