TypeScript中如何正确推断类型?(TS版本3.7.4)
TypeScript 3.7.4 类型推断优化方案
1. 建立表名与数据类型的映射关联
先定义一个映射类型,让TypeScript明确每个枚举值对应的具体数据类型:
enum TableNames { example = 'example', example2 = 'example2' } // 各表对应的数据类型 type ExampleDataType = { id: number; name: string }; type ExampleData2Type = { uid: string; content: string }; // 核心映射:关联枚举与对应数据类型 type TableDataMap = { [TableNames.example]: ExampleDataType; [TableNames.example2]: ExampleData2Type; };
2. 优化createPath函数的类型定义
利用TypeScript 3.7.4支持的函数重载,实现精确的类型推断:
// 重载签名:为每个表名指定对应的record类型 function createPath(tableName: TableNames.example, record: TableDataMap[TableNames.example]): string; function createPath(tableName: TableNames.example2, record: TableDataMap[TableNames.example2]): string; // 通用实现签名 function createPath<TName extends TableNames>(tableName: TName, record: TableDataMap[TName]): string { // 函数逻辑示例 if (tableName === TableNames.example) { // 此处record自动推断为ExampleDataType return `/tables/${tableName}/${record.id}`; } else { // 此处record自动推断为ExampleData2Type return `/tables/${tableName}/${record.uid}`; } }
3. 验证类型推断效果
调用函数时,TypeScript会根据传入的tableName自动校验并推断record类型:
// 合法:record符合ExampleDataType要求 createPath(TableNames.example, { id: 1, name: 'test' }); // 合法:record符合ExampleData2Type要求 createPath(TableNames.example2, { uid: '2', content: 'demo' }); // 非法:类型不匹配,TS会直接报错 createPath(TableNames.example, { uid: '3', content: 'error' });
兼容原InferListType的改造
如果原代码依赖InferListType,可以替换为基于映射表的条件类型,保留原有命名:
type InferListType<TName extends TableNames> = TableDataMap[TName];
内容的提问来源于stack exchange,提问作者Irfan
相关产品推荐
相关产品推荐

