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
相关产品推荐
相关产品推荐

