ricokahler / sanity-codegen

Generate TypeScript types from your Sanity.io schemas
sanity-codegen-dev.vercel.app
MIT License
270 stars 19 forks source link

[v1][codegen] Reference fields are typed as `any` #298

Open ochicf opened 1 year ago

ochicf commented 1 year ago

Generated types for reference fields result in that field being any. This is caused because the Sanity.Reference<...> type is used, which is any.

Example:

/// <reference types="@sanity-codegen/types" />

namespace Sanity.MyNamespace.Schema {
  type MyType =
  | {
      _id: string;
      _type: "myType";
      myReferenceField?: Sanity.Reference<Sanity.Ref.Ref_1234>;
                                // ^? type Sanity.Reference = /*unresolved*/ any 

    }
    | undefined;
}

Manually adding the following code at the top of the generated types fixes the issue, so I guess this should be generated aswell by the codegen:

namespace Sanity {
  type Reference<T> = T | {
    _type: string
    _ref: string
    _key?: string
    _weak?: boolean
    _strengthenOnPublish?: {
      type: string
      weak?: boolean
      template?: {
        id: string
        params: Record<string, string | number | boolean>
      }
    }
  };
}

Note that I copied the object reference definition from @sanity/types, so maybe it could be used from there?


EDIT: I just realised all those types are already defined in @sanity-codegen/types and I didn't have it installed where I'm using the generated schemas (I'm in a monorepo with project+studio). After installing it's still not picking them up, will continue investigating.