2014-06-09 7 views
0
function test(parm : number) { 
    console.log(parm); 
} 

var x = '12'; 
test(x); //does not compile as expected. 
test(<any>x); //no error or warning. 

마지막 줄에 컴파일러 오류가 표시되지 않는 이유는 무엇입니까? 문서에 대한 모든 참조가 도움이 될 것입니다. <any>x유형 검사가 취소 된 것으로 보입니다.

TIA

+2

"이 변수는 * 모든 * 유형을 만족합니다"또는 특정 경우 "* x *가 * 모든 * 유형을 만족시킵니다"와 같이 자신에게'모두 '읽으면 도움이 될 수 있습니다. – Fenton

답변

2

는 당신이 변수 x 캐스팅되어하고있는 any를 입력합니다. 즉, 컴파일러에게 "이봐,이 곳에서 나는 x이고 실제로는 !!"이라는 것을 알고있다. 컴파일러는 자신이 옳다고 판단하고 해당 호출에 대해 지정한 새 유형을 사용합니다.

any은 TypeScript의 특수한 형식입니다. 즉, 형식이 무엇이든간에 형식을 변경할 수도 있음을 의미합니다! 이러한 이유 때문에 컴파일러에서는 다른 유형 대신 any 유형의 변수를 사용할 수 있습니다. 따라서 함수는 number 유형의 매개 변수 만 허용하지만 any 유형의 매개 변수도 허용합니다. 물론 any이 실제로 숫자 일 수 있기 때문입니다.

이 문제가 절에 language specification에 3.8.4 도시 - 할당 호환성 (44-45 페이지) :

유형은 표현과 같은 특정 상황에 대입 호환성이 요구되며, 변수 유형은 문 이고 인수 및 매개 변수 유형은입니다. ... S는 T 형에 할당하고, T는 중 하나는 다음의 경우에 해당하고, S로부터 할당이다

  • 는 S 및 T는 동일한 타입이다.
  • S 또는 T는 모든 유형입니다.
  • ...

(강조 광산)

+0

x를 x와 같은 숫자로 타입 변환하면 아무런 오류가 없을 것으로 예상됩니다 : x. 하지만이 경우에는 C#과 같은 언어에서 오류가 발생하는 수퍼 클래스에 typecasting합니다. – MBeckius

+0

@ MBeckius 내가 말했듯이, 그것은 특별한 경우입니다. 나는 엄격하게 OO 수퍼 클래스로 구현되지는 않는다고 생각한다 (확실히 하나처럼 행동하지 않는다!). * 어떤 * 변수에 대해서만 완전히 타입 체크를 끄기 만하면 모든 할당을 받아들이고 어떤 메소드로도 받아 들일 것입니다. –

+1

@MBeckius 기본적으로 모든 것은 타입 추론이나 주석이 다르게 지정하지 않았거나 프리미티브 (primitive)가 아니라면'any' 타입이 주어지기 때문에 유용합니다. 즉, 기본적으로 검사되는 유형은 없으며 TypeScript 파일에서 변환없이 JavaScript 코드를 사용할 수 있습니다. 영리한/미친 코드에 대한 유형 검사를 선택 해제하는 방법도 있습니다. –

2

OK. 직접 specs (23 페이지)에서 :

타이프의 모든 유형은 Any 유형이라는 단일 상위 유형의 하위 유형입니다.

그래서 당신은 당신의 슈퍼any을 사용하고numeric유형의 장소에있어. 갈등이 없습니다.

+0

정적 형식의 언어에서 사용한 경험에 따라 하위 형식이 필요할 때 상위 유형을 전달하는 것은 유효하지 않습니다. – MBeckius

+0

@ MBeckius 이것이 OO 언어의 세 가지 특징 중 하나 인 다형성 행동의 본질이라고 생각합니다. 당신은 동일한 물리적 객체를 전달하고 있습니다 - 당신은 단지 그것을 다르게 선언합니다. –

관련 문제