No puedo entender por qué el tipo de nVal1 se puede inferir en cada posición, mientras que nVal2 no se 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 de código: https://codesandbox.io/s/typescript-playground-export-forked-t1d8o?file=/index.ts
(A whole bunch of idk the answer but here's some digging I did to maybe give you some context and related info)
Esto me desconcierta y me emociona. Esencialmente, me hiciste darme cuenta de que "desconocido[] | [desconocido]" puede usarse para inferir tuplas. Siempre quise hacer esto. Esto parece hacky y no puedo entender cómo funciona. Encontré este tipo ts-essentials para tupla. Luego investigué un poco más y encontré esta respuesta de github que explica cómo funciona . Esto nos ayuda un poco. Ahora sabemos que "desconocido[] | [desconocido]" obliga al compilador a inferir el tipo de tupla. ¿Pero por qué? eso no lo se aun Parece que no puedo encontrar nada que explique este comportamiento.
Mi pensamiento antes de investigar un poco sobre esto. Así que no puedo responder directamente a su pregunta, pero me encontré con esta publicación de stackoverflow relacionada . Puede usar parámetros de descanso para inferir fácilmente tipos de tuplas. Me gusta este método porque parece que es algo que pretendían los creadores del mecanografiado. Pero agrega placa de caldera de tiempo de ejecución y eso no es bueno.
Encontré esta otra forma (solución 2) para hacer esto, pero aún no es una solución completamente adecuada. Con este, requiere que el usuario de la función haga "como const" en la matriz.
// solution 1 function tuple<T extends unknown[]>(...v: T) { return v; } function rSelf3<T>(vs: T): T { return vs; } const nVal3 = rSelf3(tuple("a", 1, true)); // solution 2 type Writable<T> = { -readonly [P in keyof T]: T[P] }; function rSelf4<T extends readonly unknown[]>(vs: T): Writable<T> { return vs; } const nVal4 = rSelf4(["a", 1, true] as const);