Typescript -ongelmat ja keskustelut

Liittynyt
07.03.2017
Viestejä
1 845
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:

Zigh

Tittelitön
Liittynyt
17.10.2016
Viestejä
4 615
No joko pistät Public ja Protected palauttamaan React.Component tai PrivateRoute ottamaan vastaan JSX.Element ?
 
Liittynyt
07.03.2017
Viestejä
1 845
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>;
}
 
Liittynyt
07.03.2017
Viestejä
1 845
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} />
        )
      }
    />
  )
}
 
Liittynyt
07.03.2017
Viestejä
1 845
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 }
 
Liittynyt
07.03.2017
Viestejä
1 845
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 } />
 
Liittynyt
17.10.2016
Viestejä
14 659
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?
 
Liittynyt
07.03.2017
Viestejä
1 845
Liittynyt
07.03.2017
Viestejä
1 845
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.
 
Toggle Sidebar

Uusimmat viestit

Statistiikka

Viestiketjut
239 410
Viestejä
4 194 516
Jäsenet
70 728
Uusin jäsen
pvarjone

Hinta.fi

Ylös Bottom