如何将TypeScript联合类型限制为仅含user开头的元素?
从TypeScript联合类型中筛选以特定前缀开头的成员
你之前的写法无效,是因为直接把整个options联合类型当作判断主体,TypeScript会将其视为一个整体检查是否匹配user${infer T},而非逐个遍历联合里的元素。
要实现逐个元素筛选,得用TypeScript的分布式条件类型——当条件类型的泛型参数是联合类型时,TypeScript会自动把条件应用到联合的每个成员上,最终返回筛选后的联合结果。
代码实现
首先保留原联合类型:
type options = | "user" | "user_ID" | "user_active" | "location" | "location_address";
然后定义筛选用的泛型类型:
// 筛选以"user"开头的成员 type FilterUserOptions<T> = T extends `user${string}` ? T : never; // 最终得到的类型:"user" | "user_ID" | "user_active" type UserOnlyOptions = FilterUserOptions<options>;
补充:提取前缀后的部分
如果需要提取user前缀之后的内容,可以用infer语法:
type FilterUserOptionsWithInfer<T> = T extends `user${infer Rest}` ? Rest : never; // 得到的结果:"" | "_ID" | "_active" type UserOptionRestParts = FilterUserOptionsWithInfer<options>;
内容的提问来源于stack exchange,提问作者BobtheMagicMoose
相关产品推荐
相关产品推荐

