Error de Typescript al usar el operador spread en la función
Estoy tratando de usar el operador spread en la función sendMessage para websockets. Recibo el error de que el argumento spread debe tener un tipo de tupla o ser pasado a un parámetro rest. sendMessage usa ...values como un parámetro rest. ¿Qué me falta?
Mi problema es que la prueba podría tener una longitud arbitraria (pero siempre contendrá un elemento).
const sendMessage = (type: string, ...values: (string | number)[]) =>
websocket.connected_socket.send(`${type}=${values.join("~")}`);
let test = ["1", "2", "3", "4", "5"]
sendMessage(...test) // error: A spread argument must either have a tuple type or be passed to a rest parameter.ts(2556)
sendMessage(...["1", "2", "3", "4", "5"]) // this is fine
EDITAR: Esto funciona. Supongo que tenía algo que ver con los parámetros de la función
sendMessage(test[0], ...test.slice(1))
Respuesta #1
Prueba as const:
const test = ["1", "2", "3", "4", "5"] as const
Respuesta #2
Hay un par de maneras de resolver esto. Pero veamos por qué surge el error.
El tipo predeterminado de test será un string[]. El error menciona que el argumento spread puede ser una tupla, pero aquí tenemos un arreglo. Una tupla es como un arreglo, pero la longitud es fija y también el tipo de elemento en cada índice es fijo.
const sendMessage= (type: string, ...values: (string | number)[]) => {
};
Si extendemos un arreglo vacío, no obtendríamos elementos. La función no funcionaría como se espera. Por lo tanto, expandir un tipo de arreglo es algo que debería estar prohibido, que es exactamente lo que está ocurriendo.
Para pasar los argumentos correctos, es mejor ser más restrictivo. Y la tupla es la manera de hacerlo.
- Define
testasí:
const test : [string,string,string,string,string]= ["1", "2", "3", "4", "5"]
- Como se mencionó en otra respuesta, usa la declaración
const. Esto dará el tipo más exacto que TypeScript puede inferir. Los literales de arreglo se convierten en tuplas de solo lectura.
const test = ["1", "2", "3", "4", "5"] as const;
Patio de recreo
