Как перегрузить конструктор в typescript?

Пользователь

от dan_farrell , в категории: JavaScript , год назад

Как перегрузить конструктор в typescript?

Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp

2 ответа

Пользователь

от shayna.buckridge , год назад

@dan_farrell 

В TypeScript, вы можете перегружать конструкторы так же, как и методы класса. Чтобы перегрузить конструктор, вам нужно объявить несколько определений конструктора внутри класса. Каждое определение конструктора должно иметь различное количество и/или типы параметров.


Например, предположим, что у вас есть класс Person, который принимает имя и возраст в качестве аргументов конструктора. Вы можете перегрузить конструктор, чтобы он мог принимать только имя или только возраст. Вот пример:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
class Person {
  constructor(name: string, age: number);
  constructor(name: string);
  constructor(age: number);
  constructor(nameOrAge: string | number, age?: number) {
    if (typeof nameOrAge === 'string') {
      // construct with only name
    } else if (typeof age === 'number') {
      // construct with name and age
    } else {
      // construct with only age
    }
  }
}


Обратите внимание, что объединяющий параметр nameOrAge имеет тип string | number, а параметр age имеет тип number | undefined, потому что он необязательный. В теле конструктора вы можете использовать условные операторы для проверки, какой из определений конструктора был вызван, и выполнения соответствующих действий.


Кроме того, если вы используете абстрактный класс, вы можете перегружать конструкторы в абстрактных классах так же, как и в обычных классах.

Пользователь

от greyson , 4 месяца назад

@dan_farrell 

Вот пример перегрузки конструктора в абстрактном классе:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
abstract class Shape {
  abstract calculateArea(): number;

  constructor(public name: string) {}

  // Constructor overload: constructor with name
  constructor(public name: string, public color: string) {}

  // Constructor overload: constructor with name and dimensions
  constructor(public name: string, public width: number, public height: number) {}

  // Constructor overload implementation
  constructor(name: string, arg1?: string | number, arg2?: number) {
    if (typeof arg1 === 'string') {
      this.color = arg1;
    } else if (typeof arg1 === 'number' && typeof arg2 === 'number') {
      this.width = arg1;
      this.height = arg2;
    }
  }
}

const circle = new Shape('Circle', 'Red');
console.log(circle.name); // Circle
console.log(circle.color); // Red

const rectangle = new Shape('Rectangle', 10, 20);
console.log(rectangle.name); // Rectangle
console.log(rectangle.width); // 10
console.log(rectangle.height); // 20


В данном примере, абстрактный класс Shape имеет три перегруженных определения конструктора. Каждое определение конструктора принимает различные параметры: только имя, имя и цвет, или имя и размеры. В конструкторе, который объединяет перегруженные определения, мы используем условные операторы для инициализации соответствующих свойств класса в зависимости от переданных аргументов.


Когда мы создаем экземпляры класса Shape, TypeScript выбирает определение конструктора на основе переданных аргументов. В результате, мы можем создать экземпляр класса Shape с различными наборами параметров и получить ожидаемые результаты.