2013-02-20 3 views
2

에 인터페이스를 변환 나는 다음과 같은 코드가 있습니다타이프 : 클래스

interface X { 
    type : string; 
    val : number; 
} 

class X1 implements X { 
    type : string; 
    val : number; 
} 

var p1 : X[] = [{type:'a', val:8}]; 

for (var n in p1) { 
    var p2 : X1 = p1[n]; 
} 
var p3 : X1 = p1[0]; 

P2와 P3 두 유형의 X1을 가진 것으로 선언하고

컴파일러 즐겁게 받아들이는 타입 X의 값으로 초기화됩니다 p2의 선언이지만, "X를 'X1'로 변환 할 수 없다는 p3에 대해 불평합니다.

왜 이러한 차이가 있습니까?

+0

나는 컴파일러 메시지가 잘못된 것이라고 생각한다. 마지막 행을'var p3 : X1 = p1 [ "a"];로 변경하면 잘 컴파일됩니다. X []가 연관 (문자열 인덱스) 배열 인 것처럼 보이지만 왜 그런지는 잘 모르겠습니다. – JcFx

답변

6

X을 구현하는 모든 항목은 X으로 변환 가능해야하지만, 반드시 X1으로 변환 할 필요는 없습니다.

자세한 내용은 다음과 같습니다. 아래 코드는 간단한 예를 보여줍니다. 본질적으로 유형이 X (인터페이스) 인 경우 X1 (클래스) 또는 X2 (클래스)으로 구현할 수 있습니다.

유형을 구현에서 인터페이스로 다운 그레이드 할 수 있지만, 유형을 인터페이스에서 특정 구현으로 업그레이드 할 수는 없지만 보유하고있는 것이 호환성이 있다고 보장 할 수는 없습니다.

이 바라 보는 또 다른 방법은 그것보다 뭔가덜 구체적를 만들 수 있습니다,하지만 당신은 그것보다더 구체적인 뭔가를 할 수 없다는 것입니다. 이 작업을 수행 할 수 있기 때문에 실제로는 작동하지 않을 것이다,

var exampleC: X1 = <X1>exampleA; // happy... 

을하지만주의 :

interface X { 
    type : string; 
    val : number; 
} 

class X1 implements X { 
    type : string; 
    val : number; 
} 

class X2 implements X { 
    type: string; 
    val: number; 
    myMethod() { 

    } 
} 

var x1 = new X1(); 
var x2 = new X2(); 

var exampleA: X = x1; // happy 
var exampleB: X = x2; // happy 

var exampleC: X1 = exampleA; // Not happy... 

이 모든 것의 결말은 당신이 그것을 던져 필요가있다

var exampleC: X2 = <X2>exampleA; // seems happy... 
exampleC.myMethod(); // oh dear! 
이 코드 조각에 관하여

업데이트

...

for (var n in p1) { 
    var p2 : X1 = p1[n]; 
} 

는 자바 스크립트 이것은 foreach 루프 동등하지 않다. 일반적으로 객체의 속성을 반복하는 데 사용되는 것은 when you use it on an array it will only show explicitly set indexes (not all items)입니다.

for (var i = 0; i < p1.length; i++) { 
    var p2 : X1 = p1[i]; // same warning as before 
} 

는 어떻게 타이프 라이터가 p1[n]X1 변수에 할당 할 수 있습니다 제공 : 배열을 반복하려면 사용되어야 하는가? 이 p1의 유형,하지 p1[n]의 유형입니다 - 흥미로운 질문과 대답은 당신이 p1[n] 위에 마우스를 올려 경우 X[]의 유형을 볼 수 있습니다 ... 여기

자리 잡고 있습니다. 이 예제를 선택하면, 당신은 p1[n] 유형 any의 것을 확인할 수있는 것들 :

var example = p1['test']; // I used 'test' because n is a string. 

를 컴파일러가 당신이 X1로 취급하도록 지시 할 수 있습니다 any이 유형이기 때문입니다.따라서 any에서 X1으로 변환하는 것은 생각한 것처럼 X에서 X1으로 변경되지 않았습니다.

+0

그게 내가 기대했던 것입니다. 그런데 왜 컴파일러는 p2에 대한 선언을 수용합니까? – oz1cz

+0

짧은 대답 :'p1 [n]'은'any' 타입이고'X' 타입이 아닙니다. 자세한 설명은 내 대답에 추가되었습니다. – Fenton

+0

고마워요, 스티브. – oz1cz