首页 > 解决方案 > 使用 Pick 泛型类型实现接口时,仅默认选择所需成员

问题描述

我使用以下通用类型。

interface Bar {
    bar: number,
    foo: number,
    baz?: number
}

class Foo implements Pick<Bar, 'foo' | 'baz'> {

}

当我尝试使用该建议来导入缺少的实现时,它会默认选择所有成员。如何仅选择默认需要的那些?

在此处输入图像描述

标签: javascripttypescriptjetbrains-ide

解决方案


我在https://gist.github.com/eddiemoore/7873191f366675e520e802a9fb2531d8找到了识别可选键的解决方案,但我不知道它是如何工作的,即使在研究了很长时间之后也是如此。试图简化实现,因为它似乎有很多不需要的东西,但我失败了。它有效,但很神奇。

type Undefined<T> = { [P in keyof T]: P extends undefined ? T[P] : never }

type FilterFlags<Base, Condition> = {
  [Key in keyof Base]:
  Base[Key] extends Condition ? Key : never
};

type AllowedNames<Base, Condition> =
  FilterFlags<Base, Condition>[keyof Base];

type SubType<Base, Condition> =
  Pick<Base, AllowedNames<Base, Condition>>;

type OptionalKeys<T> = Exclude<keyof T, NonNullable<keyof SubType<Undefined<T>, never>>>

//BLACK MAGIC IMPLEMENTATION ABOVE

interface Bar {
    bar: number,
    foo: number,
    baz?: number
}

type OptionalBar = OptionalKeys<Bar>;

class Foo implements Omit<Bar,OptionalKeys<Bar>>  {

}

推荐阅读