javascript - 使用 Pick 泛型类型实现接口时,仅默认选择所需成员
问题描述
我使用以下通用类型。
interface Bar {
bar: number,
foo: number,
baz?: number
}
class Foo implements Pick<Bar, 'foo' | 'baz'> {
}
当我尝试使用该建议来导入缺少的实现时,它会默认选择所有成员。如何仅选择默认需要的那些?
解决方案
我在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>> {
}
推荐阅读
- android - onStart() 没有被调用
- css - 为 div 元素的子元素设置样式时出现问题
- java - 将相对布局转换为线性布局
- django - 问题:任何登录用户都可以访问 Django 管理面板
- python - Python - 使用嵌入图像向 GMAIL 发送邮件
- yolo - YOLO & Darknet - 在自定义数据集上进行训练以检测特定类并忽略其他类
- ios - 无法加载捆绑包“CheckoutTests”,因为它已损坏或缺少必要的资源。尝试重新安装捆绑包
- java - JavaEE Hibernate - 在运行时更改数据库模式
- java - OpenCV - 用二进制垫上的线条细化会导致随机水平虚线
- android - 为多个屏幕规划自定义屏幕布局