TypeScript говорит, что объект, возможно, равен нулю, хотя я явно установил его - PullRequest
1 голос
/ 04 августа 2020

Итак, у меня есть интерфейс PropertyValue, где свойство descr_json является либо объектом, либо null:

export interface Property {
    descr_json: Array<string>;
    descr: string;
    id: number;
}

export interface PropertyValue {
    descr_json: { [key: string]: string } | null;
    descr: string | number | null;
    id?: number;
}

Затем в моем коде в какой-то момент я пытаюсь добавить значения к descr_json свойство объекта PropertyValue:

if (property.descr_json && property.descr_json.length) {
    propertyValue.descr_json = {};
    property.descr_json.forEach(subProperty => {
        propertyValue.descr_json[subProperty] = '';
    });
}

Но внутри forEach TS жалуется, что propertyValue.descr_json, возможно, имеет значение null, хотя я явно установил его как пустой объект в предыдущей строке .

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

Что мне здесь не хватает?

1 Ответ

2 голосов
/ 04 августа 2020

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

в ситуации, когда вы нужно, чтобы его обрабатывали как "действительно не нулевой", постфиксируйте его с ненулевым оператором утверждения (восклицательный знак)

Я не думаю, что транспилятор заботится о том, определили вы его или нет, его просто волнует, что тип равен, и если его nullable в машинописном смысле слова (т.е. число? или строка?), то его тип на самом деле будет string | null или number | null, и прозрачность не будет заботить, есть ли у вас явно установить или нет . Это то, во что я верю, кто-то поправит меня, если я ошибаюсь

  var x : string | null = null
  var y = x.substring(0, x.length / 2); // oop! it could be null compilation error
  var y = x!.substring(0, x!.length / 2); // use of assert non null operator prevents transpilation error

Другой возможной альтернативой было бы использовать правильно набранный временный объект, а затем назначить его descr_json

const temp: { [key: string]: string } = {};
property.descr_json.forEach(subProperty => {
  temp[subProperty] = '';
});
pValues.descr_json = temp;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...