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 ☹️