#Infer combined types form nested HOF

3 messages · Page 1 of 1 (latest)

tall holly
#

So we have a function that attempts to check our session, request body / query and responses against Zod schemas
https://www.typescriptlang.org/play?#code/JYWwDg9gTgLgBAbwFoQCYBUCeYCmAaOALwF84AzKCEOAckLRoChRJZEA5HADxgEExgAJRwBHAK44AzjAKce-IVMgA7STlIUqtZdxhMW0eAgBCAQzUKAygGMAFjhCmNlajQB0AegBG5nFbsOpkyM3Kzw1hCq8ADmODDGaJgACqZQalBwALxwADwAkpZSksCRNvaOAHwAFIxwcGqSxaUBjgBccCgY2Dj5hY0lymWBFXiMAJRZFbm1cHnC4lIwQ45wujjKqJJwZhYCy6ajdQDywpIqavurPOubcMIRUKg50lDAytEEYsoA1soQAO7KEYzPJyPgCeYSaRXGA3LZHEDAGA5GZ1MEKSGLQ51WgNJrKGhwAA+tBAcVsDGJtC8iUJJJoCygmCYdSmADJUbNMdJLmzEJy6niBu0CkUBvtOcRGNUZlBRFCli1TO1OlhcPluYryqZgXU5WdIhclQB+FVoNU9E5KQ04fa61ZQShQAAyEGisSg7SqOEd7S+vwBygmmSmADcIMBUFk4FVg1MEMRRnH+Xq4mIoMoY9YvF65SIReiIfKsXB9e1C4oDaocMnw5Hk+ZMMprDHOXny7oMcXoXyEELIqa7jgHk8Xm8PnB-X9ARVE22pB35EWq2pscmEJyYEyUzjBWLmtq3GBUmoqnm3P2g5K4NZTDA7DGfVAJhvd3Un9BXe6fd7HWMBQ6Tpfh6Z6iBe+5Xm+pZphm0GSBeMB3mIkhVAArAADOhYxuDcVQ0G8oamAANpG9QQeQ0C0HAADU0EiG46ZEf+u5SruERRHRCoACJxKYwBEVsmQAeeZIwBSUYAISZNkNAAOIAKLoCyUFwMaO4qTionie0Inkmg2IaXUbjGaB9E0qgmCqYg5mYO0ABSlhHOwR4njgpluDZYykO0CZjAZKmsSpPkAVBWloO0cmKTQ-kacZbjuYyllqQgiU6WBiXeYgxB+SFOKBXUW6Wa+b7sdCeYKikaTjqcYhEfA2TlYs+wuWkbmNdIPGIfxkj-gBpXwMerWoKc0b6uctpKrlalVMVhlwHF+oxSpABWkiRLm7RWiuE3asm+puKtkSgdtzWDaez45XNpDmHAFanONzFBTG+pwDdd3WtWvVQXKMDppm2YzQtogEEDCzSJVxTvDVdXXVsoKdkWYMyHAZ04MNUiPXUpC3vetiPn+6k4h+LpuiBT6YziP1-XBCFIShGFYThGyxpKMxSlKIRcGEN6GvANkQz60axPEiQC1ANR1IQbhyiOVRS2O7yxgQUtToGsbYdAcsMRsOBkG8aPq0mjBAA

I want to add some helpers to infer types.

I have added this which correctly infers the request type, including and query, body or session object:

export type InferredRequest<
  Inner extends ReturnType<ReturnType<typeof getBodyParser>>
> = Parameters<Parameters<Inner>[0]>[0]
novel kindleBOT
#

@tall holly Here's a shortened URL of your playground link! You can remove the full link from your message.

mildfuzz#0

