2013-03-07 5 views
0

У меня есть базовый класс, который определяет data как any[]. В производном классе я хочу переопределить это свойство другим типом. Поэтому я ищу какую-то функцию «C# new modifier» в TypeScript. Есть ли способ сделать что-то подобное в TypeSctipt?Есть ли способ переопределить свойство в TypeScript?

declare class MyBase { data: any[]; } 
declare class MyData { } 
declare class MyDerived extends MyBase { data: MyData; /* <--- problem */ } 

ответ

3

В TypeScript нет способа сделать это. Это в основном ограничение времени выполнения.

В C# new означает, что вы на самом деле создаете новое имя для функции, которая видна только при просмотре выражения производного типа, но использование этого имени с помощью выражений базового типа все еще видит базовый элемент (в том числе в самой реализации базового случая, критически).

В TypeScript/JavaScript в объекте есть только один слот, и производный класс действительно перезаписывает член базового класса. Коэффициенты очень высоки, вы нарушаете базовый класс, перезаписывая этого участника, так как базовый класс не может ссылаться на члена, который, по его мнению, был.

Изменить, чтобы добавить: Вы можете добавить специализаций таким образом до тех пор, как они на самом деле звук (такой же, как и в C#, где вы обычно только использовать new ключевое слово, если вы ломали форму базового класса). Это ограничение не должно быть на самом деле проблемой, если ваши типы последовательны во время выполнения (например, вы на самом деле можете использоваться производными вместо базы):

declare class Item {} 
declare class SpecialItem extends Item { } 

declare class MyBase { data: Item[]; } 
declare class MyData { } 
declare class MyDerived extends MyBase { data: SpecialItem[]; /* OK */ } 
declare class MyDerived2 extends MyBase { data: number[]; /* not OK */ } 

В вашем примере, data в MyDerived должен быть MyData[] (в противном случае вы разорвать MyBase контракт):

declare class MyBase { data: any[]; } 
declare class MyData { } 
declare class MyDerived extends MyBase { data: MyData[]; /* OK */ } 
+0

Я просто работаю над файлом определения для 3 партии Lib, который изменяет типы свойств в производных классах (сам Javascript не имеет такого ограничения оставляя последствия по усмотрению разработчика). Итак, вы говорите, что нет никакого способа отразить этот поворот в TypeScript, не так ли? –

+0

Отредактировано для добавления примеров того, где вы можете/не можете сделать это –

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