如何从关联类型参数中推导类型?
解决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
相关产品推荐
相关产品推荐