Preview:```ts
import {ZodType, z} from "zod"
import {NextApiRequest, NextApiResponse} from "next"
import {BaseApiSchema} from "./baseApiSchema"

export const getBodyParser =
<ISessionSchema>(
sessionSchema: ZodType<ISessionSchema>
) =>
<
IRequestSchema extends BaseApiSchema,
OResponseSchema extends Record<string, unknown>,
INextApiRequest extends Omit<
NextApiRequest,
"session" | "method" | "body" | "query"
> &
IRequestSchema & {
session: ISessionSchema
}

(
requestSchema: ZodType<IRequestSchema>,
responseSchema?: ZodType<OResponseSchema>,
errorLogger: (err: unknown) => void = () => {}
) => {
return (
cb: (
req: INextApiRequest,
...```

tall holly
#

In order to do the same with the response, I need to improve the typing of the response object:
https://www.typescriptlang.org/play?#code/JYWwDg9gTgLgBAbwFoQCYBUCeYCmAaOALwF84AzKCEOAckLRoChRJZEA5HADxgEExgAJRwBHAK44AzjAKce-IVMgA7STlIUqtZdxhMW0eAgBCAQzUKAygGMAFjhCmNlajQB0AegBG5nFbsOpkyM3Kzw1hCq8ADmODDGaJgACqZQalBwALxwADwAkpZSksCRNvaOAHwAFIxwcGqSxaUBjgBccCgY2Dj5hY0lymWBFXiMAJRZFbm1cHnC4lIwQ45wujjKqJJwZhYCy6ajdQDywpIqavurPOubcMIRUKg50lDAytEEYsoA1soQAO7KEYzPJyPgCeYSaRXGA3LZHEDAGA5GZ1MEKSGLQ51WgNJrKGhwAA+tBAcVsDGJtC8iUJJJoCygmCYdSmADJUbNMdJLmzEJy6niBu0CkUBvtOcRsaDdBilJE1DC4XB0RD5aoeid1RcWqYKoxqjMoKIoUtde1OlhcPluWbynrscazgqcPsLWgrZrTudXbqptlCG4dAA3HBQKpjbFhyhQAAyEGisSg7Sq0faX1+AOUE0yU2DEGAqCycAjk0QUvGZYQRriYigyhL1i8KeNIhFqsUC2kBCd7dlaudGpzeYLqGHcHMmGU1hLnNb7Q7trgfIQQsiAH52vdoE8Xm8PnAM39ARUKzi4L2Vf3FIO1Njx9XzzAmfzz4Kxc17W4wKk1FVW24a7ZpKcDWKYMB2CW0YTI+b7RtA8aJmGqZQFAYwCqsqEIQmSb-qIgEfsBb4XrW9YkZIgEwOBYiSFUACsAAMDFjG4NxVDQbzBqYAA2hb1IR5DQLQcAANQkSIbh1tx6HnsQnIRFE4mmgAInEpjANxWyZBhAFkjAFJFgAhJk2Q0AA4gAougLLEXA66vrZ556QZ7S6eSaDYo5dRuD5eESTSqCYHZiABZg7QAFKWEc7Dfr+OB+W4oVjKQ7QIMQkYYbJmVwKl2VOe5qDtOZVk0J5Xk+W4CWMkF9kINVrn4dVKXlhlXlwHJT4vrB54KdCramikaT7qcYjcfA2T9Ys+yxWk8WTdIqlURpkjoRhvXwD+s2oKcxbdW+FVOmV54AFaSJELbtFqt6+va45Om4p2RHh13TZtf5oa1b6kOYsyLtqOCMDppENk2VQIAdogEBDXYwINxTvCNY3fVsMryGqMMEG9ODbVIMk4qQYEQbYUGoTBGHwXGOHIdBQMwHWDb3dI1G0YxzGsRsEaSjMclySEXBhKBCrwKFcNhsWsTxIkovhjMgbGg8qBVIGe7vBGBCBkeWYRix0BK5JGw4GQbzY9rozoUAA

but when I run the following:

export const parserDelegate = getBodyParser(sessionSchema)(
  myZodRequestSchema,
  myZodResponseSchema,
)
type InferredRequest = InferredRequest<
  typeof parserDelegate
>

I see the attached error. I can't quite figure out what I am doing wrong