javascript - Kilden har 2 element(er), men målet tillader kun 1. Typescript spread-operator
Jeg forsøger at sprede alle værdier i arrayet og tilføje et nyt objekt i min reducer.
min tilstandsgrænseflade:
export interface IBasketState {
products: [
{
id: number | undefined;
name: string;
smallQ: number; //small packages quantity
smallTotalP: number; //price for all small packages
largeQ: number; //large packages quantity
largeTotalP: number; //price for all large packages
orderPrice: number; //total price of this order
}
];
totalPrice: number;
}
Reducer tilføj vare-funktion:
const BasketReducer = (basketState: IBasketState, action: IBasketAction): IBasketState => {
//ADD ITEM
if (action.type === "Add item") {
const { id, name, smallQ, smallP, largeQ, price } = action.payload;
let smallTotalPrice = smallQ * smallP; //total price for small packages
let largeTotalPrice = largeQ * price; //total price for large packages
const orderPrice = smallTotalPrice + largeTotalPrice; //total price of this order
return {
products: [
...basketState.products, //--> **THIS IS NOT WORKING**
{
id: id,
name: name,
smallQ: smallQ,
smallTotalP: smallTotalPrice,
largeQ: largeQ,
largeTotalP: largeTotalPrice,
orderPrice: orderPrice,
},
],
totalPrice: basketState.totalPrice + orderPrice,
};
}
//Default action
return basketState;
};
Når jeg holder musen over ...basketState.products, får jeg en fejl, der siger:
Type '{ id: number | undefined; name: string; smallQ: number; smallTotalP: number; largeQ: number; largeTotalP: number; orderPrice: number; }, { id: number | undefined; name: string; smallQ: number; smallTotalP: number; largeQ: number; largeTotalP: number; orderPrice: number; }' kan ikke tildeles typen '[{ id: number | undefined; name: string; smallQ: number; smallTotalP: number; largeQ: number; largeTotalP: number; orderPrice: number; }]'.
Kilden har 2 element(er), men målet tillader kun 1.ts(2322)
BasketContext.tsx(8, 2): Den forventede type kommer fra egenskaben 'products', som er erklæret her på typen 'IBasketState'
Er problemet det faktum, at jeg i mit interface kun har deklareret ét objekt i products-arrayet, og at jeg nu forsøger at have 2? Hvis ja, hvordan kan jeg omgå det?
Svar #1
Dit gæt er korrekt: products-egenskaben er typet som en tuple, der indeholder præcis ét element.
Hvad du kunne prøve er at gøre det til et array af produkter:
interface BasketState {
products: Product[];
totalPrice: number;
}
interface Product {
id: number | undefined;
name: string;
smallQ: number;
smallTotalP: number;
largeQ: number;
largeTotalP: number;
orderPrice: number;
}
Du kan læse mere om tuple-typer i TypeScript her: https://www.typescriptlang.org/docs/handbook/2/objects.html#tuple-types
Svar #2
Du har erklæret products som en tuple med et enkelt objekt ([T]), i stedet for en liste (T[] eller Array<T>). Så med andre ord, det du ønsker er:
export interface IBasketState {
products: Array<{
id: number | undefined;
name: string;
smallQ: number; //small packages quantity
smallTotalP: number; //price for all small packages
largeQ: number; //large packages quantity
largeTotalP: number; //price for all large packages
orderPrice: number; //total price of this order
}>;
totalPrice: number;
}
Nogle gange kan det være bedre at definere typen af elementet i stedet for listen, så dit interface kan se sådan ud:
export interface IProduct = {
id: number | undefined;
name: string;
smallQ: number; //small packages quantity
smallTotalP: number; //price for all small packages
largeQ: number; //large packages quantity
largeTotalP: number; //price for all large packages
orderPrice: number; //total price of this order
}
export interface IBasketState {
products: IProduct[];
totalPrice: number;
}
