• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Property does not exist on type 'never'. typescript redux react

0 głosów
886 wizyt
pytanie zadane 3 września 2020 w JavaScript przez poldeeek Mądrala (5,870 p.)

Przy próbie dobrania się do stanu redux'a :

  const isLoading = useSelector((state: RootState) => state.auth.isLoading);

Podkreśla mi na czerwono .isLoading z takim błędem:
 

Property 'isLoading' does not exist on type 'never'.ts(2339)

 

rootReducer
 

import { combineReducers } from "redux";

import authReducer from "./authReducer";

const rootReducer = combineReducers({
  auth: authReducer,
});

export default rootReducer;

export type RootState = ReturnType<typeof rootReducer>

 

1 odpowiedź

+1 głos
odpowiedź 3 września 2020 przez jankustosz1 Nałogowiec (30,160 p.)
wybrane 3 września 2020 przez poldeeek
 
Najlepsza

Spróbuj dać // @ts-ignore i zobacz, czy działa jak trzeba, będzie to znaczyło że błąd jest w typach. 

Wydaje mi się, że ta linia nie ma powodu by działać:

export type RootState = ReturnType<typeof rootReducer>

Moim zdaniem należałoby dla każdego reducera mieć interfejs z jego statem i w tym piku je połączyć.

komentarz 3 września 2020 przez poldeeek Mądrala (5,870 p.)

Wziąłem to stąd : https://react-redux.js.org/using-react-redux/static-typing.

Jednak to co mówisz ma większy sens moim zdaniem. 
Stworzyłem interfejs dla authReducer'a :
 

export interface authTypes {
  user: {
    birth: String;
    city: String;
    email: String;
    id: String;
    name: String;
    surname: String;
  } | null;
  authError: String | null;
  isLoading: boolean;
  isAuthenticated: boolean;
}

Tyle, że przy próbie dostania się do niego w ten sposób:
 

  const isLoading = useSelector((state:authTypes) => state.auth.isLoading);

Dostaję :
 

Property 'auth' does not exist on type 'authTypes'.ts(2339)

Co ma sens jak nad tym pomyślę, ponieważ pewnie muszę je jakoś połączyć w całość w pliku rootReducer:
 

import { combineReducers } from "redux";

import authReducer from "./authReducer";

const rootReducer = combineReducers({
  auth: authReducer,
});

export default rootReducer;

Tyle, że problem polega na tym, że nie mam pojęcia w jaki sposób to zrobić..

1
komentarz 3 września 2020 przez jankustosz1 Nałogowiec (30,160 p.)

Rzeczywiście jest to podane w dokumentacji, to nie wiem czemu nie działa.

Odnośnie tego kodu, to nie działa, bo authTypes nie ma pola auth. Powinieneś dołożyć do tego kodu na dole:

interface IMergedReducers{
 auth: authTypes
 /// i wiecej jeżeli będzie potrzebne
}

i używać przy useSelector IMergedReducers

komentarz 3 września 2020 przez poldeeek Mądrala (5,870 p.)
Właśnie zdążyłem to napisać w ten sposób i jest wszystko dobrze. Mam pytanie, bo już kilka razy się spotkałem z tym "I" przed nazwami interfejsów. To jest skrót od interface i jakaś dobra praktyka, aby tak pisać?
komentarz 3 września 2020 przez jankustosz1 Nałogowiec (30,160 p.)
Ja to piszę, bo czasami coś ma nazwę bez 'i', a potrzebuję zrobić to tego interfejs to dopisuję 'i'. W sumie jakoś tak się przyzwyczaiłem, że teraz wszędzie to piszę. W niektórych językach jest to standard, że pisze się przed interfacem I np. C#.

Ale w sumie jest to obojętne

Podobne pytania

+1 głos
0 odpowiedzi 713 wizyt
0 głosów
0 odpowiedzi 198 wizyt
pytanie zadane 10 lipca 2020 w JavaScript przez poldeeek Mądrala (5,870 p.)
0 głosów
0 odpowiedzi 50 wizyt

86,448 zapytań

135,207 odpowiedzi

300,348 komentarzy

57,196 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...