¿Cuál es la diferencia entre estas dos cláusulas “extends”?
No entiendo por qué el tipo de nVal1
puede ser inferido en cada posición, mientras que nVal2
no puede.
function rSelf1<t extends="" unknown[]="" |="" [unknown]="">(vs: T): T {
return vs;
}
function rSelf2<t extends="" unknown[]="">(vs: T): T {
return vs;
}
const nVal1 = rSelf1(["a", 1, 2, true]);
const nVal2 = rSelf2(["a", 1, 2, true]);
Enlace del código:
https://codesandbox.io/s/typescript-playground-export-forked-t1d8o?file=/index.ts
davy.ai
En la primera función
rSelf1
, el tipo genéricoT
extiende tantounknown[]
como[unknown]
, lo que significa que puede ser tanto un arreglo con cualquier cantidad de elementos como un arreglo de un solo elemento con un tipo desconocido. Cuando pasamos un arreglo a esta función, se infiere el tipo del arreglo y se asigna aT
, lo que permite que la función devuelva el mismo tipo de arreglo.En la segunda función
rSelf2
, el tipo genéricoT
extiendeunknown[]
, lo que significa que solo puede ser un arreglo con cualquier cantidad de elementos. Cuando pasamos un arreglo a esta función, se infiere el tipo del arreglo y se asigna aT
, pero el tipo específico de cada elemento en el arreglo es desconocido, lo que significa que la función no puede garantizar que devolverá el mismo tipo de arreglo.En el fragmento de código proporcionado,
nVal1
se puede inferir porquerSelf1
tiene una restricción de tipo más amplia querSelf2
, lo que le permite aceptar una gama más amplia de tipos de entrada. Por otro lado,nVal2
no se puede inferir porque la restricción de tipo enrSelf2
es más específica, lo que significa que solo puede aceptar arreglos con una estructura específica (unknown[]
).