首页 > 解决方案 > 操作现有的接口/对象类型

问题描述

我正在寻找Generic<>可以执行以下操作的打字稿:

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

标签: typescript

解决方案


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

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

推荐阅读