【问题标题】:Is it possible to use an interface with ES6 class getters, setters and private properties in TypeScript是否可以在 TypeScript 中使用带有 ES6 类 getter、setter 和私有属性的接口
【发布时间】:2021-06-19 08:28:45
【问题描述】:

我正在使用 TypeScript,我正在尝试研究如何在使用 ES6 getter 和 setter 的类中实现接口。

这可能吗?使用下面的代码突出显示类中的错误。

例如:

(属性)SportsCar.make:字符串
“SportsCar”类型中的属性“make”不能分配给基类型“Car”中的相同属性。
类型 'string' 不能分配给类型 '{ (make: string): string; (): 空白; }'.ts(2416)*

代码:

export interface Car {
    _make: string;
    _model: string;

    make(make: string): string; // for setter
    make(): void; // for getter
    
    model(model: string): string; // for setter
    model(): void; // for getter
}

class SportsCar implements Car {

  _make: string;
  _model: string;

  constructor(make:string, model: string) {
  } 

  set make(make: string) {
    this._make = make
  }

  get make() {
    return this._make
  }

  set model(model: string) {
    this._model = model
  }

  get model() {
    return this._model
  }
}

module.exports = SportsCar;

使用 getMake()setMake() 代替 ES6 getter 和 setter 可以工作。但如果可能的话,我想使用 ES6 类的 getter 和 setter。

例如,这是有效的:

export interface Car {
     _make: string;
    _model: string;

    setmake(make: string): void; // for setter
    getmake(): string; // for getter
    
    setmodel(model: string): void; // for setter
    getmodel(): string; // for getter
}

class SportsCar implements Car {

   _make: string;
   _model: string;

  constructor(make:string, model: string) {
  } 

  setmake(make: string) {
    this._make = make
  }

  getmake() {
    return this._make
  }

  setmodel(model: string) {
    this._model = model
  }

  getmodel() {
    return this._model
  }

}

module.exports = SportsCar;

最后,在使用接口时,是否可以将类属性设置为私有?接口似乎不允许您定义它,如果使用下面的代码,我会在 VS Code 中收到以下错误。

代码:

export interface Car {
    _make: string;
    _model: string;

    setmake(make: string): void; // for setter
    getmake(): string; // for getter
    
    setmodel(model: string): void; // for setter
    getmodel(): string; // for getter
}

class SportsCar implements Car {

   private _make: string;
   private _model: string;

  constructor(make:string, model: string) {
  } 

  setmake(make: string) {
    this._make = make
  }

  getmake() {
    return this._make
  }

  setmodel(model: string) {
    this._model = model
  }

  getmodel() {
    return this._model
  }

}

module.exports = SportsCar;

错误:

类跑车 “SportsCar”类错误地实现了“Car”接口。 属性“_make”在“SportsCar”类型中是私有的,但在“Car”类型中不是私有的。ts(2420)

【问题讨论】:

    标签: typescript interface


    【解决方案1】:

    你所有的事情都是可能的。看这段代码:

    export interface Car {
        make: string;
        model: string;
    }
    
    export class SportsCar implements Car {
    
       private _make: string;
       private _model: string;
    
      constructor(make:string, model: string) {
        this._make = make;
        this._model = model;
      }
    
      set make(make: string) {
        this._make = make
      }
    
      get make() {
        return this._make
      }
    
      set model(model: string) {
        this._model = model
      }
    
      get model() {
        return this._model
      }
    
    }
    
    

    你可以试试here

    【讨论】:

    • 好的,谢谢。但这不包括接口内的私有属性。不在类中将它们设置为私有可以使它们包含在接口中。但我需要在课堂上将它们设为私有。那不可能吗?谢谢。
    • 不,您不能创建私有接口成员。有两个公有属性,为什么还要在接口中有私有属性呢?
    • 关于你上面提供的方法,接口的重点不就是确保一个类实现了所有需要的功能、属性吗?使用上述方法不会强制执行 get 和 set 版本的 make 和 model。只添加get make,get model满足你定义的接口的要求。但是,两者都是必需的。有办法解决吗?
    • 不,这在接口上是不可能的。但我理解你的问题
    • 一个接口只能描述一个对象的公共属性。如果你想这样做,你可以编写一个接口来描述显式的 get 和 set 函数,比如 getMake 和 setMake。该答案使用具有属性而不是功能的接口。它们不是只读的,因此实现此接口的类必须有一个 setter 才能正确实现它。
    猜你喜欢
    • 1970-01-01
    • 2012-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-30
    • 2012-10-02
    相关资源
    最近更新 更多