Vyhledávání na webu

reactjs - Vlastnost neexistuje ve stavu - Používání React Router hooků s TypeScriptem


Mám nějaké problémy při používání hooků react-router-dom s TypeScriptem.

Pokusy o přístup k nějaké vlastnosti stavu by vyvolaly chybu s tím, že neexistuje

Odkazujte na:

Jedním z řešení, které jsem musel použít, abych mohl pokračovat ve vývoji, bylo přetypovat to na any

 const location = useLocation() as any;

Jak mohu předat platné rozhraní generiku useLocation, abych mohl přistupovat k vlastnostem stavu bez varování?

  useDidMount(() => {
    if (location.state?.newTransactions) {
      scroll.scrollToBottom();
    }
  });

Odpověď č. 1

useLocation přijímá generický parametr, který určuje typ vlastnosti state, takže:

const location = useLocation<YourStateTypeHere>();

Například:

interface LocationState {
    newTransactions?: boolean;
}

// ...
const location = useLocation<LocationState>();

// ...
useDidMount(() => {
    if (location.state?.newTransactions) {
        scroll.scrollToBottom();
    }
});

Jak jsem se tam dostal (protože jsem to předtím nepoužíval), pro případ, že by to bylo užitečné: Vím, že TypeScriptová vazba pro většinu hooků implementuje alespoň jeden generický parametr, takže když jsem viděl, že location v React Routeru zahrnuje stav definovaný programátorem, předpokládal jsem, že pravděpodobně jeden přijímá. Takže jsem otevřel projekt, kde používám React Router a TypeScript, a najel kurzorem na useLocation v kódu. A skutečně, vyskakovací okno ukázalo generický parametr, který se aplikoval na vlastnost state. Výsledek!

Odpověď č. 2

Nefungovalo to pro router V6

tohle je prohlášení

export declare function useLocation(): Location;

Toto nevyžaduje žádný typ argumentu

Podle problému na GitHubu někdo navrhl

interface CustomizedState {
  myState: string
}

const location = useLocation();
const state = location.state as CustomizedState; // Type Casting, then you can get the params passed via router
const { myState } = state;

Související články