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 ?
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 . |
Puede agregar "como T después de la devolución":
const createTreeItem = (): T => ({ id: 'root', children: [] } as T);