Typescript 如果我成功了<;T>;我可以创建类型LessThan<;T>;?

Typescript 如果我成功了<;T>;我可以创建类型LessThan<;T>;?,typescript,types,Typescript,Types,我有类型别名Succ。返回下一个数字 例如: 类型A=such//A=11 我是否可以定义某种类型,其行为方式如下: type LessThan=0 | 1 | 2 | 3 |……|(T-1) 如果可以,怎么做 我希望避免对每个数字的结果进行描述。您目前无法直接使用number类型执行类型级算术。有一个公开的问题(也许还有其他人)要求这样做 如果你不能加减数字,你至少可以通过使用TS4.0和TS4.1来增加和缩小元组。因此,一个想法是生成一组元组,如长度不超过您关心的数字的元组,然后获取它们

我有类型别名
Succ
。返回下一个数字

例如:

类型A=such//A=11
我是否可以定义某种类型,其行为方式如下:

type LessThan=0 | 1 | 2 | 3 |……|(T-1)
如果可以,怎么做


我希望避免对每个数字的结果进行描述。

您目前无法直接使用
number
类型执行类型级算术。有一个公开的问题(也许还有其他人)要求这样做

如果你不能加减数字,你至少可以通过使用TS4.0和TS4.1来增加和缩小元组。因此,一个想法是生成一组元组,如长度不超过您关心的数字的元组,然后获取它们的
length
属性,将其转换回您关心的
数字

这里唯一的问题是如何以一种不会违背TypeScript递归限制或破坏编译器性能的方式来执行。如果一次连接一个元组元素,您会发现
LessThan
对编译器来说太麻烦了。这里有一种可能的方法,但我不知道这是否值得:

type TuplesOfLengthsUpToAndBeyond<N extends number, T extends 0[] = [0]> =
  T[N] extends undefined ? (
    TuplesOfLengthsUpToAndBeyond<N, [...T, ...T]> |
    [...T, ...TuplesOfLengthsUpToAndBeyond<N, [...T, ...T]>]
  ) : []

type LessThanOrEqual<N extends number> =
  TuplesOfLengthsUpToAndBeyond<N> extends infer O ? O extends any[] ?
  O[N] extends undefined ? O['length'] :
  never : never : never;

type LessThan<N extends number> = Exclude<LessThanOrEqual<N>, N>;
这一切都很好,而且编译器似乎运行正常。它通过
15
20
限制时不会出现问题。不幸的是,这仍然不能很好地扩展。如果您尝试
LessThan
,它最终会起作用:

type LessThan 1000=LessThan//⏳
/*LessThan1000型=0 | 1 | 2 | 4 | 8 | 16 | 32 | 64 | 128 | 256 | 512 | 768
| 384 | 640 | 896 | 192 | 320 | 576 | 832 | 448 | 704 | 960 | 96 | 160 | 288 | 544
| 800 | 416 | 672 | 928 | 224 | 352 | 608 | 864 | 480 | ... 964更多…|767 */
但这需要相当长的时间来工作。。。在我的机器上大约10秒钟。那可能不太好。理想情况下,一台计算机应该能够在。。。根本没有时间。因此,在microsoft/TypeScript#26382或类似的产品问世之前,您可能需要重新考虑这一需求。你可能想也可能不想硬编码你自己的工会名单

type LessThan6 = LessThan<6> // 0 | 1 | 2 | 3 | 4 | 5

type LessThan100 = LessThan<100>
/* type LessThan100 = 0 | 1 | 2 | 4 | 8 | 16 | 32 | 64 | 96 | 48 | 80 | 24 | 40 | 72 | 56 | 
 88 | 12 | 20 | 36 | 68 | 52 | 84 | 28 | 44 | 76 | 60 | 92 | 6 | 10 | 18 | 34 | 66 | 
 98 | 50 | 82 | 26 | 42 | 74 | 58 | 90 | 14 | 22 | ... 57 more ... | 95 */
type LessThan1000 = LessThan<1000> // ⏳
/* type LessThan1000 = 0 | 1 | 2 | 4 | 8 | 16 | 32 | 64 | 128 | 256 | 512 | 768 
 | 384 | 640 | 896 | 192 | 320 | 576 | 832 | 448 | 704 | 960 | 96 | 160 | 288 | 544
 | 800 | 416 | 672 | 928 | 224 | 352 | 608 | 864 | 480 | ... 964 more ... | 767 */