如何从条件键推断对象的值?

时间:2020-10-10 08:32:43

标签: typescript

例如,我想编写一个树遍历函数:

// Pick keys from an object if the value is T[] type
type SubTreesField<T, K extends keyof T> = T[K] extends T[] ? K : never;

function traverse<T, K extends keyof T>(
  t: T,
  key: SubTreesField<T, K>,
  cb: (t: T) => void
) {
  const arr = t[key]; // The 'arr' type is T[SubTreesField<T, K>] instead of T[]
}

1 个答案:

答案 0 :(得分:0)

Typescript无法根据该条件推断T[K]的类型。这太复杂了,无法弄清楚。您需要为T定义一个更明确的约束,以便Typescript知道它的外观。实际上,您根本不需要条件。试试:

function traverse<T extends { [k in K]: T[] }, K extends keyof T>(
  t: T,
  key: K,
  cb: (t: T) => void
) {
  const arr: T[] = t[key]
}