【问题标题】:Typescript: increment number type打字稿:递增数字类型
【发布时间】:2019-01-17 19:59:59
【问题描述】:

是否有可能从数字类型T 得到值为T+1 的数字类型Y

type one = 1

type Increment<T extends number> = ???

type two = Increment<one> // 2

附:目前,我有增量值的硬编码接口,但问题是硬编码的,因此受到限制:

export type IncrementMap = {
    0: 1,
    1: 2,
    2: 3,

【问题讨论】:

  • 如果你真的想包装增量操作,一个简单的函数会更容易。您为什么要为此目的使用模板?
  • 与其他问题的答案相同...not officially。您可能可以使某些东西适用于低数字,但是长度为 100 左右的硬编码列表(例如,[1,2,3,4,5,6,7...])可能会表现更好并导致不幸的是,您的头痛减少了。
  • @jcalz 你的 cmets 为我节省了大量的时间,让我进一步失败的实验。谢谢!
  • @IanMacDonald 抱歉,我无法通过简单的函数获得解决方案,您可以展示一下吗?我也没有使用任何模板,是吗?
  • function increment(input: number): number { return input+1 }?

标签: typescript increment typescript-typings


【解决方案1】:

我会像这样对其进行硬编码:

type Increment<N extends number> = [
  1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,
  21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,
  38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54, // as far as you need
  ...number[] // bail out with number
][N]

type Zero = 0
type One = Increment<Zero> // 1
type Two = Increment<One>  // 2

type WhoKnows = Increment<12345>; // number

正如我在其他 cmets 中所说,目前对这种自然递归类型没有很好的支持。我would love it 如果它受支持,但它不存在。在实践中,我发现如果某些东西可以处理长度为 20 左右的元组就足够了,但您的经验可能会有所不同。

无论如何,如果有人在这里提出了一个没有硬编码但也适用于任意数字(Increment&lt;123456789&gt; 将评估为123456790)的解决方案,我很想看看它。也许在未来的某一天,它会成为语言的一部分。

希望有所帮助;祝你好运!

【讨论】:

  • 谢谢!我实际上做了几乎相同但更愚蠢的方式(我在问题中提到了IncrementMap。我忘记了当我可以只使用一个元组时我不需要指定键0、1、2)。顺便说一句,bail out 部分很棒!!刚注意到!
【解决方案2】:

这个解决方案不是硬编码的,但由于 TypeScript 的递归限制,它没有用处。当我测试它时,它不能处理大于 45 的Number2Nat

type SomeNat = [...unknown[]];
type Zero = [];
type Succ<N extends SomeNat> = [...N, unknown];
type Nat2Number<N extends SomeNat> = N["length"];
type Dec<N extends SomeNat> = N extends [unknown, ...infer T] ? T : never;
type Add<N extends SomeNat, M extends SomeNat> = [...N, ...M];
type Sub<N extends SomeNat, M extends SomeNat> = M extends Zero ? N : Sub<Dec<N>, Dec<M>>;
type Number2Nat<I extends number, N extends SomeNat = Zero> = I extends Nat2Number<N> ? N : Number2Nat<I, Succ<N>>;

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-10
  • 2021-12-18
  • 2018-05-02
  • 2022-12-05
  • 2021-11-26
  • 1970-01-01
  • 2021-06-17
相关资源
最近更新 更多