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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 03:45:32