-
Notifications
You must be signed in to change notification settings - Fork 28
Description
Is your feature request related to a problem? Please describe.
We currently do this in our code:
launchdarkly-js-common-sdk.d.ts
:
declare module "launchdarkly-js-sdk-common" {
// eslint-disable-next-line @typescript-eslint/no-empty-interface
export interface LDFlagSet {
someFlag: boolean;
anotherFlag: boolean;
}
}
Which allows us to use interface merging in order to get autocompletion on feature flags.
However, since it only extends the existing interface ([key: string]: LDFlagValue
), it's still just as easy to accidentally use a nonexistent flag in the code as any key returned is any
. This means that when deleting a feature flag, its relatively easy to accidentally leave behind parts of code that still reference this key, as the typing still resolves to any
.
Describe the solution you'd like
I would like there to be a convenient way to get type safety for feature flags by defining an override somewhere in the code. The best case scenario for this would be for LDFlagSet to be an empty interface by default, however that's obviously a huge breaking change. If that were the case though, it would make it so that we can strongly type our feature flags by doing the above declaration merging.
Describe alternatives you've considered
We've tried doing more complex typescript type resolution by excluding the builtin types and using our own, but I was never able to get it to work properly. There may be a way, but there a number of outstanding typescript issues here as well that don't give me hope e.g. microsoft/TypeScript#36146