React TypeScript Object становится неопределенным, если он получает доступ к состоянию - PullRequest
0 голосов
/ 23 февраля 2020

У меня есть простой старый класс цветов, который я использовал во многих местах в моем приложении:

const Color = {
    [...]
    cardBackground: '#f8f8f8',
    sidebarBackground: '#eeeeee',
    viewportBackground: '#D8D8D8',
    [...]
}

export default Color;

Это просто работает. Теперь я хочу реализовать поддержку темного режима без изменения внешних модификаций кода. Я решил подключиться к состоянию, прочитать его напрямую и вернуть в getter соответствующее значение:

const Color = {
    [...]
    cardBackground: '#f8f8f8',
    get sidebarBackground(){ return lightDark('#eeeeee','#222222') },
    viewportBackground: '#D8D8D8',
    [...]
}

export default Color;

Где lightDark определяется как:

export function lightDark<T1, T2>(light:T1, dark:T2){
    return themeSelector(store.getState()) == 'dark' ? dark : light;
}

Теперь я неожиданно получаю undefined ошибка в первую очередь при доступе к Color (не обязательно Color.sidebarBackground, но что-либо внутри Color)

Если я изменю код для удаления доступа к состоянию (только для тестирования) , он начинает работать:

export function lightDark<T1, T2>(light:T1, dark:T2){
  return themeSelector({session:{theme:'dark'}} as any)  == 'dark' ? dark : light;
}

Что происходит на Земле?

Для уточнения, это точная ошибка:

TypeError: Cannot read property 'title' of undefined

, где я пытаюсь получить доступ Color.title, который, по-видимому, является первой ссылкой на Color в моем приложении (таким образом, title не имеет значения).

Я также понял, что в тот момент, когда я ссылаюсь на store в любом Кстати, все в файле, где определено Color, Color становится неопределенным. Даже console.log(store); приводит к тому, что Color становится неопределенным.

1 Ответ

0 голосов
/ 26 февраля 2020

Обнаружил проблему: что-то import ed в store было косвенно , которое в какой-то момент получило доступ к Color, создавая трудно обнаруживаемую циклическую зависимость. Я немного избавился от ссылки путем рефакторинга, и проблема решена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...