2016-03-31 2 views
0

Предположим, у меня есть класс, который имеет то же имя, что и ранее определенный тип, который определен внутри lib.d.ts. Как бы я использовал этот тип в этом классе.Тип: Доступ к глобальному типу, скрытому локальным определением класса?

Например, у меня есть класс событие, который имеет дело с браузерами событий объекта, который определен как интерфейс в lib.d.ts.

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 
    } 

} 

Как я могу описать Машину, что это два разных типа. Конечно, я мог бы просто переименовать мой класс, но я не хочу этого делать, потому что это имя идеально подходит для моего использования.

+0

Я бы предложил использовать пространства имен, так как это то, для чего они предназначены (т. Е. Для устранения неоднозначности имен). –

+0

Я не знаю, что TypeScript будет поддерживать реальную концепцию пространств имен. Типы, определенные внутри lib.d.ts, не имеют пространства имен, а код, который я пишу, уже находится в моем собственном «пространстве имен»/модуле. Вот почему я столкнулся с этим именем. Как будет выглядеть решение с использованием пространств имен? – Niabot

+0

Что-то вроде 'module My.Namespace {export class Event {...' Тогда вы можете указать свой класс Event на My.Namespace.Event'. –

ответ

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 
    } 

} 

Я вполне уверен довольны этим решением, но, возможно, есть еще лучшее решение.

+0

Вы можете просто использовать 'type BrowserEvent = Event' для псевдонима. – Aaron

+0

Право. Это также вариант и предпочтительнее в моем демонстрационном случае. Определение интерфейса делает более или менее одинаковым, но также позволяет добавлять дополнительные свойства который не может быть определен lib.d.ts. Я обновлю свой ответ. – Niabot

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.

+0

Я пытался это сделать.Но в конце концов я не был доволен, что во время проверки типа параметр метода был неправильным. Он также нарушил автоматическое завершение внутри IDE. JavaScript/TypeScript имеет некоторые серьезные проблемы с сталкивающимися именами. :( – Niabot

Смежные вопросы