typescript - 操作现有的接口/对象类型
问题描述
我正在寻找Generic<>
可以执行以下操作的打字稿:
- 给定一个
Root
接口我想覆盖这个接口 - 给定一个
Root
接口,我想将任何属性设为可选 - 我只需要管理
shallow
/顶级属性 Overwrite
接口不应允许任何不在其中的新属性Root
interface Root {
name: string;
age: number | string;
hometown: string
}
interface Overwrite {
age: number; // overwriteing the union
hometown?: Root['hometown'] // making a property optional
}
应该管用:
type RL = Generic<Root, Overwrite> // should have `name`, `age`, `hometown`
应该显示Overwrite
函数错误,因为lastName
不在Root
:
type RL = Generic<Root,{lastName: string}>
解决方案
这是一个非常冗长的工作示例。
export type Merge<A, B> = Omit<A, Extract<keyof A, keyof B>> & B;
export type Omit<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>;
export type Overwrite<A, B extends { [K in keyof B]: K extends keyof A ? A[K] : never }> =
Merge<Omit<Merge<A, B>, Extract<keyof A, keyof B>>, Pick<Merge<A, B>, Extract<keyof A, keyof B>>>;
推荐阅读
- html - 将分页应用于 Angular js 中的表,其中 map 是我在 ng-repeat 中迭代的内容
- python - 在 for 循环中总结列表的元素
- php - 查询 ACF 转发器字段
- uitableview - 使用 Xcode 9.3 构建时 Tableview 不会滚动到底部
- php - 来自CORS预检通道的CORS标头“Access-Control-Allow-Headers”中缺少令牌“access-control-allow-origin”-反应js
- android - 有没有办法检测Android上的拨出电话是否以编程方式被回答或拒绝?
- laravel - 如何使用 Laravel 显示从其他用户收到的消息
- sonarqube - 一段时间后 sonarQube 异常关闭
- laravel - 无法将我的 laravel 应用程序与 facebook 身份验证连接起来
- android - 此方法仅在托管模式下可用 错误按排序