Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typescript 是否可以将数字限制在一定范围内_Typescript_Types - Fatal编程技术网

Typescript 是否可以将数字限制在一定范围内

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

由于typescript2.0rc(甚至beta?),可以使用数字文字类型,如
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