Вывод типа литеральной строки для значений членов абстрактного класса - PullRequest
0 голосов
/ 12 апреля 2020

Следующий код машинописи приводит к ошибке (машинопись v3.8.3). Почему?

class A {
    public foobar: 'foo' | 'bar' = 'bar';
}

class B extends A {
    public foobar = 'foo';  // --> Type 'string' is not assignable to type '"foo" | "bar"'
}

Детская площадка: https://www.typescriptlang.org/play?#code / MYGwhgzhAECC0G8BQ1XQA4FcBGICWw0AZgPYnZgBOAXNAOSkl3QA + 9FlzAvO1XQNxIAvkiShIMAELQADA2A для достижения той же цели, которая не требует написания конструктора или дублирования определения типа в дочерних классах.

1 Ответ

0 голосов
/ 12 апреля 2020

Похоже, что 'foo' является строкой, что позволяет B.foobar быть строкой, которая затем конфликтует с типом родительского члена класса A.foobar.

. следующие работы, которые не выполняют приведение типов из моего уровня понимания:

class A {
    public foobar: 'foo' | 'bar' = 'bar';
}

class B extends A {
    public foobar: 'foo' | 'bar' = 'foo';
}

Следующее также работает, что заставляет typcript выводить тип B.foobar из A.foobar вместо строки значение.

class A {
    public foobar: 'foo' | 'bar' = 'bar';
}

class B extends A {
    constructor() {
        super();
        this.foobar = 'foo';
    }
}
...