Oi, Luiz.
Eu segui as instruções na lição.
Esse é o componente Ordenador:
import styles from './Ordenador.module.scss';
import opcoes from './opcoes.json';
import React, { useState } from 'react';
import classNames from 'classnames';
import { MdKeyboardArrowUp, MdKeyboardArrowDown } from 'react-icons/md';
export type OpcoesOrdenador = '' | 'porcao' | 'qtd_pessoas' | 'preco';
interface Props {
ordenador: OpcoesOrdenador,
setOrdenador: React.Dispatch<React.SetStateAction<OpcoesOrdenador>>
}
export default function Ordenador({ ordenador, setOrdenador }: Props) {
const [aberto, setAberto] = useState(false);
const nomeOrdenador = ordenador && opcoes.find(opcao => opcao.value === ordenador)?.nome;
return (
<button
className={classNames({
[styles.ordenador]: true,
[styles["ordenador--ativo"]]: ordenador !== ""
})}
onClick={() => setAberto(!aberto)}
onBlur={() => setAberto(false)}
>
<span>{nomeOrdenador || "Ordenar Por"}</span>
{aberto ? <MdKeyboardArrowUp size={20} /> : <MdKeyboardArrowDown size={20} />}
<div className={classNames({
[styles.ordenador__options]: true,
[styles["ordenador__options--ativo"]]: aberto
})}>
{opcoes.map((opcao => (
<div className={styles.ordenador__option} key={opcao.value}
onClick={() => setOrdenador(opcao.value)}
>
{opcao.nome}
</div>
)))}
</div>
</button>
)
}
Esse é o componente Cardapio:
import styles from './Cardapio.module.scss';
import { ReactComponent as Logo } from 'assets/logo.svg';
import Buscador from './Buscador';
import { useState } from 'react';
import Filtros from './Filtros';
import Ordenador, { OpcoesOrdenador } from './Ordenador';
import Itens from './Itens';
export default function Cardapio() {
const [busca, setBusca] = useState("");
const [filtro, setFiltro] = useState<number | null>(null);
const [ordenador, setOrdenador] = useState<OpcoesOrdenador>('');
return (
<main>
<nav className={styles.menu}>
<Logo />
</nav>
<header className={styles.header}>
<div className={styles.header__text}>
A casa do código e da massa
</div>
</header>
<section className={styles.cardapio}>
<h3 className={styles.cardapio__titulo}>Cardápio</h3>
<Buscador busca={busca} setBusca={setBusca} />
<div className={styles.cardapio__filtros}>
<Filtros filtro={filtro} setFiltro={setFiltro}/>
<Ordenador ordenador={ordenador} setOrdenador={setOrdenador} />
</div>
<Itens busca={busca} filtro={filtro} ordenador={ordenador} />
</section>
</main>
)
}
O erro aparece no componente Ordenador, nessa linha:
<div className={styles.ordenador__option} key={opcao.value}
onClick={() => setOrdenador(opcao.value)} // Argument of type 'string' is not assignable to parameter of type 'SetStateAction<OpcoesOrdenador>'
>
Mas se eu tiro a tipagem do useState, o erro passa pro componente Cardapio:
<Ordenador ordenador={ordenador} setOrdenador={setOrdenador} /> // Type 'string' is not assignable to type 'OpcoesOrdenador'.ts(2322)
index.tsx(9, 5): The expected type comes from property 'ordenador' which is declared here on type 'IntrinsicAttributes & Props'