В 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 */ }
Я просто работаю над файлом определения для 3 партии Lib, который изменяет типы свойств в производных классах (сам Javascript не имеет такого ограничения оставляя последствия по усмотрению разработчика). Итак, вы говорите, что нет никакого способа отразить этот поворот в TypeScript, не так ли? –
Отредактировано для добавления примеров того, где вы можете/не можете сделать это –