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

如何从关联类型参数中推导类型?

解决TypeScript泛型推导导致返回类型为unknown的问题

你的问题出在useStore的泛型参数设计上,三个泛型参数S、T、U的关联关系不够明确,TypeScript无法自动从传入的store实例中推导出U的具体类型,所以默认将x的类型推断为unknown。

优化方案

简化useStore的泛型参数,直接基于Store的泛型定义约束,不需要额外的S参数:

type Store<T extends U, U> = {
  getItem(): U
  setItem(item: T): void
}

const store: Store<string, string> = {
  getItem: function (): string {
    return "item"
  },
  setItem: function (item: string): void {
    return
  }
}

// 简化泛型参数,只保留T和U,直接约束参数为Store<T, U>
function useStore<T extends U, U>(store: Store<T, U>): U {
  return store.getItem();
}

const x = useStore(store) // x的类型现在是string,无需手动指定泛型参数

原理说明

去掉多余的S泛型参数后,TypeScript可以直接从传入的store(类型为Store<string, string>)中提取出T和U的具体类型,明确getItem()的返回值是U也就是string,因此能正确推导x的类型。

如果需要保留S参数(比如允许Store的子类型传入),可以调整泛型参数的约束方式,让TypeScript能从S中推断出U:

function useStore<S extends Store<any, U>, U>(store: S): U {
  return store.getItem();
}

const x = useStore(store) // x的类型同样为string

这里通过S extends Store<any, U>告诉TypeScript从S中提取出U的类型,避免手动指定所有泛型参数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 16:05:20