Te damos la contestación a esta cuestión, al menos eso pensamos. Si sigues con interrogantes déjanoslo saber en un comentario, que sin dudas
Solución:
La última función de sobrecarga solo se usa en la implementación y no está disponible públicamente. Esto se muestra a continuación:
class Foo
constructor()
constructor(id?: number)
const foo1 = new Foo();
const foo2 = new Foo(123); // Error! : not public
Si quieres id:number
para estar disponible públicamente, por supuesto, puede agregar otra sobrecarga:
class Foo
constructor()
constructor(id: number)
constructor(id?: number)
const foo1 = new Foo();
const foo2 = new Foo(123); // Okay
const foo3 = new Foo('hello'); // Error: Does not match any public overload
La razón es que TypeScript intenta no hacer una generación de código elegante para la sobrecarga de funciones (los lenguajes tradicionales hacen esto usando la manipulación de nombres, por ejemplo, C ++)
Por lo tanto, no puede pasar ningún parámetro o debe pasar parámetros.
En realidad, puede hacer que la sobrecarga final sea opcional, pero ninguna de las públicas como opcional. Considere el siguiente ejemplo:
class Foo
constructor(id: number, name:string)
constructor(name:string)
constructor(idOrName?: number
const foo1 = new Foo('name'); // Okay
const foo2 = new Foo(123); // Error: you must provide a name if you use the id overload
const foo3 = new Foo(123,'name'); // Okay
Porque la implementación de su constructor es llamada por todos sus constructores de sobrecarga. (Técnicamente, en tiempo de ejecución solo hay una función constructora que se llama con las distintas firmas de argumentos de sobrecarga).
Imagínatelo así:
overload_constructor(id:string)
implementation_constructor(id);
implementation_constructor(id:string, name?:string, age?:number)
// ...
Pensándolo de esta manera, overload_constructor
no pude llamar implementation_constructor
a no ser que name
y age
son opcionales.
Consulte también la respuesta de Basarat, la implementación no está expuesta para uso público por parte del verificador de tipos (aunque en tiempo de ejecución es el constructor “real” utilizado en JS). Si solo desea permitir ()
, (id)
o (id, name, surname, email)
como las únicas firmas de llamada válidas, lo haría así:
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;
Tenga en cuenta que en la implementación, todos los parámetros son opcionales, pero esa firma no se expone al compilar y solo puede usar estas llamadas:
new Foo()
new Foo(1)
new Foo(1, "a", "b", "c")
No, por ejemplo:
new Foo(1, "a")
Agradecemos que desees secundar nuestro trabajo escribiendo un comentario y dejando una puntuación te lo agradecemos.