• 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

Object Storage Arubacloud
0 głosów
1,592 wizyt
pytanie zadane 3 września 2020 w JavaScript przez poldeeek Mądrala (5,980 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 (35,880 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,980 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 (35,880 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,980 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 (35,880 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 1,237 wizyt
0 głosów
0 odpowiedzi 513 wizyt
pytanie zadane 10 lipca 2020 w JavaScript przez poldeeek Mądrala (5,980 p.)
+1 głos
2 odpowiedzi 383 wizyt

92,537 zapytań

141,377 odpowiedzi

319,456 komentarzy

61,923 pasjonatów

Motyw:

Akcja Pajacyk

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

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...