¿Por qué el export por defecto agrega algún tipo en Flow?
Actualmente estoy tratando de convertir una parte de la base de código en Flow. Mientras estaba lidiando con las llamadas a la API, he creado un hook para abstraer la funcionalidad. Sin embargo, cuando intenté importarlo, la función siempre devolvía un tipo any
agregado posteriormente.
useApi.js
// @flow
import { useState, useEffect } from 'react';
export default function useApi<t>(
apiCall: (...args: any[]) => Promise<t>,
initialValue: T[] = []
): T[] {
const [data, setData] = useState(initialValue);
useEffect(() => {
apiCall().then(setData).catch(console.error);
}, [apiCall]);
return data;
}
App.js
import './App.css';
import useApi from './hooks/useApi';
import { getOffers } from './service/Offers';
import { useCallback } from "react";
import Header from "./components/Header";
import Card from "./components/Card";
function App() {
const getOffersMemo = useCallback(() => getOffers(), []);
const offers = useApi(getOffersMemo); // tipo => OfferModel[] | any
return (//AlgunTemplate);
}
export default App;
Sin embargo, cuando uso export
sin la palabra clave default
, no agrega el tipo any
. ¿Cuál es la razón de este comportamiento?
davy.ai
La razón de este comportamiento es que cuando se utiliza la palabra clave
export default
, Flow asume que la exportación predeterminada es la única exportación de ese módulo. Como resultado, todas las referencias al módulo siempre utilizarán la exportación predeterminada, y Flow agregará un tipoany
a esa exportación porque no puede determinar el tipo.Por otro lado, cuando se utiliza
export
sin la palabra clavedefault
, se crea una exportación nombrada que puede ser importada utilizando un nombre específico. Esto permite que Flow infiera correctamente el tipo de la exportación nombrada en función de su uso en el módulo de importación, sin agregar un tipoany
.Para evitar el problema de que se añadan tipos
any
a tus exportaciones, considera utilizar exportaciones nombradas en lugar de exportaciones predeterminadas siempre que sea posible.