2013-03-07 3 views
0

data 속성을 any[]으로 정의하는 기본 클래스가 있습니다. 파생 클래스에서이 속성을 다른 유형으로 다시 선언하려고합니다. 그래서 TypeScript에서 "C# new modifier"기능을 찾고 있습니다. TypeSctipt에서 이와 같은 작업을 수행 할 수있는 방법이 있습니까?TypeScript에서 속성을 재정의하는 방법이 있습니까?

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

답변

3

TypeScript에서는이 작업을 수행 할 방법이 없습니다. 기본적으로 런타임 제약 조건입니다.

C#의 경우 new은 파생 된 형식의 식을 통과 할 때만 표시되는 함수의 새 이름을 실제로 만들고 있지만 기본 형식의 식에서 해당 이름을 사용하면 기본 멤버를 계속 볼 수 있음을 의미합니다. (기본 케이스 구현 그 자체, 비판적으로 포함).

TypeScript/JavaScript에는 개체에 '슬롯'이 하나만 있으며 파생 클래스는 실제로 기본 클래스 멤버를 덮어 씁니다. 기본 클래스가 생각한 멤버를 참조 할 수있는 방법이 없기 때문에 확률이 매우 높습니다.

편집를 추가합니다 : 당신은 만큼 그들은 (당신이 기본 클래스 모양을 위반 한 경우 보통에만 new 키워드를 사용하는 것이 C#을,에서와 동일) 실제로 소리만큼 전문이 방법을 추가 할 수 있습니다. 당신의 예에서

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 */ } 

, MyDerived에서 data가 될 필요가있을 것이다 :이 제한은 실제로 (당신이 실제로는 자료의 장소에서 파생 된 사용 할 수 있습니다 즉) 당신의 유형은 런타임에 일관성이 있다면 문제가되지 않습니다 난 그냥 자바 스크립트 자체를 떠나 이러한 제한이 없습니다 (파생 클래스에 속성의 유형을 변경하는 제 3 자 lib 디렉토리에 대한 정의 파일에 있어요

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

: MyData[] (그렇지 않으면 당신은 MyBase 계약을 위반하고) 개발자의 재량에 따른 결과). 그래서 당신은 TypeScript에서 이러한 비틀기를 반영 할 방법이 없다고 말하는 것입니까? –

+0

수정할 수있는 위치의 예를 추가하여 수정했습니다. –

관련 문제