Búsqueda de sitios web

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.

  1. Define test así:
const test : [string,string,string,string,string]= ["1", "2", "3", "4", "5"]
  1. 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