¿Es posible restringir el número a un cierto rango?

Resuelto ASDFGerte asked hace 8 años • 17 respuestas

Desde Typecript 2.0 RC (¿o incluso beta?) es posible utilizar tipos literales numéricos, como en type t = 1 | 2;. ¿Es posible restringir un tipo a un rango numérico, por ejemplo, 0-255, sin escribir 256 números en el tipo?

En mi caso, una biblioteca acepta valores de color para una paleta de 0 a 255, y preferiría nombrar solo algunos pero restringirlos a 0-255:

const enum paletteColor {
  someColor = 25,
  someOtherColor = 133
}
declare function libraryFunc(color: paletteColor | 0-255); //would need to use 0|1|2|...
ASDFGerte avatar Sep 14 '16 22:09 ASDFGerte
Aceptado

Editar: esta es una respuesta antigua. TS >= 4.5 ahora tiene herramientas para solucionar esto, aunque puede que esté limitado o no para su caso de uso. Para rangos más pequeños, esta respuesta funciona:

type Enumerate<N extends number, Acc extends number[] = []> = Acc['length'] extends N
  ? Acc[number]
  : Enumerate<N, [...Acc, Acc['length']]>

type IntRange<F extends number, T extends number> = Exclude<Enumerate<T>, Enumerate<F>>

type T = IntRange<20, 300>

---- Antigua respuesta ----

No, no es posible. Ese tipo de restricción de tipo precisa no está disponible en mecanografiado (¿todavía?)

Sólo las comprobaciones/afirmaciones en tiempo de ejecución pueden lograr eso :(

AlexG avatar Sep 14 '2016 16:09 AlexG

Si tienes un rango pequeño, siempre puedes escribir algo como:

type MyRange = 5|6|7|8|9|10

let myVar:MyRange = 4; // oops, error :)

Por supuesto, funciona sólo para números enteros y es muy feo :)

Adam Szmyd avatar Feb 03 '2017 09:02 Adam Szmyd