如何在TypeScript中为字面量名称编写泛型简化函数重载?
解决方案
可以通过泛型配合类型映射表实现需求,无需手动编写大量函数重载。
步骤1:定义资源类型映射
先声明一个接口,用来统一管理所有资源名字面量和对应类型的映射关系:
interface Note { id: number, title: string, text: string } interface Comment { id: number, content: string, noteId: number } // 资源映射表,后续新增资源只需要在这里加键值对 interface ResourceTypeMap { note: Note; comment: Comment; }
步骤2:声明泛型化的create函数
直接基于上面的映射表定义泛型函数即可,如果是在.d.ts声明文件中,加declare前缀即可:
function create<K extends keyof ResourceTypeMap>(name: K, attrs: ResourceTypeMap[K]): ResourceTypeMap[K] { // 此处为js-data原有实现逻辑,声明文件中可省略函数体 }
效果验证
完全符合预期的类型校验规则:
- 资源名拼写错误时,TS会直接抛出类型错误
- 传入的attrs和对应资源类型不匹配时,TS会自动识别抛出错误
- 后续新增资源无需修改create函数,只需要在ResourceTypeMap中追加映射关系即可,维护成本极低
内容的提问来源于stack exchange,提问作者Run
相关产品推荐
相关产品推荐

