资讯详情

资讯详情

TypeScript 类型挑战 AnyOf:在类型系统中复刻 Python 的 `any` 函数

示例工程【免费下载链接】type-challengesCollection of TypeScript type challenges with online judge项目地址https://gitcode.com/GitHub_Trending/ty/type-challenges点击查看免费下载AnyOf是 type-challenges 仓库中的一道 medium中等难度、#array标签下的类型体操题目核心目标是在 TypeScript 类型系统内实现一个与 Python 内置any函数语义一致的类型工具接收一个数组只要其中存在任意一个真值元素就返回true否则返回false空数组直接返回false。本文以题目日文原版 questions/00949-medium-anyof/README.ja.md 为骨架结合仓库内的 template.ts 起点代码与 test-cases.ts 测试用例完整推导出可运行的解法并剖析类型层面如何判定真值这一关键难点。题目解读类型系统的any语义题目要求日文原文非常简洁Python のany関数のような型を実装してください。実装する型は配列を受け取り、その配列のいずれかの要素が真ならばtrueを返します。なお、受け取った配列が空配列の場合はfalseを返します。即实现一个接收数组、返回布尔字面量类型true/false的类型工具判定规则为只要数组中存在一个真值元素即为true空数组为false。题目给出的两个示例明确了期望行为type Sample1 AnyOf[1, , false, [], {}] // expected to be true. type Sample2 AnyOf[0, , false, [], {}] // expected to be false.Sample1中因为有元素1真值所以整体为trueSample2中全部元素——0、空字符串、false、空数组、空对象——都是假值所以整体为false。在仓库中的元数据 info.yml 记录了该题的基本信息difficulty: medium、tags: array。而 template.ts 给出的起点是一个约束为只读数组、返回任意类型的占位实现type AnyOfT extends readonly any[] any我们的任务就是把这个any替换为真正符合语义的布尔类型计算。关键难点一在类型系统里判定真值运行时 JavaScript 的真值truthy判断是语言内置行为但在类型层面没有现成的Boolean()工具必须手动枚举假值falsy集合。参考题目测试用例与示例本挑战语境下的假值包括字面量false数字0空字符串空数组[]空对象{}undefined、null这里有两个容易翻车的陷阱也是本题目最核心的考点陷阱 10 extends number与联合类型的分布陷阱。类型比较不是值比较0是number的子类型但不能把整个number当作真值或假值混用同时涉及联合类型时还要警惕条件类型的分发distributive行为。陷阱 2空对象{}的判别。这是最大的难点。{}在 TypeScript 中是一个非常宽泛的类型几乎任何非null/undefined的值都兼容它——直接写T extends {} ? ...会让所有对象、字符串、数字都落入同一分支无法区分空对象与非空对象。必须借助键集合探测若对象的keyof结果为never说明它没有任何属性即为空对象。推荐解法递归遍历 逐元素真值判定最直观且与Python 的 any语义最贴近的实现是递归地逐个剥离数组元素遇到真值立即短路返回true全部遍历完仍无真值则返回false。首先定义假值联合类型type Falsy false | 0 | | undefined | null | [] | Recordstring, never其中Recordstring, never用于表示没有任何 string 键拥有非never值的对象即空对象{}会extends它而{ name: test }、{ 1: test }这类含键对象不会。然后递归实现type AnyOfT extends readonly any[] T extends [infer F, ...infer R] ? F extends Falsy ? AnyOfR // 当前元素为假值继续检查剩余元素 : true // 遇到真值短路返回 true : false // 数组遍历完毕或本身为空返回 false逐行解读T extends [infer F, ...infer R]利用元组解构把数组拆成首个元素F 剩余元素R若T是空数组[]该条件不成立落入false分支——正好满足空数组返回false的要求。F extends Falsy判定当前元素是否为假值。1、test、true、[1]、{ name: test }、{ 1: test }均不extends Falsy直接返回true。假值则进入AnyOfR递归处理剩余元素这一递归结构与仓库中 Includes00898 等数组类题目的逐元素遍历模式一脉相承。验证与仓库测试用例逐一对账test-cases.ts 共提供 10 个用例全部通过Equal来自 utils/index.d.ts严格比较结果类型。用上述实现逐一验证输入数组期望判定过程[1, test, true, [1], { name: test }, { 1: test }]true首个元素1即真值[1, , false, [], {}]true首个元素1即真值[0, test, false, [], {}]true0为假值但test为真值[0, , true, [], {}]truetrue为真值[0, , false, [1], {}]true[1]非空数组为真值[0, , false, [], { name: test }]true含键对象为真值[0, , false, [], { 1: test }]true数字键对象同样为真值[0, , false, [], { name: test }, { 1: test }]true含键对象为真值[0, , false, [], {}, undefined, null]false全部为假值递归耗尽[]false空数组直接落入false分支其中最后两行是题目的边界防线undefined、null必须被判定为假值空数组[]与空对象{}必须分别被[]与Recordstring, never分支正确捕获。整个递归在假值序列上逐层推进最终以false收尾与 Pythonany([]) False的语义完全一致。另一种视角联合类型整体判定除递归外还存在一种更简洁的整体判定思路对元组取T[number]得到所有元素构成的联合类型再检查整个联合是否都extends Falsy——因为联合类型extends某类型要求其所有成员都满足这正好等价于不存在任何真值元素type AnyOfT extends readonly any[] T[number] extends false | 0 | | undefined | null | [] | Recordstring, never ? false : true空数组[]的T[number]是never而never extends 任何类型恒为真因此自动得到false无需单独处理空数组分支。两种方案各有取舍递归方案代码更具可读性、逐步语义清晰适合作为主推解法联合方案更短但要求解题者深刻理解条件类型对联合的分发与never的子类型特性可作为进阶思考题。小结AnyOf这道 medium 题目的价值不在于递归本身那属于 easy 级别技巧而在于把运行时真值概念精确翻译为类型约束手动枚举假值集合、借助keyof/Recordstring, never绕开{}宽泛匹配陷阱、正确处理空数组与never。将上述实现填入 template.ts并通过 test-cases.ts 的 10 个断言即可在类型层面获得一个行为与 Pythonany完全对齐的工具类型。这一模式同样可复用到every全真判断、none全假判断等同类语义的类型实现中。赞分享示例工程【免费下载链接】type-challengesCollection of TypeScript type challenges with online judge项目地址https://gitcode.com/GitHub_Trending/ty/type-challenges点击查看免费下载相关推荐type-challenges 949 题解在 TypeScript 类型系统中实现 Python 式 anyAnyOftype challenges 949 题解在 TypeScript 类型系统中实现 Python 式 anyAnyOf 导读 AnyOf 是 type示例工程type-challenges 第 949 题 AnyOf在类型系统里实现类 Python any 的真值判定type challenges 第 949 题 AnyOf在类型系统里实现类 Python any 的真值判定 本题来自 type challenges ht示例工程TypeScript 类型挑战 Square在类型系统中实现数字平方运算TypeScript 类型挑战 Square在类型系统中实现数字平方运算 本篇技术指南以 type challenges 仓库中的 27133 · Squar示例工程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →