PickIfContains 类型以在对象中选择键是否属于对象定义

PickIfContains type to pick in an object whether the keys belongs to the object definition or not

我正在尝试构建一个类型,如果对象包含该键,该类型将选择该对象的任何键(与该键是否在对象类型上定义的事实无关。(Pick 需要属于对象类型的键)

type PickIfContains <T, K extends string []> = {
  [P in K [number]]: P extends keyof T ? T [P] : never
}

type A = {a: number, b: number}
type B = PickIfContains <A, ['a', 'c']>
// GIVEN: {a: number, c: never}
// EXPECTED: {a: number}

如何在生成的类型中删除设置为 never 的键?

我确实找到了答案 只是有点冗长

type PickIfContains <T, K extends string []> = {
  [
    P in {
      [P in K [number]]: P extends keyof T ? P : never
    } [K [number]]
  ]: T [P]
}

如果有人有更好的解决方案,请不要犹豫;)

是的,我相信你可以做比

更简单的事情
type PickIfContains<T, K extends string> = {
    [L in Extract<keyof T, K>]: T[L]
}

Live demo