#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. » если (состояние[«привет»]) всегда будет истинным». нет, если свойство отсутствует или значение является ложным, то
if
не сработает.2.
if (!!state['hello'])
это в точности то же самое, чтоif (state['hello'])
3. Кроме того,
state['hello'] !== undefined
(у вас отсутствуетd
в конце) будет работать только в том случае , если ключ либо отсутствует, либо установлен вundefined
значение, а не если это какое-либо другое ложное значение. Особенно примечательноnull
.