TypeScript如何为字符串字面量联合类型加前缀生成新类型
解答
完全可以实现,TypeScript 4.1 及以上版本原生提供的模板字面量类型可以直接满足这个需求,不需要额外的黑科技写法。
你只需要把原来的字符串拼接写法换成类型层面的模板语法即可,TS会自动遍历联合类型的所有成员,生成拼接前缀后的对应字面量联合:
type UserField = "id" | "name"; // 插值位置传入联合类型时,TS会分布式处理所有联合成员 type PostField = "id" | "message" | `author.${UserField}`; // 以下赋值可正常通过类型校验 let somePostFields: PostField[] = ["id", "message", "author.name", "author.id"];
实现原理
当模板字面量类型的插值位置传入联合类型时,TS会触发分布式类型特性:将联合类型的每一个成员单独和前后的固定字符串拼接,最终把所有拼接结果重新组成联合类型。上述例子中author.${UserField}会被自动推导为"author.id" | "author.name",和你预期的生成规则完全一致。
如果传入了不符合规则的字段,比如给数组加了"author.age"这类不在定义范围内的值,TS会直接抛出类型错误,符合类型校验的要求。
注意:该特性为 TypeScript 4.1 正式新增的语法,低于 4.1 的版本没有原生支持的实现方案,无需额外尝试兼容写法。
内容的提问来源于stack exchange,提问作者Roboroads
相关产品推荐
相关产品推荐

