Typescript -ongelmat ja keskustelut

Liittynyt
07.03.2017
Viestejä
1 976
Itse käytän React opiskelussani typescriptiä, mutta ajattelin että sen sijaan että kyselisin typescript keskeisiä juttuja react -keskustelussa, olisi typescriptille pyhitetty keskustelu parempi paikka.

Ongelma. React-router esimerkin toimimaan saaminen typescriptillä ilman olennaisia muutoksia. Alkuperäinen React Router: Declarative Routing for React

Koodi:
function PrivateRoute({ component: Component, ...rest })

Oma versioni
Koodi:
function PrivateRoute( {component, ...rest}: {component:Component}) : JSX.Element {
  return (
    <h3>{ component  }</h3>);
}

function Public(): JSX.Element {
  return <h3>Public</h3>;
}

function Protected() {
  return <h3>Protected</h3>;
}

Virhe tulee seuraavasta rivistä
Koodi:
<PrivateRoute path="/protected" component={Protected} />
ja valitusvirsi on
Koodi:
Type '() => Element' is missing the following properties from type 'Component<{}, {}, any>': context, setState, forceUpdate, render, and 3 more.ts(2740)
App.tsx(50, 47): The expected type comes from property 'component' which is declared here on type 'IntrinsicAttributes & { component: Component<{}, {}, any>; }'
App.tsx(50, 47) viittaa tuohon PrivateRoute jälkimmäiseen komponentti -Tyyppiin

Jos taas katsoo miten tuo React-routerin Route on määritelty, joka ottaa vastaan komponentin, niin se on
Koodi:
export interface RouteProps {
  location?: H.Location;
  component?: React.ComponentType<RouteComponentProps<any>> | React.ComponentType<any>;
  render?: ((props: RouteComponentProps<any>) => React.ReactNode);
  children?: ((props: RouteChildrenProps<any>) => React.ReactNode) | React.ReactNode;
  path?: string | string[];
  exact?: boolean;
  sensitive?: boolean;
  strict?: boolean;
}
export class Route<T extends RouteProps = RouteProps> extends React.Component<T, any> { }

Editti. Seuraava ei kuulukkaan tähän. Vain Route määritys

Mutta sovellukseen se on importoitu
Koodi:
import {
  BrowserRouter as Router,
Ja tuo BrowserRouter on määritelty
Koodi:
export interface BrowserRouterProps {
    basename?: string;
    getUserConfirmation?: ((message: string, callback: (ok: boolean) => void) => void);
    forceRefresh?: boolean;
    keyLength?: number;
}
export class BrowserRouter extends React.Component<BrowserRouterProps, any> {}

Joten miten tuota PrivateRoute funktiota pitäisi oikein ruveta määrittelemään/esittelemään tässä tapauksessa?

Huom. Editoitu.
 
Viimeksi muokattu:
No joko pistät Public ja Protected palauttamaan React.Component tai PrivateRoute ottamaan vastaan JSX.Element ?
 
No joko pistät Public ja Protected palauttamaan React.Component tai PrivateRoute ottamaan vastaan JSX.Element ?
Samainen valitusvirsi myös seuraavalla pätkällä, joka on siis lähempänä alkuperäistä React router esimerkkiä
Koodi:
function PrivateRoute( {component, ...rest}: {component:Component}) {
  return (
    <h3>{ component  }</h3>);
}

function Public() {
  return <h3>Public</h3>;
}

function Protected() {
  return <h3>Protected</h3>;
}
 
Seuraavalla kääntyy, mutta ei linkki ei (privateroute) ei vielä toimi
Koodi:
function PrivateRoute<T extends RouteProps = RouteProps>({component, ...rest}: T ) {
  return (
    <Route
      {...rest}
      render={props =>
         (
          <Component {...props} />
        )
      }
    />
  )
}
 
PrivateRoute :n saa toimimaan noilla ohjeilla Implement react-router PrivateRoute in Typescript project

Eli itse tein seuraavasti
Koodi:
interface PrivateRouteProps extends RouteProps {
    component: any;
}

const PrivateRoute = (props: PrivateRouteProps) => {
    const { component: Component, ...rest } = props;

  return (
En kyllä ymmärrä miksi Tarvitaan tuo PrivateRouteProps eikä vain suoraan voi käyttää RouteProps -interfacea?


Nyt sitten on vielä ongelmana PrivateRouten palauttaman staten lukeminen Login -luokassa, eli miten tuo from saadaan luettue vastaanottavassa luokassa?
Koodi:
          <Redirect
            to={{
              pathname: "/login",
              state: { from: props.location }
 
Eli mitä siis herjaa jos käytät RoutePropsia?
Pelkällä RoutePropsilla tulee seuraava herja
Koodi:
JSX element type 'Component' does not have any construct or call signatures.ts(2604)
Ja tulee siis tuosta seuraavasta pätkästä
Koodi:
<Component { ...props } />
 
Vähän nihkeästi näkee noista, mitä olet tekemässä. Laita vaikka Code Sandboxiin ja linkki tänne niin voi helpommin testailla. Miten erityisesti Component on määritelty tai importattu?
 
Tuolla on selitettä ja linkin jampan toimivalle typescript versiolle tähän omaan aloitusongelmaani. React Router Redirect with Typescript
Tuossa esimerkissä lisätään interface ainoastaan login luokkaa varten jolloin tulee accessi props.location.stateen. Tuolla sivulla on myös codesandbox -linkki.
 

Uusimmat viestit

Statistiikka

Viestiketjuista
261 837
Viestejä
4 548 727
Jäsenet
74 851
Uusin jäsen
hieunguyen

Hinta.fi

Back
Ylös Bottom