2016-12-12 4 views
1

typescripts 유형 가드 및 플로우 분석이 예기치 않게 작동하는 경우를 발견했습니다. 나는 그것을 버그라고 부르기를 망설이지 만, 나는 그것이 실제로 어떻게 이라고 생각하는지 모른다.. 내 경험에 의하면, 보통은 마술처럼 내가 원하는 것을 해낸다.Typescript 유형 흐름 분석

class Parent { } 
class Child extends Parent { 
    other: Child; 
} 

let x: Parent = null; 
if (x instanceof Child) { 
    x = x.other; 
    x = x.other; // this line gives a compilation error 
} 

Typescript Playground에서이 문제를 해결할 수 있습니다. 보고 된 컴파일 오류가 내게 의미가 없습니다.

'기타'속성이 '부모'유형에 없습니다.

나는 xChild로 입력했는지의 if 블록 내부에 그 가정 것이다. 왜 이런 일이 일어나는 걸까요? 괜찮은 해결 방법이 있습니까?

답변

0

첫 번째 x = x.other;에서 오른쪽은 x으로, Child으로 간주됩니다. 그리고 그것이 맞습니다. if (x instanceof Child){...} 내에 있기 때문에 그렇습니다.
Parent으로 간주되는 왼쪽 x은 사용자가 let x: Parent을 선언 한 이후로도 적절하다고 말할 수 있습니다.

이 모순은 약간의 버그가있을 수 있습니다,하지만 당신은 충돌 선언에 의해 어떤 방식으로 컴파일러를 혼란스럽게하려고하기 때문에 다른 한편으로는 두 번째 x = x.other; 오른쪽에 ... 그래서 :)

자신을 비난 할 수 측면 xParent (이전 줄의 왼쪽은 x)으로 간주되므로 Property 'other' does not exist on type 'Parent'.

+0

"오른쪽 'x'는 '부모'로 간주됩니다. 이것이 사실이라면 첫 번째 할당은 두 번째가 아니라 컴파일 오류입니다. – recursive

+0

죄송합니다. 오타입니다. 왼쪽면을 의미합니다. – s976