Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

188
Views
TypeScript: permitir extensiones arbitrarias a la instancia de clase

Usando TypeScript, me gustaría crear instancias de clase que tengan varios métodos, pero que se puedan inicializar para agregar automáticamente varios otros métodos, basados en uno de los predefinidos. La clase base tiene un método props , que toma un objeto y hace cosas con él:

 class MyClass { props(props: Record<string, any>) { // Do something with passed props } }

Quiero poder pasar una lista de nombres de métodos en construcción que luego se usan para agregar dinámicamente métodos de instancia de clase que usan este método de props para hacer algo. Asi que:

 constructor(propList: Array<string> = []) { propList.forEach(propName => { // Don't allow overwriting of existing methods if (this[propName]) { throw new Error( `Cannot create prop setter for '${propName}'. Method with that name already exists!` ); } else { this[propName] = (value: any) => { this.props({ [propName]: value }); }; } }); }

Cuando intento hacerlo, TS muestra un error:

Element implicitly has an 'any' type because expression of type 'string' can't be used to index type 'MyClass'. No index signature with a parameter of type 'string' was found on type 'MyClass'.ts(7053)

¿Hay alguna forma de hacer esto? Vi esta pregunta semirelacionada , pero no me pareció aplicable. ¡Gracias! Nuevo en TS.

EDITAR

Intenté que la clase implementara una interfaz abierta:

 interface CanBeExtended { [key: string]: any; } class MyClass implements CanBeExtended { // ...

pero creo que eso es hacer que la clase en sí, pero no las instancias de la clase, sea extensible. En cualquier caso, no está solucionando el problema.

about 4 years ago · Juan Pablo Isaza
1 answers
Answer question

0

Puede declarar una firma de índice en una class , siempre que no entre en conflicto con los tipos de otros miembros (por lo que si tiene un método props() , no puede hacer que la firma de índice [k: string]: number , por ejemplo, ya que props es un método y no un number ). En su caso, desea usar any type , que definitivamente no entrará en conflicto (aunque tampoco es muy seguro). Entonces se ve así:

 class MyClass { [k: string]: any; // index signature constructor(propList: Array<string> = []) { propList.forEach(propName => { // Don't allow overwriting of existing methods if (this[propName]) { // no error here anymore throw new Error( `Cannot create prop setter for '${propName}'. Method with that name already exists!` ); } else { this[propName] = (value: any) => { // no error here anymore this.props({ [propName]: value }); }; } }); } props(props: Record<string, any>) { // Do something with passed props } }

Y tus errores desaparecen.

Enlace del patio de recreo al código

about 4 years ago · Juan Pablo Isaza Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!