type ModifiedType = Modify<OriginalType, {
  a: number;
  b: number;
}>
 
interface ModifiedInterface extends Modify<OriginalType, {
  a: number;
  b: number;
}> {}
受ZSkycat extends Omit解决方案的启发,我想出了这个:
type Modify<T, R> = Omit<T, keyof R> & R;
// before typescript@3.5
type Modify<T, R> = Pick<T, Exclude<keyof T, keyof R>> & R
例子:
interface OriginalInterface {
  a: string;
  b: boolean;
  c: number;
}
type ModifiedType  = Modify<OriginalInterface , {
  a: number;
  b: number;
}>
// ModifiedType = { a: number; b: number; c: number; }
一步一步来:
type R0 = Omit<OriginalType, 'a' | 'b'>        // { c: number; }
type R1 = R0 & {a: number, b: number }         // { a: number; b: number; c: number; }
type T0 = Exclude<'a' | 'b' | 'c' , 'a' | 'b'> // 'c'
type T1 = Pick<OriginalType, T0>               // { c: number; }
type T2 = T1 & {a: number, b: number }         // { a: number; b: number; c: number; }
TypeScript 实用程序类型
v2.0 深度修改
interface Original {
  a: {
    b: string
    d: {
      e: string // <- will be changed
    }
  }
  f: number
}
interface Overrides {
  a: {
    d: {
      e: number
      f: number // <- new key
    }
  }
  b: {         // <- new key
    c: number
  }
}
type ModifiedType = ModifyDeep<Original, Overrides>
interface ModifiedInterface extends ModifyDeep<Original, Overrides> {}
// ModifiedType =
{
  a: {
    b: string
    d: {
      e: number
      f: number
    }
  }
  b: {
    c: number
  }
  f: number
}
ModifyDeep 在下面找到。