为每个元组添加字符串;TypeScript中如何定义关联类型并保持输出一致
让我一步步帮你解决这两个问题:
问题1:如何为每个元组添加一个字符串
这里分运行时操作元组元素和类型层面定义带字符串的元组类型两种场景:
场景1:运行时给元组的每个元素添加字符串
如果你有一个实际的元组值,想要给每个元素拼接前缀/后缀字符串,可以用数组的map方法,结合const断言来保留严格的字面量类型:
// 原始元组(用as const保留字面量类型) const originalTuple = [1, 'apple', true] as const; // 给每个元素添加前缀"tipe-" const tupleWithPrefix = originalTuple.map(item => `tipe-${item}`) as const; // tupleWithPrefix的类型是:["tipe-1", "tipe-apple", "tipe-true"]
如果不需要严格保留字面量类型,直接去掉as const即可:
const originalTuple = [1, 'apple', true]; const tupleWithPrefix = originalTuple.map(item => `tipe-${item}`); // 类型是 string[]
场景2:类型层面定义带字符串的元组类型
如果是要定义一个元组类型,每个元素都是原元组元素拼接字符串后的类型,可以用映射类型遍历元组的索引:
// 原始元组类型 type OriginalTuple = [number, string, boolean]; // 定义每个元素都拼接"tipe-"的元组类型 type TupleWithString = { [K in keyof OriginalTuple]: `tipe-${OriginalTuple[K]}` }; // TupleWithString的类型是:[`tipe-${number}`, `tipe-${string}`, `tipe-${boolean}`]
如果是针对字面量元组类型,还能得到更精确的结果:
type OriginalLiteralTuple = [1, 'apple', true]; type TupleWithString = { [K in keyof OriginalLiteralTuple]: `tipe-${OriginalLiteralTuple[K]}` }; // 结果是:["tipe-1", "tipe-apple", "tipe-true"]
问题2:定义mytype2为'1'|'2'|'3',但使用时对应'tipe-1'|'tipe-2'|'tipe-3'
你需要的是类型层面的双向映射:从mytype提取数字部分得到mytype2,再从mytype2转换回mytype,同时保证类型安全。具体实现如下:
// 你的原始类型 type mytype = 'tipe-1' | 'tipe-2' | 'tipe-3'; // 步骤1:从mytype中提取数字部分,得到mytype2 type ExtractNumberFromMytype<T extends string> = T extends `tipe-${infer N}` ? N : never; type mytype2 = ExtractNumberFromMytype<mytype>; // mytype2的类型是:'1' | '2' | '3' // 步骤2:定义从mytype2转换回mytype的类型 type ConvertToMytype<T extends mytype2> = `tipe-${T}`; // 可选:运行时转换函数(保证值和类型一致,避免手动断言出错) function toMytype(num: mytype2): mytype { return `tipe-${num}` as mytype; } // 使用示例 const shortVal: mytype2 = '2'; const fullVal = toMytype(shortVal); // fullVal的类型是mytype,值是'tipe-2'
这种方式既满足了mytype2作为数字字面量类型的需求,又能安全转换回你需要的mytype类型,同时保持了类型检查的严格性。
内容的提问来源于stack exchange,提问作者Bambang Adhitya Permana
相关产品推荐
相关产品推荐

