Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

TypeScript Constructor Overload with Empty Constructor

Why is it not allowed to have separate constructor definitions in TypeScript?
To have e.g. two constructors, I need to write my code like this.

constructor(id: number) constructor(id: number, name?: string, surname?: string, email?: string) {     this.id = id;     this.name = name;     this.surname = surname;     this.email = email; } 

Thereby I need to put ? after the parameters that are not required in the first constructor.

Why can't I write it like this?

constructor(id: number) {     this.id = id; }  constructor(id: number, name: string, surname: string, email: string) {     this.id = id;     this.name = name;     this.surname = surname;     this.email = email; } 

So that for both constructors all parameters are mandatory.

Moreover, if I need to have an empty constructor things get even weirder, since I need to mark every parameter with a ?.

constructor() constructor(id?: number, name?: string, surname?: string, email?: string) {     this.id = id;     this.name = name;     this.surname = surname;     this.email = email; } 

Why does TypeScript differs from common languages like C# or Python here?

I would expect it to work like this.

constructor() {  } constructor(id: number, name: string, surname: string, email: string) {     this.id = id;     this.name = name;     this.surname = surname;     this.email = email; } 

So you can pass none parameter or must pass all parameters.

like image 394
Daniel Hitzel Avatar asked Mar 14 '16 21:03

Daniel Hitzel


People also ask

Can you overload constructors in TypeScript?

In TypeScript, we cannot define multiple constructors like other programming languages because it does not support multiple constructors.

Can we have multiple constructors in angular?

error TS2392: Multiple constructor implementations are not allowed.

Can a JavaScript class have multiple constructors?

JavaScript doesn't have function overloading, including for methods or constructors. If you want a function to behave differently depending on the number and types of parameters you pass to it, you'll have to sniff them manually.

Can you overload constructors in JavaScript?

No you can't, JavaScript does not support overloading of any kind. What you can do is either pass an object which has already been populated with the values into your constructor and then grab the values from the object, but this which duplicates code.


1 Answers

Because your constructor implementation is called by all your overload constructors. (Technically, at runtime there's only one constructor function that gets called with the various overload argument signatures.)

Imagine it like this:

overload_constructor(id:string) {     implementation_constructor(id); }  implementation_constructor(id:string, name?:string, age?:number) {     // ... } 

Thinking of it this way, overload_constructor could not call implementation_constructor unless name and age are optional.

Also see Basarat's answer, the implementation isn't exposed for public usage by the type checker (though at runtime it's the "real" constructor used in JS). If you want to only allow (), (id), or (id, name, surname, email) as the only valid call signatures you would do it like this:

constructor() constructor(id: number) constructor(id: number, name: string, surname: string, email: string) constructor(id?: number, name?: string, surname?: string, email?: string) {     this.id = id;     this.name = name;     this.surname = surname;     this.email = email; } 

Note that in the implementation all parameters are optional, but that signature is not exposed when compiling and you can only use these these calls:

new Foo() new Foo(1) new Foo(1, "a", "b", "c") 

Not, for example:

new Foo(1, "a") 
like image 138
Aaron Beall Avatar answered Sep 19 '22 18:09

Aaron Beall