
示例工程【免费下载链接】type-challengesCollection of TypeScript type challenges with online judge项目地址https://gitcode.com/GitHub_Trending/ty/type-challenges点击查看免费下载Hello World 是 type-challenges 题库的 warm-up 开篇题目它的核心任务是在不写任何运行时逻辑的前提下把type HelloWorld any改成一个确切的string类型让测试用例在编译期通过。本文将以该题为主体结合题库的type-challenges/utils断言工具与template.ts/test-cases.ts源码讲清题目的评判机制、标准解法与扩展写法帮助你迈出类型体操的第一步。题目原文与目标题目位于 questions/00013-warm-hello-world/README.md作者是 Anthony Fu。原题给出的起点代码非常简单// expected to be string type HelloWorld any以及评判用的断言代码// you should make this work type test ExpectEqualHelloWorld, string题目的要求只有一句话把这个类型改成string让测试没有任何类型检查错误。在 Type Challenges 中我们不做console.log、不运行断言库而是用类型系统本身来完成断言——测试用例是编译期类型表达式类型检查通过即视为通过。通过测试需要满足的两个条件打开该题目的 test-cases.ts可以看到本题实际有两个断言约束import type { Equal, Expect, NotAny } from type-challenges/utils type cases [ ExpectNotAnyHelloWorld, ExpectEqualHelloWorld, string, ]这说明仅仅把HelloWorld改成string之外的其他类型比如number、boolean是不够的必须同时满足ExpectNotAnyHelloWorldHelloWorld不能是any防止你直接保留any蒙混过关ExpectEqualHelloWorld, stringHelloWorld必须严格等于string。Expect 与 NotAny 的实现原理这两个断言工具定义在 utils/index.d.tsexport type ExpectT extends true T export type ExpectTrueT extends true T export type IsAnyT 0 extends (1 T) ? true : false export type NotAnyT true extends IsAnyT ? false : trueExpectT对传入的类型参数加了T extends true的约束只有当T可赋值给true时类型才合法。因此ExpectNotAnyHelloWorld实际上要求NotAnyHelloWorld为true即IsAnyHelloWorld为false。这里IsAnyT用了一个经典技巧0 extends (1 T)。当T是any时1 any会坍缩为any0 extends any成立于是IsAnyany为true而对普通类型如string1 string是never0 extends never不成立IsAny为false。Equal 的实现原理同样在 utils/index.d.ts 中Equal采用了基于函数参数逆变位置的判断技巧export type EqualX, Y (T() T extends X ? 1 : 2) extends (T() T extends Y ? 1 : 2) ? true : false它构造两个泛型函数类型(T() T extends X ? 1 : 2)与(T() T extends Y ? 1 : 2)通过比较二者是否互相可赋值来判断X与Y是否严格相等。EqualHelloWorld, string只有在HelloWorld精确等于string时才会解析为true。结合 utils 包的定义utils/package.json 中声明types: index.d.ts测试文件通过import type { Equal, Expect, NotAny } from type-challenges/utils引入这些工具作为workspace:*依赖挂载于 package.json 中并在 pnpm-workspace.yaml 中统一管理。标准解法与验证将 template.ts 中的any改为stringtype HelloWorld string // expected to be a string此时两个断言都会通过NotAnystring为trueEqualstring, string为truecases数组的每个元素都满足Expect的T extends true约束编译期类型检查零错误。在本地验证时仓库根目录的 tsconfig.json 继承了 tsconfig.base.json其中开启了strict: true、noImplicitReturns: true、noUnusedParameters: true等严格选项保证类型断言在严格模式下被完整校验。运行npx tsc --noEmit或pnpm tsc --noEmit即可检查全部题目用例也可以只针对questions/00013-warm-hello-world/目录做类型检查确认无错误输出即通过。扩展练习从 Hello World 看类型断言的价值这道 warm-up 虽然简单却揭示了整个题库的统一评判范式每个题目都由template.ts你的作答区和test-cases.ts编译期断言构成作答正确与否完全由类型系统判定不依赖任何运行时测试框架。以更进阶的题目为例questions/00002-medium-return-type/test-cases.ts 同样使用ExpectEqual...断言MyReturnType的多种输入输出如() string、() Promiseboolean、联合类型返回值等而 questions/00002-medium-return-type/template.ts 中初始实现同样只是一句type MyReturnTypeT any。理解了Equal/Expect的机制你就理解了所有 200 题目的验收方式把any替换为真正的类型推导逻辑让每一个Expect...都在编译期亮起绿灯。小结项目说明题目Hello Worldwarm-up题号 13目标让ExpectNotAnyHelloWorld与ExpectEqualHelloWorld, string编译通过解法type HelloWorld string评判机制纯类型系统断言基于 utils/index.d.ts 的Expect/NotAny/Equal相关文件README.md、template.ts、test-cases.ts从any到string只差一个类型标注却完成了从“无类型约束”到“精确类型断言”的关键一跃。点击题目的 Take the Challenge 按钮开始编码享受类型体操的乐趣吧。赞分享示例工程【免费下载链接】type-challengesCollection of TypeScript type challenges with online judge项目地址https://gitcode.com/GitHub_Trending/ty/type-challenges点击查看免费下载相关推荐Type Challenges项目中的Hello World类型挑战解析Type Challenges项目中的Hello World类型挑战解析 在TypeScript类型编程的学习过程中Type Challenges项目提供了一示例工程怎么让微信公众号变成 RSS 订阅源wewe-rss 私有化部署完整教程怎么让微信公众号变成 RSS 订阅源wewe rss 私有化部署完整教程 你大概有过这种经历想把某个公众号的历史文章收进 RSS 阅读器长期归档结果发现微后端前端Type Challenges 项目中的 Hello World 类型挑战解析Type Challenges 项目中的 Hello World 类型挑战解析 在 TypeScript 类型编程的世界里type challenges 项目示例工程上一篇DataGraph 反应式状态管理Civitai 基于 DAG 的类型安全状态系统深度解析下一篇在 mlx-vlm 中使用 SAM3Mac 上的开放词汇检测、实例分割与视频追踪实战指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考