export interface ObservableCrate<T> {
get(): T;
set(value: T): void;
}
export type ObservableCrateBuilder<T> = {
build(): ObservableCrate<T>;
} & (
T extends string | number | symbol
? {
withHandlers(transitionHandlers: ObservableCrateTransitionHandlers<T>): ObservableCrate<T>;
}
: {}
);
export interface ObservableCrateFactory {
<T>(initialValue: T): ObservableCrateBuilder<T>;
}
export type ObservableCrateTransitionHandlers<T extends string | number | symbol> = Partial<Record<T, Partial<Record<T, () => void>>>>;
declare const observableCrate: ObservableCrateFactory;
export enum State {
Open = "open",
Close = "close",
}
const crate = observableCrate(State.Close).withHandlers({});
Intelisense splits out the enum variants which breaks the typing
However, if I were to declare a variable with paramater directly it is valid and doesn't get split up:
const handlers: ObservableCrateTransitionHandlers<State> = {};
From what I can tell it has something to do with the T extends string | number | symbol
that is required for using in Record