Ошибка TypeScript относительно неинициализированных переменных в конструкторе класса - PullRequest
0 голосов
/ 14 июля 2020

TypeScript жалуется на неинициализированное свойство класса, хотя кажется, что оно назначено правильно.

Вот минимальный воспроизводимый пример:

type Config = {
    color: string;
}

class Toto {
    color: string;

    constructor(config: Config) {
        this.setConfig(config);
    }

    setConfig(config: Config) {
        this.color = config.color;
    }
}

TypeScript игровая площадка

Компилятор подчеркивает определение свойства color и выдает следующую ошибку:

Свойство 'color' не имеет инициализатора и точно не назначается в конструкторе.

Проблема, по-видимому, связана с использованием метода setConfig для установки значения color, поскольку следующий код не вызывает ошибок компилятора:

type Config = {
    color: string;
}

class Toto {
    color: string;

    constructor(config: Config) {
        this.color = config.color;
    }
}

Эта проблема заключается в том, что я хочу иметь возможность использовать метод setConfig для установки различных значений свойств класса в течение времени существования экземпляра класса. Я не хочу повторять один и тот же код как в моем конструкторе, так и в методе setConfig, чтобы обойти проблему с компилятором TS.

Кто-нибудь знает, почему компилятор не видит, что переменная класса правильно настроен в конструкторе?

Ответы [ 3 ]

1 голос
/ 14 июля 2020

TypeScript не допускает этого, поскольку метод setConfig может быть перезаписан, если даже класс Toto является подклассом:

class SubToto extends Toto {
    setConfig() {
        // Do nothing
    }
}

Следовательно, возможны два подхода:

  1. Задайте значения непосредственно в конструкторе и повторите код в пределах setConfig:
class Toto {
    color: string;

    constructor(config: Config) {
        this.color = config.color;
    }

    setConfig(config: Config) {
        this.color = config.color;
    }
}

Обратной стороной этого является повторение кода.

Установка начального пустого значения для свойства.
class Toto {
    color: string | null = null;

    constructor(config: Config) {
        this.setConfig(config)
    }

    setConfig(config: Config) {
        this.color = config.color;
    }
}

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

1 голос
/ 14 июля 2020

Если вы как разработчик уверены, что color не будет go неинициализирован в конструкторе, вы можете просто сообщить компилятору, что это так:

type Config = {
    color: string;
}

class Toto {
    color!: string;

    constructor(config: Config) {
        this.setConfig(config);
    }

    setConfig(config: Config) {
        this.color = config.color;
    }
}

! сообщает компилятор, что эта переменная не будет иметь значение null в момент, когда используется !.

Конечно, в идеальном мире компилятор мог бы обнаружить косвенную настройку, но я не думаю, что в настоящее время это возможно .

Ссылка на игровую площадку

0 голосов
/ 14 июля 2020

Вы можете сделать это так, потому что изначально цвет не определен. Или инициализируйте его пустой строкой, например private color: string = '';.

type Config = {
    color: string;
}

class Toto {

    private color: string|undefined;
    
    constructor(config: Config) {
        this.setConfig(config);
    }

    setConfig(config: Config) {
        this.color = config.color;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...