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

254
Views
¿Por qué mecanografiado se queja de que XXX se puede asignar a la restricción de tipo 'T', pero 'T' podría instanciarse con un subtipo diferente de restricción X?

Mi código es este:

 export interface TreeItem { id: string; children: this[]; collapsed?: boolean; } const createTreeItem = <T extends TreeItem>(): T => { return { id: 'root', children: [] } }

Pero me sale un error en el tipo de retorno de createTreeItem que es el siguiente:

TS2322: escriba '{ id: cadena; niños: nunca[]; }' no se puede asignar al tipo 'T'. '{id: cadena; niños: nunca[]; }' es asignable a la restricción de tipo 'T', pero 'T' podría instanciarse con un subtipo diferente de restricción 'TreeItem'.

No tengo absolutamente ninguna idea de qué significa esto.

Alguna ayuda ?

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

0

Así que digamos que llamas a tu función de la siguiente manera:

 let node = createTreeItem<TreeItem>()

Todo bien, ¿verdad? El tipo de devolución T es TreeItem , y el objeto que su función genérica está codificada para devolver de hecho tiene un tipo que lo califica como TreeItem :

 { id: string; children: never[]; }

Pero el objetivo de darle a su función un parámetro de tipo es permitir que se llame con otros tipos de T , siempre que extiendan TreeItem . Así que lo siguiente debería ser una llamada legal:

 export interface BidiTreeItem { id: string; children: this[]; parent: this; collapsed?: boolean; } let node = createTreeItem<BidiTreeItem>()

La llamada es legal, ya que BidiTreeItem satisface la restricción T extends TreeItem . El tipo de devolución de esta llamada, como se declara en la definición de su función, es BidiTreeItem , pero lo que devuelve su función NO es un BidiTreeItem .

Si vuelve a leer el mensaje de error pero con el ejemplo anterior en mente, ahora tendrá sentido para usted. Pero por si acaso, a continuación traduciré cada parte del mensaje de error. Tenga en cuenta que la primera oración es la conclusión, por lo que irá en último lugar en esta tabla:

esta parte del mensaje de error... significa esto (usando el ejemplo anterior)...
'{ id: string; children: never[]; }' is assignable to the constraint of type 'T' '{ id: string; children: never[]; }' es consistente con la restricción T extends TreeItem
but 'T' could be instantiated with a different subtype of constraint 'TreeItem'. pero se podría crear una instancia de T con un subtipo diferente de TreeItem , por ejemplo, BidiTreeItem .
TS2322: Type '{ id: string; children: never[]; }' is not assignable to type 'T'. No se garantiza que el objeto que devuelve su función sea asignable al tipo T , porque T podría ser algún otro subtipo como BidiTreeItem .
about 4 years ago · Juan Pablo Isaza Report

0

Puede agregar "como T después de la devolución":

const createTreeItem = (): T => ({ id: 'root', children: [] } as T);

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!