
示例工程【免费下载链接】type-challengesCollection of TypeScript type challenges with online judge项目地址https://gitcode.com/GitHub_Trending/ty/type-challenges点击查看免费下载本篇指南围绕 TypeScript 类型挑战仓库type-challenges中编号为 00011 的入门题 Tuple to Object日语文档见 questions/00011-easy-tuple-to-object/README.ja.md展开。你将学会如何接收一个元组、遍历其元素并将每个元素作为 key/value 构造成对象类型同时掌握as const、readonly约束、索引访问T[number]与映射类型mapped type的组合用法。读完本文你可以独立写出通过全部测试用例的TupleToObject类型并为后续 Tuple to Union、Tuple to Nested Object 等进阶题目打下基础。题目要求元组转对象题目原文日文给出的核心任务是タプルを受け取り、その各値のkey/valueを持つオブジェクトの型に変換する型を実装します。即接收一个元组将它转换成一个对象类型该对象类型的每个键key和值value都来自元组中的对应元素。题目给出的示例为const tuple [tesla, model 3, model X, model Y] as const type result TupleToObjecttypeof tuple // expected { tesla: tesla, model 3: model 3, model X: model X, model Y: model Y}可以看到tesla、model 3等字符串字面量既充当对象的键也充当对象的值的类型。这道题在仓库中被标记为 easy 难度标签为#object-keys作者为 sinoon元数据见 questions/00011-easy-tuple-to-object/info.yml。仓库给出的模板文件 questions/00011-easy-tuple-to-object/template.ts 只有一行type TupleToObjectT extends readonly any[] any框架已经替我们声明了类型参数T及其约束T extends readonly any[]我们需要把any替换成真正的实现。为什么示例中一定要写as const观察示例第一行const tuple [tesla, model 3, model X, model Y] as const如果去掉as consttuple的类型会是string[]此时typeof tuple是一个普通数组类型元素的字面量信息tesla等会全部丢失也就无法在类型层面逐个取出元素。加上as const之后tuple的类型被收窄为只读元组readonly [tesla, model 3, model X, model Y]每个元素都被提升为精确的字面量类型这正是后续映射类型能够逐一枚举元素的前提。这也是模板约束写成readonly any[]而非any[]的原因as const产生的数组类型是只读的readonly tuple如果约束写成可变数组any[]传入readonly元组会因 readonly 修饰符不兼容而报错。从 questions/00011-easy-tuple-to-object/test-cases.ts 的用例可见所有合法输入都是as const产生的 readonly 元组。核心实现索引访问 映射类型标准解法只需三行type TupleToObjectT extends readonly any[] { [P in T[number]]: P }拆开来看这个实现由三个 TypeScript 类型能力组成索引访问T[number]number作为索引时T[number]会取出元组所有元素类型组成的联合类型。对readonly [tesla, model 3, model X, model Y]而言T[number]即tesla | model 3 | model X | model Y。这是把数组扁平化为元素联合的关键一步也正是后续映射遍历的输入。映射类型[P in T[number]]in语法遍历联合类型的每个成员P为每个成员生成一个对象属性属性名就是P本身。值类型: P每个属性的值类型也等于P从而保证键与值一一对应。于是最终结果自然展开为{ tesla: tesla, model 3: model 3, model X: model X, model Y: model Y }与题目期望完全一致。通过测试用例验证边界number、symbol 与混合元组模板能否通过判定取决于 test-cases.ts 中四组正例和一组反例。这些用例揭示了实现必须支持的输入形态1. 字符串元素元组const tuple [tesla, model 3, model X, model Y] as const ExpectEqualTupleToObjecttypeof tuple, { tesla: tesla, model 3: model 3, model X: model X, model Y: model Y }2. 数字元素元组const tupleNumber [1, 2, 3, 4] as const ExpectEqualTupleToObjecttypeof tupleNumber, { 1: 1, 2: 2, 3: 3, 4: 4 }注意这里的键是数字字面量1、2。映射类型[P in T[number]]对数字同样成立——TypeScript 对象的键本来就可以是 string、number 或 symbol 三种。3. Symbol 元素元组const sym1 Symbol(1) const sym2 Symbol(2) const tupleSymbol [sym1, sym2] as const ExpectEqualTupleToObjecttypeof tupleSymbol, { [sym1]: typeof sym1, [sym2]: typeof sym2 }这里比较特别元组元素是Symbol(1)、Symbol(2)这两个独一无二的 symbol 值。由于as const保留了它们的唯一标识T[number]得到的是typeof sym1 | typeof sym2这样的唯一 symbol 类型映射后即可生成以 symbol 为键、以typeof symX为值的对象类型。4. 数字、字符串、symbol 混合元组const tupleMix [1, 2, 3, 4, sym1] as const ExpectEqualTupleToObjecttypeof tupleMix, { 1: 1, 2: 2, 3: 3, 4: 4, [sym1]: typeof sym1 }这个用例同时验证了数字字面量、字符串字面量注意2、4是带引号的字符串与数字1、3区分以及 symbol 三种键形态的共存证明[P in T[number]]的实现对异构元组同样稳健。反例为什么[[1, 2], {}]必须报错测试文件末尾还有一组使用ts-expect-error的反例// ts-expect-error type error TupleToObject[[1, 2], {}]ts-expect-error的含义是这一行必须产生类型错误测试才算通过。这里的输入元组元素是数组[1, 2]和对象{}二者都不属于 string / number / symbol 中的任何一种不能作为对象键使用。我们的映射类型会尝试把[1, 2]和{}作为属性名TypeScript 因此会抛出 An index signature parameter type cannot be a literal type or generic type 之类的错误。反过来说这一反例也揭示了T extends readonly any[]这个约束只能保证输入是只读数组/元组它本身并不限制元素类型——元素是否合法取决于它们能否充当对象键。如果把约束收紧为readonly PropertyKey[]PropertyKey string | number | symbol该反例会在约束层提前被拦截行为同样正确但仓库模板选择保留更宽松的readonly any[]把校验责任交给映射类型本身。测试基础设施Expect 与 Equal 如何判定所有正例都包裹在ExpectEqual...中这是 type-challenges 统一提供的验证工具实现在 utils/index.d.tsexport type ExpectT extends true T export type EqualX, Y (T() T extends X ? 1 : 2) extends (T() T extends Y ? 1 : 2) ? true : false其判定原理是如果X和Y在任何泛型推断下都表现一致即结构上完全等价EqualX, Y才产出trueExpectT extends true则要求结果必须是字面量true否则编译期报错。因此实现是否与期望类型完全一致由编译器的类型检查强制保证无需运行时测试。这也是本仓库所有题目的通用验证模式Equal与Expect的完整定义见 utils/index.d.ts。延伸从 Tuple to Object 到进阶系列本题目录的 info 元数据questions/00011-easy-tuple-to-object/info.yml列出了四个相关挑战它们构成了围绕元组 / 联合类型 / 对象的完整进阶路线10 · Tuple to Unionmedium模板 questions/00010-medium-tuple-to-union/template.ts 要求TupleToUnionT输出元素联合类型这正是本题T[number]的独立应用——可以说完成本题后第 10 题的思路已经水到渠成。3188 · Tuple to Nested Objectmedium把扁平元组递归构造成嵌套对象如[a, b, c]生成{ a: { b: { c: ... } } }是本题映射思路的递归深化版模板见 questions/03188-medium-tuple-to-nested-object/template.ts。472 · Tuple to Enum Objecthard要求为元组生成带readonly修饰和数值索引的对象可视为元组 → 对象在枚举语义上的拓展模板见 questions/00472-hard-tuple-to-enum-object/template.ts。730 · Union to Tuplehard方向相反——把联合类型转回元组目录见 questions/00730-hard-union-to-tuple难度显著提升需要借助函数参数逆变等技巧。小结TupleToObject虽然标注为 easy却浓缩了三个重要的类型编程基本功用as const保留字面量信息、用T[number]从元组提取元素联合、用映射类型[P in T[number]]生成一一对应的对象。再加上对 readonly 约束与对象键合法性的理解你便已经具备了阅读进阶元组系题目Tuple to Union、Tuple to Nested Object、Tuple to Enum Object所需的知识储备。动手验证时可以直接在本仓库中运行类型检查将 template.ts 中的any替换为上述实现并对照 test-cases.ts 中的全部用例进行编译验证即可。赞分享示例工程【免费下载链接】type-challengesCollection of TypeScript type challenges with online judge项目地址https://gitcode.com/GitHub_Trending/ty/type-challenges点击查看免费下载相关推荐type-challenges 第 11 题解析Tuple to Object 元组到对象类型转换type challenges 第 11 题解析Tuple to Object 元组到对象类型转换 本篇文章围绕 type challengesTypeSc示例工程type-challenges 00011元组转换为对象TupleToObject——从 as const 到映射类型的完整实战type challenges 00011元组转换为对象TupleToObject——从 as const 到映射类型的完整实战 本篇文章基于 type示例工程从元组到对象Type Challenges中TupleToObject类型的实战解析从元组到对象Type Challenges中TupleToObject类型的实战解析 你还在为TypeScript中的类型转换感到困惑吗面对元组与对象之间的示例工程上一篇CARLA 运行时动态纹理替换全指南通过 Python API 实时修改场景资产外观下一篇vue-material无障碍设计符合WCAG标准的Material界面实现创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考