Проверка того, является ли объект неопределенным с переменной, не работает Typescript

#typescript #typescript-typings

Вопрос:

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

 type Fruit = "apple" | "orange";

type State = {
  [id in string]?: {
      [fruit in Fruit]: {
          status: "ripe" | "rotten";
      };
  };
};

const state: State = {};

const id = "hello";

if (state[id]) {
  state[id].apple.status = "ripe";
  ^^^^^^^^^
  Object is possibly 'undefined'.(2532)
}

if (state["hello"]) {
  // This is perfectly OK
  state["hello"].apple.status = "ripe";
}
 

Почему это так?

См. раздел Игровая площадка для машинописи

Комментарии:

1. Да, эти проверки не работают в TS. Вам нужно проверить переменную, например, const myThing = state[id]; if (myThing) { myThing.apple.status = "ripe"; }

2. Мой ответ решил вашу проблему?

Ответ №1:

Вы можете использовать ! typescript, игнорируя тот факт, что значение может быть неопределенным, что в вашем случае не так

 state[hello]!.apple.status = "ripe";
 

Ответ №2:

Используйте любой из них вместо проверки с помощью просто состояния[«привет»]

  1. !!состояние[«привет»]
  2. состояние[«привет»] !== не определено

Комментарии:

1. » если (состояние[«привет»]) всегда будет истинным». нет, если свойство отсутствует или значение является ложным, то if не сработает.

2. if (!!state['hello']) это в точности то же самое, что if (state['hello'])

3. Кроме того, state['hello'] !== undefined (у вас отсутствует d в конце) будет работать только в том случае , если ключ либо отсутствует, либо установлен в undefined значение, а не если это какое-либо другое ложное значение. Особенно примечательно null .