首页 > 解决方案 > 有没有一种合理的方法可以在打字稿中输入“小于 n 的非负整数”?

问题描述

我非常喜欢Typescript,但仍然只是学习,我并不真正关心应用程序,我只是想知道什么可以打字,什么不能打字。

我想输入的一件事是 0 到 1 之间的(实数)数字,但我认为这可能要求太多,所以我只关注 0 到 n 之间的整数。

我想出了这个

type ExtendArray<E, T extends any[]> = ((fst: E, ...rest: T) => any) extends (
    ...rest: infer U
) => any
    ? U
    : T;

type UpTo<N extends number, K extends number[] = []> = {
    0: UpTo<N, ExtendArray<K["length"], K>>;
    1: K;
}[K["length"] extends N ? 1 : 0];

type UnwrapArray<Arr extends any[]> = Arr extends Array<infer R> ? R : never;

type NUMS = UnwrapArray<UpTo<10>>;

超级,类型NUMS是0 | 1 | ... | 9 这就是我想要的。

但是,如果我用 100 替换 10,我会遇到一个问题“类型实例化太深并且可能是无限的”,公平地说,我的实现相当复杂。

我的问题不是关于错误,我认为这是合理的,而是有没有一种好方法可以输入我想要的内容而不会遇到这个限制?

一个好方法应该让我把数字提高到 20000

作为一种旁注,我发现自己做了很多这样的诡计,我使用函数类型只是为了表达我想要做的事情(如在 ExtendArray 中),这是否合法(即它是人们通常做事的方式吗?)

标签: typescript

解决方案


推荐阅读