在 TypeScript 中是否可以有数字字符串类型?

5
更新:我现在意识到我忽视了字符串在运行时的处理方式,所以100 + 5实际上不会像我期望的那样工作。我会保留这个问题,看看是否有更好的解决方案,而不是类型转换或类型定义。
我一直在寻找答案,所以如果这是一个重复的问题,我很抱歉,但我想知道是否可以为数字字符串定义一个TypeScript类型,该类型接受字符串或值,然后指示它将始终是一个数字?我需要发送数据到许多不同的系统中,不幸的是,我无法控制模型定义(它们由拥有数据的各种团队控制)。这使我不得不将所有字符串转换为数字进行计算,然后再将其转换回字符串以使IDE满意,并导致了大量额外的工作。
如果我能做类似以下的事情,那就太好了,这将有助于减少冗余工作量:
type NumericalString<T extends number | string> = T extends (string | number) ? number : never;

let someVal: NumericalString = "100"; // Recognized as 100 by IDE

// ... elsewhere in code
if (isNumericalString(someVal)) {
    someVal+= 5; // No need to cast to number because IDE already knows it's a number
}

我希望TypeScript能够聪明地知道“100”是一个有效的数字字符串,但“Foobar”不是。即使我只能欺骗IDE将所有字符串都视为数字字符串,并处理此举的后果,我也会满足。因为我是这个项目中唯一积极工作的人员。非常感谢您的帮助,我觉得我每天会因此失去一个小时/一个半小时,如果可以提高生产力,那就太好了。

我理解的对吗?你想要创建一个“假”的字符串,实际上是一个数字,并且想将其用作数字? - lukasl-dev
1
“不需要转换为数字”可能与您期望的逻辑不符。您的代码将导致结果为“1005”,而不是“105”或105。使用“Number(theValue)”真的那么困难吗?显式转换确实是必要的。 - CertainPerformance
我想我忽略了这个。这非常不幸,但我想我真的无能为力。 - Zach
2个回答

17

这里将接受数字和作为数字的字符串,但不会接受其他任何字符串。

type NumericalString = `${number}` | number;

let str: NumericalString = "120"; // OK
let num: NumericalString = 120; // OK

let someOtherStr: NumericalString = "Any Thing Than Num"; // Show error by IDE

如何将for循环的迭代器作为数字字符串输入? - Ooker

0

我猜您想要重载+=运算符。这在TypeScript中并不支持。您需要手动进行强制类型转换。


我也没注意到这一点。真的很失望我们还没有这个功能,但我想现在也无能为力了。 - Zach

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接