找回密码
 加入我们
搜索
      
查看: 635|回复: 3

[软件] TypeScript的所谓Type弄得这么变态么?

[复制链接]
发表于 2025-7-8 11:40 | 显示全部楼层 |阅读模式
本帖最后由 Sly 于 2025-7-8 11:42 编辑

type Minus1<T extends number, C extends any[] = []> = [
  1,
  ...C
]["length"] extends T
  ? C["length"]
  : [1, 1, ...C]["length"] extends T
  ? [1, ...C]["length"]
  : Minus1<T, [1, 1, ...C]>;

type Number0= Minus1<1>

这么变态的且不谈,有人真的会用到所谓体操么?
发表于 2025-7-8 11:54 | 显示全部楼层
这个是 dependent type, 在类型系统中不算复杂的. 只是看起来长.
发表于 2025-7-8 11:56 | 显示全部楼层
给你翻译成 cpp 看起来就比较简洁了

  1. #include <concepts>

  2. using Zero = struct {};

  3. template<typename>
  4. struct Succ {};

  5. template<auto x>
  6. auto NatConstructor() {
  7.     if constexpr (x == 0)
  8.         return Zero{};
  9.     else
  10.         return Succ<decltype(NatConstructor<x - 1>())>{};
  11. }

  12. template<auto x>
  13. using Nat = decltype(NatConstructor<x>());

  14. auto main()->int {
  15.     using One = Succ<Zero>;
  16.     using Two = Succ<Succ<Zero>>;
  17.     using Three = Succ<Succ<Succ<Zero>>>;

  18.     using x = Nat<1>;
  19.     using y = Nat<2>;
  20.     using z = Nat<3>;
  21.     using w = Nat<0>;

  22.     static_assert(std::same_as<w, Zero>);
  23.     static_assert(std::same_as<x, One>);
  24.     static_assert(std::same_as<y, Two>);
  25.     static_assert(std::same_as<z, Three>);
  26. }
复制代码
发表于 2025-7-8 19:02 | 显示全部楼层
还好吧,最近我们公司新上的项目都开始放弃ts了。维护起来,成本太高了,尤其是一帮二把刀的后端,返回的同一个field name,经常出现不同的类型,疯了,想咋写就咋写。
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

Archiver|手机版|小黑屋|Chiphell ( 沪ICP备12027953号-5 )沪公网备310112100042806 上海市互联网违法与不良信息举报中心

GMT+8, 2025-7-10 06:01 , Processed in 0.008955 second(s), 5 queries , Gzip On, Redis On.

Powered by Discuz! X3.5 Licensed

© 2007-2024 Chiphell.com All rights reserved.

快速回复 返回顶部 返回列表