操作现有的界面/对象类型

时间:2019-02-13 14:52:27

标签: 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}>

1 个答案:

答案 0 :(得分:0)

这是一个非常冗长的工作示例。

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>>>;