TypeScript泛型类型错误解析及类型定义疑问
解答
1. 所有类型定义解释
ReadonlyDeep:来自type-fest库,作用是将目标类型深度只读化,嵌套对象的所有层级属性都无法被修改。AsyncFunction:来自type-fest库,代表异步函数的类型(当前代码未实际使用该类型)。SimpleArgs:定义了一个数组类型,数组元素只能是string、number、boolean或undefined,明确禁止null作为元素。BasicAsyncFunc<U extends SimpleArgs, R>:泛型函数类型,包含两个泛型参数:U:必须是SimpleArgs的子类型,代表函数的参数列表结构;R:代表函数异步操作返回的原始数据类型;
该类型最终表示一个异步函数,参数符合U的约束,返回值是被深度只读化的R类型的Promise。
Memoized<U extends SimpleArgs, R>:一个增强型接口,它继承了BasicAsyncFunc<U, R>,意味着它首先是一个符合该异步函数类型的可调用函数,同时额外拥有两个缓存管理方法:cache_size():无参数,返回当前缓存的条目数量;clear_cache():无参数,用于清空缓存。
2. 函数f的签名
函数f的类型是BasicAsyncFunc<U, R>,具体签名为:
(...args: U) => Promise<ReadonlyDeep<R>>
说明:
- 调用
f时传入的参数必须严格匹配U的结构(U是SimpleArgs的子类型,比如[string, number]、[boolean]等具体参数数组); - 返回值是一个Promise,解析后得到深度只读的
R类型数据。
3. memoize_async函数的签名
memoize_async是一个泛型高阶函数,签名为:
<R, U extends SimpleArgs>( options: { ttl: number; size: number }, f: BasicAsyncFunc<U, R>, ): Memoized<U, R>
拆解说明:
- 泛型参数
R:对应被包装函数f的返回值原始类型; - 泛型参数
U:对应被包装函数f的参数列表类型,必须符合SimpleArgs约束; - 第一个参数
options:缓存配置对象,ttl为缓存过期时间,size为缓存最大容量; - 第二个参数
f:需要添加缓存逻辑的目标异步函数; - 返回值:一个
Memoized<U, R>类型的函数,既可以像原函数f一样调用,还能使用cache_size()和clear_cache()管理缓存。
4. 对类型理解的验证
- SimpleArgs:理解正确,确实是由
string、number、boolean、undefined组成的数组类型,且排除了null。 - BasicAsyncFunc:泛型参数的基础理解正确,补充细节:
U的具体取值是SimpleArgs的所有子类型,比如[](无参数)、[string](单个字符串参数)、[number, boolean, undefined](三个特定类型参数)等具体参数数组;R是原函数异步操作返回的原始数据类型,最终返回的Promise会把R转换为深度只读版本。
- Memoized接口:它是"增强版"的异步函数——既可以完全当作原函数
BasicAsyncFunc<U, R>调用,同时额外提供两个缓存操作方法:cache_size()查看缓存条目数,clear_cache()清空缓存。
补充:代码中的类型错误修复
你遇到的错误是因为返回的函数中,直接给f传入了固定类型的参数,但U是泛型参数,可能是SimpleArgs的任意子类型(比如[number]),TypeScript无法保证参数匹配。正确写法是接收和U一致的参数再传给f:
const memoize_async = <R, U extends SimpleArgs>( options: { ttl: number; size: number }, f: BasicAsyncFunc<U, R>, ): Memoized<U, R> => { const memoizedFunc = (...args: U) => { // 这里实现缓存逻辑 return f(...args); } memoizedFunc.cache_size = () => { // 实现获取缓存大小的逻辑 return 0; }; memoizedFunc.clear_cache = () => { // 实现清空缓存的逻辑 }; return memoizedFunc as Memoized<U, R>; }
内容的提问来源于stack exchange,提问作者confusedWarrior
相关产品推荐
相关产品推荐

