Typescript 是否可以将数字限制在一定范围内
由于typescript2.0rc(甚至beta?),可以使用数字文字类型,如Typescript 是否可以将数字限制在一定范围内,typescript,types,Typescript,Types,由于typescript2.0rc(甚至beta?),可以使用数字文字类型,如typet=1 | 2。是否可以将类型限制为数字范围,例如0-255,而不在类型中写入256个数字 在我的例子中,库接受调色板的颜色值为0-255,我只想列举一些颜色值,但将其限制为0-255: const enum paletteColor { someColor = 25, someOtherColor = 133 } declare function libraryFunc(color: paletteC
typet=1 | 2代码>。是否可以将类型限制为数字范围,例如0-255,而不在类型中写入256个数字
在我的例子中,库接受调色板的颜色值为0-255,我只想列举一些颜色值,但将其限制为0-255:
const enum paletteColor {
someColor = 25,
someOtherColor = 133
}
declare function libraryFunc(color: paletteColor | 0-255); //would need to use 0|1|2|...
不可能。这种精确的类型约束在typescript中是不可用的(还没有?)
只有运行时检查/断言才能实现这一点:(如果您的范围很小,则始终可以编写如下内容:
type MyRange = 5|6|7|8|9|10
let myVar:MyRange = 4; // oops, error :)
当然,它只适用于整数,而且非常难看:)目前还不可能,但有一个问题。
目前,他们仍在等待提案,但该功能可能有一天会出现
简而言之,在提案出来之前,您将无法使用一系列数字作为类型。不使用静态类型检查,仅在运行时使用库,例如
您可以使用taggedUnion
例如:
是否可以将类型限制为数字范围,例如0-255,而不在类型中写入256个数字
现在还不可行,但您可以进行lifehack,用一行代码生成所需的序列,并复制/粘贴结果
新数组(256).fill(0).map((uu,i)=>i.join(“|”)
是的,可以但是:
一号。解决方案将是肮脏的解决方案
二号。解决方案将是局部的(从x到y,其中y是一个小数字,在我的例子中为43)
三号。解决方案将是一个完整的解决方案,但真正的进步与变压器,装饰等
1。使用@Adam Szmyd solution:
type RangeType = 1 | 2 | 3
如果您需要广泛的范围,只需打印和复制/粘贴:
//只是增量的
让range=(max)=>Array.from(Array(max).keys()).join(“|”);
console.log('Incremental')
控制台日志(范围(20))
//有范围和步骤
让rangeS=((min,max,step)=>Array.from(新数组(max>min?Math.ceil((max-min)/step):Math.ceil((min-max)/step)),(x,i)=>max>min?i*step+min:min-i*step)。join(“|”);
console.log('带有范围和步骤')
log(范围(3,10,2))
我不相信还有“简单”的方法可以做到这一点。我在这里读了很多评论:一些很好的想法,但是有很多事情要考虑。 < P>虽然不是最好的解决方案(因为一些检查在运行时会被处理),但是值得一提的是,它可以帮助你强制输入期望值。
下面是一个例子:
type RGBColor=number&{u type:“RGBColor”};
常量rgb=(值:数字):RGBColor=>{
如果(值<0 | |值>255){
抛出新错误(`value${value}不是有效的颜色`);
}
返回值为RGBColor;
};
//编译器错误
常量color1:RGBColor=200;//失败-编号不是RGBColor
常量color2:RGBColor=300;//失败-编号不是RGBColor
//运行时错误
常量颜色3:RGBColor=rgb(300);//失败-值300不是有效的颜色
//通过
常量颜色4:RGBColor=rgb(100);
常量颜色5:RGBColor=rgb(255);
编辑:啊,我没有仔细阅读提供的答案@titusfx已经以另一种形式提供了这个答案。与他的方法一样,这在你能产生的数字数量方面是有限的。这不是一个实际的解决方案,而是一个工作范围非常有限的解决方案强>
原始答复:
这有一个解决办法。借用答案(将此解决方案限制为TypeScript v 4.1及更高版本):
类型_NumbersFrom0ToN<
Nr扩展了数字
> =
Nr延长Nr?
号码是多少?
编号:
NR0?
从未:
_编号from0tonrec:
从未;
从0tonrec输入\u编号<
Nr扩展了数字,
计数器扩展任何[],
累加器扩展数字
> =
计数器['length']延长了Nr?
累加器:
_从0到Rec的数字;
类型NrRange<
开始扩展数字,
尾数
> =
排除
设nrRange:nrRange;
它创建类型14 | 15 | 16 | 17 | 18 | 19
。为了实现这一点,我们只需要利用TypeScript可以通过新改进的tuple类型检查的length属性进行计数的特性。因此,只要数组的长度与输入数不同,我们就扩展一个数组。在扩展阵列时,我们会记住已经访问过的长度。这反过来会产生一个带有额外步骤的计数器
编辑:为了便于重新使用,我将这些类型放在一个包中:注意:枚举定义了一组命名的数值常量,而不是新类型。因此,声明可以传递数字而不是paletteColor
s是不必要的。@Burt\u Harris true。还需要一种将枚举限制为0-255的方法。也可以只使用索引器对象而不是枚举,尽管有点难看。无论哪种方式都不需要|
,如果它被限制为0-255或仅为0-255,则在最佳情况下,它应该是paletteColor
。注意:从TS 2.4开始,字符串文本现在允许作为枚举值FYI,您要求的是“依赖类型”不,TS中不存在此功能。某些具有此功能的语言是Agda、Idris、Coq。“如果不在类型中写入256个数字,@Quentin2不写入,请在控制台中生成字符串,然后复制/粘贴到代码中…”new Array(256).fill(0).map((_,i)=>i.join(“|”)
是否有任何方法可以限制为正数,如1,21005等。这很有趣,但遗憾的是,对于编译器来说,其工作方式极其复杂。例如,NrRange
已经给出了“类型实例化太深,可能是无限的(2589)”,fo