You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何限制泛型类型只能为指定的几种类型之一?

限制泛型参数仅接受指定联合类型中的单个成员

要让泛型参数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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 03:59:56