@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
, потому что он необязательный. В теле конструктора вы можете использовать условные операторы для проверки, какой из определений конструктора был вызван, и выполнения соответствующих действий.
Кроме того, если вы используете абстрактный класс, вы можете перегружать конструкторы в абстрактных классах так же, как и в обычных классах.
@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 с различными наборами параметров и получить ожидаемые результаты.