TypeScript type inference

by Arnaud Buchholz

TypeScript

enum ValueType {
  boolean,
  integer,
  string
}

type BooleanValue = {
  type: ValueType.boolean,
  isSet: boolean
}

type IntegerValue = {
  type: ValueType.integer,
  number: number
}

type StringValue = {
  type: ValueType.string,
  string: string
}

type Value<T = any> = T extends ValueType.boolean ? BooleanValue
              : T extends ValueType.integer ? IntegerValue
              : T extends ValueType.string ? StringValue
              : BooleanValue | IntegerValue | StringValue

const b: Value<ValueType.boolean> = {
  type: ValueType.boolean,
  isSet: true
}

function check (type: ValueType): Value<type> {

}