如何设计泛型fetch函数,根据传入键动态返回Pick类型?
问题解决:动态字段API请求的泛型函数优化
问题根源
你当前的泛型函数给Keys设置了默认值keyof ResponseT,导致仅显式指定ResponseT时,TypeScript会直接使用这个默认值,不会从传入的keys数组参数中推断实际的键类型,最终返回完整的ResponseT类型而非预期的字段子集。
优化后的函数声明
去掉Keys的默认值,保留Keys extends keyof ResponseT的约束以确保传入的键都是ResponseT中存在的,让TypeScript自动从keys参数推断键类型:
interface ResponseT { id: number; title: string; description: string; } declare function fetch<ResponseT extends object, Keys extends keyof ResponseT>( keys: Keys[] ): Pick<ResponseT, Keys>;
效果验证
调用时仅指定ResponseT,TypeScript会自动推断出Keys为传入的键集合,返回正确的子集类型:
const result = fetch<ResponseT>(["id", "title"]); // ^? { id: number; title: string }
补充说明
该写法在现代TypeScript版本中均可正常工作,既保证了类型安全(仅允许传入ResponseT中存在的键),又实现了无需手动指定Keys的自动推断,完全符合你的期望用法。
内容的提问来源于stack exchange,提问作者Shmookoff
相关产品推荐
相关产品推荐

