- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
数字是一个非常宽松的表示,有时需要收紧。就我而言,我希望变量只能采用非负整数。有没有办法在 TypeScript 中强制执行此约束?
最佳答案
是的,模板文字允许这样做;观察:
type NonNegativeInteger<T extends number> =
number extends T
? never
: `${T}` extends `-${string}` | `${string}.${string}`
? never
: T;
请注意,number extends T
是限制一般number
类型所必需的。
用法:
function negate<N extends number>(n: NonNegativeInteger<N>): number {
return -n;
}
negate(3); // success
negate(3.1); // failure
negate(-3); // failure
negate(-3.1); // failure
回应@ianstarz 评论:
How would you use this on a class field or variable type? myField: NonNegativeInteger = 42 doesn't seem to work—I'm not sure what to pass in as the generic type in this case. Can you also provide an example of how to use the generic in this case?
了解在 Typescript 中,文字本身被视为类型;示例:10
可分配给某些 let x: number
,但只有 10
可分配给某些 let x: 10
。此外,Typescript 有一个强大的类型推断系统,但它在成为开发负担之前只能走这么远。上述类型的目标是做两件事之一:
您的问题不仅适用于类字段,也适用于上述类型。 Typescript 变量在声明时应用类型推断,而不是赋值;此推论不会扩展到变量的泛型。
为了演示通用变量类型和函数调用之间的区别,请在使用通用标识类型时考虑以下错误:
type Identity<T> = Identity;
// Generic type 'Example' requires 1 type argument(s)
let x: Identity = 10;
相比于:
type Identity<T> = Identity;
function identity<T>(x: Identity<T>): T {
return x;
}
let y = identity(10); // Success, y has type `number`
const z = identity(10); // Success, z has type `10`
请注意 z
是如何假定文字类型的。事实上,我们可以显式地键入相同的 y
,但它只允许 10
作为值,而不允许任何其他数字。
如果您有有限数量的整数值,例如文件描述符,请创建一个类型如下的字段:
type EvenDigit = 0 | 2 | 4 | 6 | 8;
let x: EvenDigit = 2; // Success
let y: EvenDigit = 10; // Failure
如果你疯了,写一个生成联合类型的脚本。请注意,联合类型的成员数量可能有一个特定于版本的上限。
如果你想使用 SUPER meta 这样的东西会生成一系列类型:
// Assumes, for simplicity, that arguments Start and End are integers, and
// 0 < Start < End.
// Examples:
// Range<0, 5> -> 0 | 1 | 2 | 3 | 4 | 5
// Only can calculate so much:
// Range<0, 100> -> 'Type instantiation is excessively deep and possibly infinite.ts(2589)'
// Tail end recursion being introduced in Typescript 4.5 may improve this.
type Range<Start extends number, End extends number> = RangeImpl<Start, End>;
type RangeImpl<
Start extends number,
End extends number,
T extends void[] = Tuple<void, Start>
> = End extends T["length"]
? End
: T["length"] | RangeImpl<Start, End, [void, ...T]>;
// Helper type for creating `N` length tuples. Assumes `N` is an integer
// greater than `0`. Example:
// Tuple<number, 2 | 4> -> [number, number] | [number, number, number, number]
type Tuple<T, N extends number> = TupleImpl<T, N>;
// prettier-ignore
type TupleImpl<T, N extends number, U extends T[] = []> =
N extends U["length"]
? U
: TupleImpl<T, N, [T, ...U]>;
您可以创建一个带有赋值和检索器方法的类(不是 getter/setter 对,因为访问器不能有类型参数 ts(1094)
)。
例子:
class MyClass {
private _n: number = 42;
// infers return type `number`
getN() {
return this._n;
}
setN<T>(n: NonNegativeInteger<T>) {
// Optionally error check:
if (Number.isInteger(n) || n <= 0) {
throw new Error();
}
this._n = value;
}
}
关于typescript - 有没有办法在 TypeScript 中表示非负整数,以便编译器可以防止使用分数和负数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21224922/
我有一个非常基本的 MySQL 查询,它从数据库表中读取行并将行值添加或减去定义为 $total_balance 的 PHP 字符串。 例如; $statement_details_query = m
我有 following fiddle ,请注意,如果您使输出的宽度变小,图像将被覆盖并且不会出现滚动条 - 完美。 如果我attempt the same effect on the right ,
这个正则表达式将得到 456。我的问题是为什么它不能是 1-234-56 中的 234 ? 56 是否限定 (?!\d)) 模式,因为它不是单个数字。 (?!\d)) 寻找的起始点在哪里? impor
我需要知道两个子结构之间的内存距离 (&my_type.a - &my_tape.b.c) 结果的类型是什么?我需要将它转换为 (signed int),所以显然它是别的东西。 最佳答案 根据 C11
我遇到了一个扩展异常的异常处理程序类,如下所示: public class AppFileReaderException extends Exception { //Explicit seri
如何可视化负 RGB 值? 根据 OpenCV 文档: CV_8S - 8 位有符号整数 (-128..127) 这是否意味着 -128 表示 0 而 127 表示 255? 如果是,那我们为什么需要
我这里有一段代码给我带来了麻烦: idIndex = panoBuffer.indexOf("\"photo_id\":"); System.out.println(idIndex);
我刚刚练习 Java,对此还很陌生。我只是想创建一个随机数生成器程序来跟踪玩家的获胜、失败、获胜百分比和总获胜金额。该程序的逻辑是,玩家每次 session 有 3 次机会,计算机会生成一个随机数,玩
因此,我们被要求创建一个程序,使用户能够从 1-6 个有关矩阵运算的选项中进行选择。在每个用户的输入中,我们需要检查该输入是否适合要完成的操作(程序应该接受整数或 float ,正数或负数)。如果不满
这是我期望的输出 x |x| 1.2 1.2 -2.3 2.3 3.4 3.4 但我一直收到这个: x |x| 1
假设我有这个: $date1=date_create(date('H:I', strtotime('8:00'))); $date2=date_create(date('H:I', strtotime
如何确定负 FixNum 的无符号解释? # unexpected, true (~0b01111011).to_s(2) == ("-" + (~0b01111011).abs.to_s(2)) #
这是一个用于“邀请您的 friend 加入此群组”脚本的快速 SQL 查询。 我有 2 个表:users 和 group_members。我正在尝试执行一个查询,选择我所有的 friend ——由第一
负 ASCII 值有什么意义? int a = '«'; //a = -85 but as in ASCII table '<<' should be 174 最佳答案 没有负数ASCII值。 ASC
我知道用 PHP 可以做到这一点,但是有没有办法只用 MySQL 来做到这一点? 我有这个数据库: --------------------------------------------------
我在变量中有一个时间戳 $data = (float) -2208988800; 是否可以根据这些数据创建正确的日期?date("d.M.Y", $data) 返回“07.02.2036” 最佳答案
你好我如何将括号格式的负值转换为 double 值。目前我有这个。 Payment.Text = Calc_Payment().ToString("#,##0.00;(#,##0.00)"); 将支付
这是一个小程序。这应该打印 0 或 1,还是它有未定义的行为? #include struct S0 { unsigned f1 : 1; }; struct S0 s; int main (v
运行 lgb.cv 时,我有时会从日志中看到“从分数开始训练”后的负数。想知道这个数字到底是什么意思,单位是什么?是根据参数中指定的指标吗?以下是摘录: [LightGBM] [Info] Total
我正在使用变分自动编码器类型模型,我的损失函数的一部分是均值为 0 和方差为 1 的正态分布与另一个均值和方差由我的模型预测的正态分布之间的 KL 散度。 我用以下方式定义了损失: def kl_lo
我是一名优秀的程序员,十分优秀!