'React: How filter data with buttons

I am new to learning React and TypeScript and I've been following this tutorial https://developer.mozilla.org/en-US/docs/Learn/Tools_and_testing/Client-side_JavaScript_frameworks/React_interactivity_filtering_conditional_rendering to filter a todo list with buttons. I have this error when I try to filter the list.

 Element implicitly has an 'any' type because expression of type 'string' can't be used to index type '{ All: () => boolean; Active: (task: TaskItem) => boolean; Completed: (task: TaskItem) => boolean; }'.
  No index signature with a parameter of type 'string' was found on type '{ All: () => boolean; Active: (task: TaskItem) => boolean; Completed: (task: TaskItem) => boolean; }'.
    49 |       ))}
    50 |
  > 51 |       {tasks.filter(FILTER_MAP[filter]).map((task) => (
       |                     ^^^^^^^^^^^^^^^^^^
    52 |         <TaskList tasks={tasks} setTasks={setTasks} key={task.id} />
    53 |       ))}

I think it's because FILTER_MAP as properties of type boolean and filter is a string, but I don't know how to fix it. Does anyone have any advice? Thanks

import React, { useState } from "react";
import "./App.css";
import AddTask from "./components/AddTask";
import { TaskItem } from "./common/models";
import TaskList from "./components/TaskList";
import FilterButton from "./components/FilterButton";

const FILTER_MAP = {
  All: () => true,
  Active: (task: TaskItem) => !task.isCompleted,
  Completed: (task: TaskItem) => task.isCompleted,
};

const FILTER_NAMES = Object.keys(FILTER_MAP);

const App: React.FC = () => {
  const [task, setTask] = useState<string>("");
  const [tasks, setTasks] = useState<TaskItem[]>([]);
  const [filter, setFilter] = useState("All");

  const handleAddTask = (e: React.FormEvent) => {
    e.preventDefault();

    if (task) {
      setTasks([
        ...tasks,
        {
          id: Date.now(),
          task,
          isCompleted: false,
        },
      ]);
    }
    setTask("");
  };

  return (
    <div className="App">
      <span className="task-header">Task Tracker</span>
      <AddTask task={task} setTask={setTask} handleAddTask={handleAddTask} />
      {FILTER_NAMES.map((task) => (
        <FilterButton
          key={task}
          task={task}
          isPressed={task === filter}
          setFilter={setFilter}
        />
      ))}

      {tasks.filter(FILTER_MAP[filter]).map((task) => ( 
        <TaskList tasks={tasks} setTasks={setTasks} key={task.id} />
      ))}
    </div>
  );
};

export default App;


Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source