TypeScript拆分泛型函数的类型定义与赋值时无法识别泛型T如何解决
错误原因
你在类型别名IFetchData上声明的泛型参数<T>属于调用级泛型,需要在函数被调用时由使用者传入具体类型。但你实现fetchData2时没有在函数定义处声明对应的泛型形参,导致函数内部作用域无法识别T这个类型标识,才抛出找不到名称的错误。
解决方案
根据你的使用场景,可以选择以下两种写法:
方案1:保留泛型函数特性(调用时指定类型)
如果需要同一个函数支持调用时传入不同泛型返回不同类型的结果,在函数实现处补充声明泛型参数即可:
type IFetchData = <T>() => T[] // 实现函数时同步声明泛型<T> const fetchData2: IFetchData = <T>() => { const arr: T[] = [] // 符合条件时向数组推送元素 return arr } // 调用时传入具体类型,正常返回string[] const emptyStringArray = fetchData2<string>();
方案2:类型定义时固定泛型(定义时指定类型)
如果不同返回类型的函数需要单独定义,可以把泛型参数绑定到类型别名本身,使用类型时就指定具体类型:
// 泛型<T>声明在类型别名上,使用类型时需要指定具体类型 type IFetchData<T> = () => T[] // 定义函数时就绑定泛型为string,该函数只能返回string数组 const fetchStringData: IFetchData<string> = () => { const arr: string[] = [] // 业务逻辑 return arr } // 调用时不需要再传泛型,直接返回string[] const emptyStringArray = fetchStringData()
内容的提问来源于stack exchange,提问作者KyleMit
相关产品推荐
相关产品推荐

