crystal icon indicating copy to clipboard operation
crystal copied to clipboard

Broken type helper (GetPgResourceRelations)

Open wesselvdv opened this issue 2 years ago • 4 comments

Summary

Various type helpers appear to be broken (GetPgResourceRelations) for example always returns any even when supplying a fully typed PgResource with explicit relations. I would advice to use infer instead of property access to prevent type erasure.

Below works:

type GetRegistry<U> = U extends PgResource<any, any, any, any, infer R>
  ? R
  : never
type GetRelations<U> = U extends PgRegistry<any, any, infer R> ? R : never
type GetCodec<U> = U extends PgResource<any, infer C, any, any, any>
  ? C
  : never
type GetName<U> = U extends PgCodec<infer N, any, any, any, any, any, any>
  ? N
  : never
type GetPgResourceRelations<U> = U extends PgResource<
  any,
  any,
  any,
  any,
  any
>
  ? GetRelations<GetRegistry<U>>[GetName<GetCodec<U>>]
  : never

Whereas this doesnt:

type GetPgResourceRelations<TResource extends PgResource<any, any, any, any, any>> = TResource["registry"]["pgRelations"][TResource["codec"]["name"]];

wesselvdv avatar Sep 22 '23 09:09 wesselvdv

Seems it's not entirely the fault of these type helpers. Seems I made some mistakes trying to make it fit into the existing PgRegistry which has type parameters that are narrowing too much.

wesselvdv avatar Sep 22 '23 17:09 wesselvdv

Alright, looks like the issue is narrowing too much in the type parameters of PgRegistry. Causing typescript to get a union of "ExpliciitProperty" | string for relation properties which is the same as string.

wesselvdv avatar Sep 22 '23 18:09 wesselvdv

I found when using inference that TypeScript would quickly resort to any's, potentially due to inference depth limits, but by using the [] syntax it would keep the types for a lot longer.

benjie avatar Sep 28 '23 14:09 benjie

If you're interested; here is where I used to use the inferrence: https://github.com/graphile/crystal/blame/cf0090f3261df3035853e5bd4e15e174987997a5/grafast/dataplan-pg/src/interfaces.ts#L806

benjie avatar Sep 28 '23 14:09 benjie