1

Question

Lets say I have a secretFunc as such

const secretFunc = <T extends object, TName extends keyof T>({
  data,
  name
}: {
  data: T
  name: TName
}) => {
  const value = data[name]
  console.log(typeof value === 'number')
}

As you can imagine, indifferent of the result, the typecheck is not at compile time.

How can I specify a rule such that T[TName] is number for compile time checking?

My (Futile) attempt

This is the closest I could get...

type NumberHost<T, TName extends keyof T> = T[TName] extends number ? T : never

const secretFunc = <T extends object, TName extends keyof T>({
  data,
  name
}: {
  data: NumberHost<T, TName>
  name: TName
}) => {
  if (data) {
    const value = data[name]
    console.log(typeof value === 'number')
  } else {
    console.log('no')
  }
}

secretFunc({ data: { label: 'five', value: 5 }, name: 'value' })

This causes compile errors when I use 'label' for name or when value is not a number. However, I am not convinced this is the best solution ☹️

Lordbalmon
  • 1,634
  • 1
  • 14
  • 31

0 Answers0