代码之家  ›  专栏  ›  技术社区  ›  ffxsam

如何通过扩展从TypeScript接口删除字段

  •  2
  • ffxsam  · 技术社区  · 6 年前

    假设有一个接口我无法控制:

    interface Original {
      name: string;
      size: number;
      link: SomeType;
    }
    

    我想扩展这个接口,但实际上 link 所以我最终得到了一个新的界面,它有效地:

    interface OriginalLite {
      name: string;
      size: number;
    }
    

    我该怎么做?

    1 回复  |  直到 6 年前
        1
  •  28
  •   jcalz    6 年前

    你可以用 mapped conditional Omit :

    type Omit<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>
    

    所以 Omit<T, K> T 但是在 K interface 打电话 OriginalLite 只缺一个 link :

    interface OriginalLite extends Omit<Original, 'link'> {}
    

    不延伸 Original . 这是因为在TypeScript中“extend”的意思是使一个类型更加具体(也就是说“narrowing”),但在你的例子中,你所做的是使它变得不那么具体(也就是说“wirrowing”)。所以这就是为什么 extends Original 不出现在该定义中。我想你没关系。

    我们来测试一下:

    declare const originalLite: OriginalLite;
    originalLite.name; // string
    originalLite.size; // number
    originalLite.link; // error, property 'link' does not exist on type 'OriginalLite'