Estoy convirtiendo ciertas propiedades de un objeto a una matriz.
const result = ({ a, b }: { a: string, b: number }) => [a, b]; // (string | number)[] Sin embargo, la forma estándar siempre devuelve un tipo de texto mecanografiado insuficiente (string | number)[]
Siempre tengo que especificar mi tipo de salida para que escriba correctamente el resultado.
const result = ({ a, b }: { a: string, b: number }): [string, number] => [a, b]; // [string, number]¿Hay una manera más sencilla?
Simplemente agregue como const después de crear la matriz; esto se denomina aserción const. Indica que la matriz recién creada es en realidad una tupla, lo cual tiene que ser si va a contar con que tenga 2 elementos donde el primero es una cadena y el segundo es un número.
// readonly [string, number] const result = ({ a, b }: { a: string, b: number }) => [a, b] as const;La única diferencia entre esto y el ejemplo en su pregunta original es que el tipo resultante será de solo lectura . No habrá forma de alterar el valor del resultado a menos que haga una afirmación específica que lo permita.
No se puede escapar del hecho de que tiene que agregar un poco de verbosidad para recuperar un tipo de tupla. Puede crear una función de ayuda que genere tipos de tupla a partir de literales de matriz; ya sea que sea preferible declarar const o la firma de retorno directamente, depende de usted:
const asTuple = <T extends [any, ...any]>(array: T) => array; const objectToTuple = ({ a, b }: { a: string, b: number }) => asTuple([a, b]); const result = objectToTuple({a: "a", b: 1}) // [string, number]Que yo sepa, no lo hay.
Puede hacer [a, b] as [string, number] pero básicamente es la misma verbosidad. Otra alternativa es dar result un tipo de función, pero eso es solo mover el "problema" aquí.
Además, agregar esa pequeña declaración de tipo de retorno no es tan malo. No hay mucho más que TS pueda hacer, ya que no puede asumir que desea una [string, number] de forma predeterminada. Eso estaría lejos de ser compatible con versiones anteriores (o incluso deseado por la mayoría de las personas).