2016-12-12 3 views
1

Я нашел случай, когда типы типов шрифтов и анализ потока ведут себя неожиданно. Я стесняюсь называть это ошибкой, я не знаю, как это предположительно для работы. По моему опыту, обычно это просто волшебным образом делает то, что я хочу.Анализ потока типа машинописного текста

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. Сообщенная ошибка компиляции для меня не имеет смысла.

Свойство «другое» не существует в типе «Родитель».

Я бы предположил, что внутри блока if, что x набирается в Child. Почему это происходит? Есть ли достойное решение?

ответ

0

В первых x = x.other; этой правой стороной x считается Child. И это правильно, так как он остается в пределах if (x instanceof Child){...}.
Левая сторона x считается Parent, мы можем сказать, что это тоже правильно, поскольку вы объявили let x: Parent.

Это противоречие может быть немного глючит, но с другой стороны вы можете винить себя, потому что вы пытаетесь запутать компилятор в любом случае противоречивых заявлениями ... :)

Так что на ваше второе x = x.other; права сторона x рассматривается как Parent (как слева x на предыдущей строке), так что вы получите Property 'other' does not exist on type 'Parent'.

+0

вы говорите, что «правая сторона' x' рассматривается как 'Parent'». Если бы это было так, первое назначение было бы ошибкой компиляции, а не второй. – recursive

+0

Извините, это опечатка .. Я имею в виду левую сторону – s976