如何确保扩展类必须在TypeScript中设置属性值?

时间:2017-04-12 18:19:07

标签: javascript oop inheritance typescript

如果我有课程foo

class Foo {
  id: number
  name: string

  sayHi() {
    console.log('hi')
  }
}

如何确保从foo扩展的任何类都必须设置idname的值?

class Bar extends Foo {
  // must set these values
  id = 1
  name = 'bar'
}

这个概念或模式有名称吗?我不能将Foo作为接口,因为它必须有方法,继承的类可以使用。

1 个答案:

答案 0 :(得分:3)

Foo一个构造函数,它需要它们作为参数:

class Foo {
  constructor(public id: number, public name: string) {
    // Validate them here if desired
  }

  sayHi() {
    console.log('hi');
  }
}

由于子类必须调用其超类构造函数(隐式或显式),因此尝试在不传递必要参数的情况下执行此操作将被TypeScript编译器标记:Supplied parameters do not match any signature of call target.例如,这两者都失败:

class Bar extends Foo {
}
const b = new Bar();   // Supplied parameters do not match any signature of call target.

class Bar extends Foo {
  constructor() {
    super();           // Supplied parameters do not match any signature of call target.
  }
}

请注意那里使用的有趣的TypeScript特性:因为我们在构造函数参数上给出了访问修饰符,所以在调用构造函数时会自动创建实例属性并将其设置为这些值。它相当于:

class Foo {
  id: number;
  name: string;

  constructor(id: number, name: string) {
    this.id = id;
    this.name = name;
    // Validate them here if desired
  }

  sayHi() {
    console.log('hi');
  }
}

(由于默认修饰符为public。)