Best way to use select in a function that is returning a specific type

export type UserID = { userID: number }
type UserPassword = { userPassword: string }
type UserFirstName = { userFirstName: string }
type UserLastName = { userLastName: string }
type UserEmail = { userEmail: string }


type IsSuperAdmin = {
  isSuperAdmin: boolean | null
}

export type VerifyUser = UserID &
  UserFirstName &
  UserLastName &
  UserEmail &
  UserPassword &
  IsSuperAdmin & { role: RoleName & RoleID }


export async function verifyUser(email: UserEmail): Promise<VerifyUser | undefined> {
  const results: VerifyUser[] | undefined = await db
    .select({
      userID: users.userID,
      userFirstName: users.firstName,
      userLastName: users.lastName,
      userEmail: users.email,
      userPassword: users.password,
      isSuperAdmin: users.isSuperAdmin,
      role: {
        roleID: roles.roleID,
        roleName: roles.roleName,
      },
    })
    .from(users)
    .innerJoin(roles, eq(users.roleID, roles.roleID))
    .where(and(eq(users.email, email.userEmail)))
  return results[0] ? results[0] : undefined
}


I don't understand why this code works. It doesn't return something of type VerifyUser yet the type checker doesn't complain.

I am getting:

 {
   userID: 1,
 }

Instead of:

 {
   userID: {userID: 1},
 }
Was this page helpful?