是否可以删除子类/接口中的继承字段/方法



大致如下:

interface A {
  a: number;
  x: any;
}
interface B extends A {
  b: number;
}
interface C {
  a: number;
  b: number;
}

因此,B等于C(省略字段x但仍扩展A)。可能吗?如果是这样,如何?

不可能

删除 TypeScript 中接口的继承字段/方法。

但是您可以通过接口重新设计来克服这个问题:

  1. 提取基本接口

    interface BaseA {
      a: number;
    }
    interface A extends Base A {
      x: any;
    }
    interface B extends A {
      b: number;
    }
    interface C extends BaseA {
      b: number;
    }
    

CB都可以投BaseA.

  1. 使用可选字段

    interface A {
      a: number;
      x?: any;
    }
    interface B extends A {
      b: number;
    }
    interface C extends A {
      b: number;
    }
    

我相信还有其他方法取决于特定的任务上下文。

这是处理删除子接口成员的另一种黑客方法:

interface Base {
  a: number;
  x?: any;
}
interface Child extends Base {
  x?: undefined;
}

这样,字段x根本不应该存在,或者如果存在,则必须将其设置为 undefined在大多数情况下与不存在一样好(除非您尝试枚举类成员或执行类似操作)。

这可以使用打字稿省略类型键来实现,注意在打字稿中您可以一次扩展多个接口。

打字稿省略:

通过从"类型"中选取所有属性来构造类型,然后删除键(字符串文本或字符串文本的并集)。

使用您的示例:

interface A {
  a: number;
  x: any;
}
interface B extends A {
  b: number;
}
interface C extends Omit<A, 'x'>, Omit<B, 'x'> {}

返回:

interface C {
  a: number;
  b: number;
}

工作打字稿游乐场演示

最新更新