Свойство не существует для типа после проверки типа - PullRequest
2 голосов
/ 12 мая 2019

В следующем коде я пытаюсь работать с экземпляром класса Test после проверки типа.

main.ts

class Test {
    x: number = 0;
    test() {}
}

let t1: Test | number = new Test();

if (t1 instanceof Test) {
    console.log(t1.x); // works
    let t2 = new Test();
    t2.test = function() {
        this.x = t1.x; // doesn't work
    }
}

После запуска tsc main.ts получаю:

main.ts:12:21 - error TS2339: Property 'x' does not exist on type 'number | Test'.
  Property 'x' does not exist on type 'number'.

12         this.x = t1.x; // doesn't work
                       ~


Found 1 error.

tsc --version возвращает Version 3.4.5

1 Ответ

4 голосов
/ 12 мая 2019

Проблема в том, что t1 определяется с let, это означает, что во время выполнения, когда вызывается функция test в t2, она могла быть уже изменена и не иметь тип Test больше (ну, не во фрагменте, а с точки зрения компилятора, вы можете написать некоторый код после определения функции).

Если вы измените определение на const, оно будет работать нормально:

class Test {
    x: number = 0;
    test() {}
}

const t1: Test | number = new Test();

if (t1 instanceof Test) {
    console.log(t1.x); // works
    let t2 = new Test();
    t2.test = function() {
        this.x = t1.x; // works fine
    }
}
...