如何限制泛型类型只能为指定的几种类型之一?
限制泛型参数仅接受指定联合类型中的单个成员
要让泛型参数T只能接受ValidTypes联合类型中的某一种具体类型,直接给泛型添加extends ValidTypes约束即可,TypeScript会自动限制T的取值范围:
type ValidTypes = TOptBoxParams | TOptInputParams | TOptColorParams | TOptSelectParams; // 通过extends约束泛型T的取值范围 type TOtherType<T extends ValidTypes> = { // 可根据需求添加类型属性 data: T; };
效果说明
合法场景:传入
ValidTypes中的任意单个类型,编译器会正常通过:// 正确:使用TOptBoxParams类型 const boxInstance: TOtherType<TOptBoxParams> = { data: {/* 匹配TOptBoxParams结构 */} }; // 正确:使用TOptInputParams类型 const inputInstance: TOtherType<TOptInputParams> = { data: {/* 匹配TOptInputParams结构 */} };非法场景:传入不在
ValidTypes中的类型,编译器会直接报错:// 错误:传入了联合外的自定义类型 const invalidInstance: TOtherType<{ extra: string }> = { data: { extra: "test" } };
进阶:严格禁止传入整个联合类型
如果需要确保T只能是联合中的单个成员,不能是ValidTypes本身(整个联合),可以添加额外约束排除联合类型:
// 辅助类型:判断T是否为单个非联合类型 type IsSingleType<T> = T extends infer U ? U extends T ? [T] extends [U] ? U : never : never : never; // 同时约束T属于ValidTypes且为单个类型 type TOtherType<T extends ValidTypes & IsSingleType<T>> = { data: T; };
此时如果传入ValidTypes整个联合,编译器会报错,只能使用单个成员类型。
内容的提问来源于stack exchange,提问作者Salomon Sanz
相关产品推荐
相关产品推荐

