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

Typescript泛型未提供时,如何设置ICreateItem的optionalFields默认类型?

问题解决:泛型接口的默认类型适配需求

需求说明:

  • 未指定ICreateItem泛型参数时,optionalFields属性类型为OptionalFieldsByTopic<Topic>
  • 指定泛型参数T时,optionalFields属性类型为OptionalFieldsByTopic<T>

原代码中泛型默认值设为never导致未传泛型时类型不符合预期,只需将泛型的默认参数改为Topic即可实现需求:

// 修改泛型默认值为Topic,实现默认类型适配
export interface ICreateItem<T extends Topic = Topic> {
  id: string;
  name: string;
  tags: string[];
  collectionId?: string;
  topic: string;
  optionalFields?: OptionalFieldsByTopic<T>;
}

type OptionalFieldsByTopic<T extends keyof IOptionalFields> = IOptionalFields[T];

export type Topic = keyof IOptionalFields;

export interface IOptionalFields {
  books: {
    author?: string;
    language?: string;
    translation?: string; 
  };
  vehicle: {
    model?: string;
    type?: string;
    color?: string;
  };
  painting: {
    author?: string;
    description?: string;
    image?: string;
  };
}

效果验证

  • 不指定泛型时:
    // optionalFields 类型为 books | vehicle | painting 的联合类型
    const item: ICreateItem = {
      id: "1",
      name: "测试项",
      tags: ["test"],
      topic: "books",
      optionalFields: { author: "brandon", language: "english" } // 符合类型要求
    };
    
  • 指定泛型时:
    // optionalFields 类型严格匹配books对应的结构
    const bookItem: ICreateItem<"books"> = {
      id: "2",
      name: "某本书",
      tags: ["literature"],
      topic: "books",
      optionalFields: { author: "J.K.Rowling", translation: "中文" } // 符合books类型约束
    };
    

内容的提问来源于stack exchange,提问作者Lukasz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 12:36:32