Saltar al contenido

Sobrecarga de constructor de TypeScript con constructor vacío

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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *