TypeScript类型推断疑问:为何无法推断data的类型?
TypeScript泛型推断错误:无法访问
data.list的问题 你的代码写法确实存在问题,导致TypeScript无法正确推断data的类型,核心问题出在泛型的使用逻辑和类型标注的干扰上:
错误原因分析
any类型破坏了泛型推断:你在clearFn里把参数返回值标注为any,这会让TypeScript直接跳过类型检查,忽略你为getQuestionList设置的泛型默认类型{list: string[]}。- 泛型关联不明确:调用
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
相关产品推荐
相关产品推荐

