javascript - Convertendo Componente React para Typescript?
Estou tentando copiar o exemplo de componente React+Redux para TypeScript: https://medium.com/@stowball/a-dummys-guide-to-redux-and-thunk-in-react-d8904a7005d3
Estou chegando a um beco sem saída com a função:
export default connect(mapStateToProps, mapDispatchToProps)(ItemList);
Estou recebendo um erro sobre como não é mapeável para ItemList.
Uma maneira de contornar isso, eu acredito, é alterar a declaração da classe para:
class ItemList extends React.Component<{proper component map}, {proper state map}> {
No entanto, se eu fizer isso porque as props agora foram mapeadas, não posso simplesmente incluir ItemList como e agora espera-se que eu forneça os parâmetros.
Outra opção poderia ser: (props as any).fetchData() no entanto isso parece errado.
Existe uma maneira de contornar isso? Estou fazendo React+Redux errado em TypeScript?
Resposta #1
Depois que você cria tudo, você exporta junto com connect.
interface PassedProps {
productId: number;
}
interface StateToProps {
addedProductIds: number[];
quantityById: { [key: string]: number };
quantity: number;
}
interface DispatchToProps {
addToCart: (productId: number) => void;
removeFromCart: (productId: number) => void;
}
// Needs to be added to src/store:GlobalStore interface with the correct prop name created from the name of the reducer
export interface CartState {
addedProductIds: number[];
quantityById: { [key: string]: number };
}
const mapStateToProps = (globalState: GlobalState): StateToProps => {
const state: CartState = globalState.cart;
return {
addedProductIds: state.addedProductIds,
quantityById: state.quantityById,
quantity: Object.keys(state.quantityById).reduce( (sum: number, key: string) => state.quantityById[key] + sum, 0)
};
};
const mapDispatchToProps = (dispatch: Dispatch<any>): DispatchToProps => {
return {
addToCart: (productId: number) => dispatch({ type: 'ADD_TO_CART', productId } as AddToCartAction),
removeFromCart: (productId: number) => dispatch({ type: 'REMOVE_FROM_CART', productId } as RemoveFromCartAction),
};
}
export type Props = PassedProps & StateToProps & DispatchToProps;
class CartButton extends Component<Props, CartState> {
render() {
const { quantity } = this.props;
return (
<View>
<Text>
{ this.props.addedProductIds.length } type item is in the cart, totals to { quantity } item.
</Text>
<View>
<Button
onPress={this.onPressAdd.bind(this)}
title="Add to Cart"
color="#841584"
/>
<Button
onPress={this.onPressRemove.bind(this)}
title="Removefrom Cart"
color="#841584"
/>
</View>
</View>
);
}
onPressAdd() {
this.props.addToCart(this.props.productId);
}
onPressRemove() {
this.props.removeFromCart(this.props.productId);
}
}
export default connect<StateToProps, DispatchToProps, PassedProps>(mapStateToProps, mapDispatchToProps)(CartButton);
Então você pode usá-lo especificando os props necessários a serem passados (interface PassedProps):
import CartButton from '../components/CartButton';
// ....
render() {
return(<CartButton productId={5} />)
}
