【问题标题】:Implement all interface members实现所有接口成员
【发布时间】:2013-01-04 11:40:31
【问题描述】:

我有一个 TypeScript 界面。问题是它有大约 40 名成员。当我使用它并且只实现选定的成员时,我会收到一个错误,指出有一些缺失。如何忽略它?我必须全部实施吗?这个问题使我无法将一种类型转换为另一种类型。

例如

interface A {
   // 40 members
}

class B implements A {
   // only 5 members implemented
}

// somewhere in the code
var myVar1: A = something;
var myVar2: B = <B> myVar1; // here an error (can't convert because B has missing some properties and methods:/)

【问题讨论】:

  • 我遇到的所有语言的接口规则是你必须实现它的所有方法。

标签: typescript


【解决方案1】:

在打字稿中,您可以将项目标记为可选:

interface Person {
    name: string;
    address?: string;
}

name 是必需的,address 是可选的实现

【讨论】:

  • 你必须实现整个接口,但你可以做一些可选的,如下所示。但是,如果您有时确实希望实现所有某些功能,但有时又想要不同的集合,则可以创建如下@SteveFenton 所示的内容
【解决方案2】:

如果你承诺实现一个接口,你就必须实现它。

如果您只想处理 B 中的 5 个属性,一个解决方案是有一个实现 40 个属性的基类。

interface A {
   propA: string;
   propB: string;
}

class C implements A {
    public propA = "";
    public propB = "";
}

class B extends C {
   public propB = "Example";
}

var myVar1: A;
var myVar2: B = <B> myVar1;

【讨论】:

    【解决方案3】:

    一个界面中的40个项目相当多。

    此外,如果某个类只需要 5 个,则表明存在设计问题。

    另一种设计是拥有多个相关接口并将属性划分为更多逻辑组。

    interface ICar ...
    interface IRacingCar : ICar
    interface IFlyingCar : ICar
    interface IFamilyCar : ICar
    

    那么你就可以拥有一个实际实现多个接口的类。

    class RaceCar: IRacingCar ...
    class FlyingRaceCar: IRaceCar, IFlyingCar ...
    class FlyingFamilyCar: IFlyingCar, IFamilyCar ...
    

    此外,您应该避免从接口转换为特定类,除非您确定对象实际上是该类。如果您尝试使用该类的方法,但如果对象不是真正存在的类型,则会出现问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-03
      • 2013-08-19
      • 1970-01-01
      • 2016-05-08
      • 2015-06-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多