Get all keys of specific type from object in typescript

Viewed 5361

Title says it all, but an example is best.

interface A {
  key1: string
  key2: string
  key3: number
}

type KeysOfType<O, T> = keyof {
  [K in keyof O]: O[K] extends T ? O[K] : never
}

function test<O,T>(obj: O, key: KeysOfType<O,T>) {
  obj[key] // should only be of type T
}

const aa: A = {
  key1: "1",
  key2: "2",
  key3: 3
}

test<A,string>(aa, "key1") // should be allowed, because key1 should be a string
test<A,string>(aa, "key3") // should NOT be allowed (but is), because key3 should be a number

However, this allows any keyof the interface A. (i.e., both calls above are valid).

Is it possible to do this with typescript?

1 Answers

Change your KeysofType definition to:

type KeysOfType<O, T> = {
  [K in keyof O]: O[K] extends T ? K : never
}[keyof O]

This is explained in detail in this post.

Related