TypeScript的所谓Type弄得这么变态么?
本帖最后由 Sly 于 2025-7-8 11:42 编辑type Minus1<T extends number, C extends any[] = []> = [
1,
...C
]["length"] extends T
? C["length"]
: ["length"] extends T
? ["length"]
: Minus1<T, >;
type Number0= Minus1<1>
这么变态的且不谈,有人真的会用到所谓体操么? 这个是 dependent type, 在类型系统中不算复杂的. 只是看起来长. 给你翻译成 cpp 看起来就比较简洁了
#include <concepts>
using Zero = struct {};
template<typename>
struct Succ {};
template<auto x>
auto NatConstructor() {
if constexpr (x == 0)
return Zero{};
else
return Succ<decltype(NatConstructor<x - 1>())>{};
}
template<auto x>
using Nat = decltype(NatConstructor<x>());
auto main()->int {
using One = Succ<Zero>;
using Two = Succ<Succ<Zero>>;
using Three = Succ<Succ<Succ<Zero>>>;
using x = Nat<1>;
using y = Nat<2>;
using z = Nat<3>;
using w = Nat<0>;
static_assert(std::same_as<w, Zero>);
static_assert(std::same_as<x, One>);
static_assert(std::same_as<y, Two>);
static_assert(std::same_as<z, Three>);
} 还好吧,最近我们公司新上的项目都开始放弃ts了。维护起来,成本太高了,尤其是一帮二把刀的后端,返回的同一个field name,经常出现不同的类型,疯了,想咋写就咋写。
页:
[1]