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

TypeScript类型推断疑问:为何无法推断data的类型?

TypeScript泛型推断错误:无法访问data.list的问题

你的代码写法确实存在问题,导致TypeScript无法正确推断data的类型,核心问题出在泛型的使用逻辑和类型标注的干扰上:

错误原因分析

  1. any类型破坏了泛型推断:你在clearFn里把参数返回值标注为any,这会让TypeScript直接跳过类型检查,忽略你为getQuestionList设置的泛型默认类型{list: string[]}。
  2. 泛型关联不明确:调用get<T, C>时,没有让clearFn的参数类型和泛型T建立明确绑定,反而用any覆盖了类型约束。

修正后的代码

import axios from 'axios';

const get = <T, C>(url: string, clearFn: (data: T) => C): Promise<C | null> =>
  new Promise((resolve) => {
    axios
      .get(url)
      .then((result) => {
        resolve(clearFn(result.data.data))
      })
      .catch(() => {
        resolve(null)
      })
  })

function getQuestionList<T = { list: string[] }, C = { list: number[] }>(): Promise<C | null> {
  // 去掉any标注,让data自动关联泛型T的类型
  return get('acb/abc', (data: T): C => {
    console.log(data.list) // 此时TypeScript能正确识别data为{list: string[]}
    return { list: [1, 2] } as C
  })
}

更简洁的写法(利用自动推断)

如果不需要强制约束返回值类型,也可以让TypeScript根据返回值自动推断C:

function getQuestionList<T = { list: string[] }>(): Promise<{ list: number[] } | null> {
  return get('acb/abc', (data) => {
    console.log(data.list)
    return { list: [1, 2] }
  })
}

关键注意点

  • 避免用any标注函数参数或返回值,它会直接失效TypeScript的类型检查能力。
  • 泛型的核心是建立类型约束关系,确保函数参数、返回值之间的类型能被正确关联推断。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 08:03:57