segmentio / typewriter

Type safety + intellisense for your Segment analytics
https://segment.com/docs/protocols/typewriter/
MIT License
228 stars 53 forks source link

Add way to remove additionalProperties ([property: string]: any) #311

Open DylanVann opened 1 year ago

DylanVann commented 1 year ago

Currently the generated types for TypeScript look like:

export interface MyEventProperties {
  email: string
  [property: string]: any;
}

This means that if a property doesn't exist, or is removed, in Protocols, then it will not be a compile error. I think some users (including myself) would prefer to know about excess/removed properties if possible.

I believe that this could be changed by making the JSON Schema include additionalProperties: false on most definitions. It seems the default for QuickType is to generate [property: string]: any; if it is not set to false.

I tried to use a "Common JSON Schema" set to:

{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "type": "object",
  "properties": {
    "context": {},
    "traits": {},
    "properties": {
      "type": "object",
      "additionalProperties": false
    }
  }
}

It did not work though.

henryowens commented 3 months ago

I had the same issue, I didn't manage to prevent the interface allowing any property however I did create a wrapper interface to achieve this:

type MakeStrict<T> = {
  [K in keyof T as string extends K
    ? never
    : number extends K
      ? never
      : K]: T[K];
};

export interface MyEventProperties {
  email: string
  [property: string]: any;
}

type StrictMyEventProperties = MakeStrict<MyEventProperties>
dturkington49 commented 2 months ago

This is also an issue for my team. Built in tracking plan support here would be very valuable.