I have the following component that I'm migrating to TSX.
import { Component } from "react";
import { useParams } from "react-router-dom";
import Carousel from "./Carousel";
import ErrorBoundary from "./ErrorBoundary";
import ThemeContext from "./ThemeContext";
import Modal from "./Modal";
import { PetAPIResponse, Animal } from "./APIResponseTypes";
class Details extends Component<{ params: { id?: string }}> {
state = {
loading: true,
showModal: false,
animal: "" as Animal,
breed: "",
city: "",
state: "",
description: "",
name: "",
images: [] as string[],
};
async componentDidMount() {
const res = await fetch(
`http://pets-v2.dev-apis.com/pets?id=${this.props.params.id}`
);
const json = (await res.json()) as PetAPIResponse;
this.setState(Object.assign({ loading: false }, json.pets[0]));
}
toggleModal = () => this.setState({ showModal: !this.state.showModal });
adopt = () => (window.location.href = "https://www.petfinder.com/");
render() {
if (this.state.loading) {
return <h2>loading … </h2>;
}
const { animal, breed, city, state, description, name, images, showModal } =
this.state;
return (
<div className="details">
<Carousel images={images} />
<div>
<h1>{name}</h1>
<h2>{`${animal} — ${breed} — ${city}, ${state}`}</h2>
<ThemeContext.Consumer>
{([theme]) => (
<button
onClick={this.toggleModal}
style={{ backgroundColor: theme }}
>
Adopt {name}
</button>
)}
</ThemeContext.Consumer>
<p>{description}</p>
{showModal ? (
<Modal>
<div>
<h1>Would you like to adopt {name}?</h1>
<div className="buttons">
<a href="https://www.petfinder.com/">Yes</a>
<button onClick={this.toggleModal}>No</button>
</div>
</div>
</Modal>
) : null}
</div>
</div>
);
}
}
const WrappedDetails = () => {
const params = useParams<{ id: string }>();
return (
<ErrorBoundary>
<Details params={params} />
</ErrorBoundary>
);
};
export default WrappedDetails;
I see ESlint is showing a problem(Unsafe assignment of an any
value.) in the following line:
const params = useParams<{ id: string }>();
But I'm clueless on how to fix it. I don't want to disable the line or do anything in the .eslintrc.JSON file.
I've tried to typecast it into many types without success.
I know that The useParams hook returns an object of key/value pairs of the dynamic params from the current URL. I just need to figure out the proper type of const params
.
CodePudding user response:
Could you try creating a type like :
type TParams = { id: string };
let { id } = useParams<TParams>();