noveogroup-amorgunov / nukeapp

An open source frontend application built using the React ⚛️ and Feature-Sliced Design 🍰.
https://nukeapp.netlify.app/
MIT License
332 stars 35 forks source link

mswjs/data infer type from database #17

Open yurisldk opened 1 year ago

yurisldk commented 1 year ago

https://github.com/noveogroup-amorgunov/nukeapp/blob/376ba895b623e04c77cde55c37557e74456f4843/src/entities/cart/api/__mocks__/mockCartDto.ts#L4-L9

@noveogroup-amorgunov если я верно понимаю мы все еще не можем использовать джинерики, https://github.com/mswjs/data/issues/36 что вы думаете по поводу такоей реализации типов?

src\shared\lib\server\types.ts

type DatabaseApiType = typeof db

export type MswCardType = NonNullable<
  ReturnType<DatabaseApiType['cart']['findFirst']>
>

export type MswProductType = NonNullable<
  ReturnType<DatabaseApiType['product']['findFirst']>
>

src\entities\cart\api\__mocks__\mockCartDto.ts

export function mockCartDto(
  cart: MswCardType,
  products: MswProductType[]
): CartDto {
  return {
    deliveryPrice: 0,
    version: cart.version,
    cartItems: cart.itemsProductId
      .map((productId, index) => ({
        product: products.find((product) => product.id === productId),
        quantity: cart.itemsProductQuantity[index],
      }))
      .filter((item) => Boolean(item.product)) as CartDto['cartItems'],
  }
}
noveogroup-amorgunov commented 1 year ago

@sldk-yuri интересное решение. Я бы переименовал тип MswProductType в ProductModel (или ProductDatabaseModal), чтобы не завязываться на MSW (так как в теории можно и другое хранилище подключить) и в целом можно интегрировать, чтобы вручную типы не описывать.

yurisldk commented 1 year ago

@noveogroup-amorgunov Могул ли я открыть пр?

noveogroup-amorgunov commented 1 year ago

@sldk-yuri если все типы корректно опишутся, то да, конечно, спасибо)