react native - Typescript-fel med tRPC useQuery-argumenttyper i Jest-test
Jag har ett monorepo som innehåller en React Native-app. Inom en av komponenterna har jag följande kod:
const { data: user, refetch } = trpc.useQuery([
"user.get",
{ id: state.user!.id },
])
// Later I use the user I receive from this query.
// Simplified for readability
bluetoothModule.addToDevices(user.devices)
Värdet trpc i koden ovan är inställt på följande sätt, över flera filer i olika arbetsytor:
export const appRouter = createRouter()
.transformer(superjson)
.merge("user.", userRouter)
// Various other routers...
export type AppRouter = typeof appRouter
export const trpc = createReactQueryHooks<AppRouter>()
Det här fungerar bra i den faktiska appen. Däremot har jag nu börjat lägga till ett test som använder react-native-testing-library för att testa den här komponenten.
describe("Sensor Status page", () => {
it("shows sensors correctly", async () => {
render(
<SensorStatus
// Some unrelated props here
/>
)
})
})
När detta test körs får jag följande fel:
Type '{ id: string; }' is not assignable to type '"status" | "user.get" | "auth.authenticate" | "event.overview" | "event.temp" | "event.pressure" | "event.movement" | "event.all" | "user.all" | "device.get"'.
Type '{ id: string; }' is not assignable to type '"device.get"'.
Jag får också detta ytterligare fel när jag försöker använda värdet user.devices.
Property 'devices' does not exist on type 'string | AuthResponse | OverviewResults | GetAllUsersResponse[] | Device | (User & { devices: Device[]; }) | { ...; }[] | { ...; }[] | { ...; }[] | { ...; }'.
Property 'devices' does not exist on type 'string'.
Med lite mer undersökning upptäckte jag att det förväntar sig följande typ för useQuery-funktionen.
[
any,
"status" | "user.get" | "auth.authenticate" | "event.overview" | "event.temp" | "event.pressure" | "event.movement" | "event.all" | "user.all" | "device.get",
any,
[...?]
]
Jag har försökt imitera tRPC, men detta verkar inte påverka TypeScript-kompileringen.
Om jag lägger till ts-ignore-kommentarer i komponenten kommer testet att fungera bra. Men jag vill helst inte försämra appkoden för en tests skull. Vet någon varför Typescript förväntar sig en annan typ i testet, eller vet om ett renare sätt att fixa detta?