TypeScript能否自动推断函数中泛型变量的类型?
问题场景1:简化泛型函数声明
我希望实现以下功能:
type <T extends number | string>WithGeneric = T function usesWithGeneric(arg: WithGeneric) { return arg } // 此处不想指定T const number = usesWithGeneric(2) // 生效且类型为number const text = usesWithGeneric("haha") // 生效且识别为string类型
约束条件:
- 这是问题的简化版本,实际场景不止
string | number - 不想编写
function usesWithGeneric<T>(arg: WithGeneric<T>) {},因为泛型类型更复杂,重复声明泛型变量很麻烦 - 不想编写
function usesWithGeneric(arg: WithGeneric<string | number>) {},这会破坏类型安全性
问题场景2:urql客户端包装器(3月23日更新)
我正在使用urql,尝试为客户端实现一个包装器:
const queryFactory = (document, field?: any) => (params: TParams) => urqlClient .query(document, params) .toPromise() .then((res) => (field ? res.data?.[field] : res.data));
我似乎不得不编写以下繁琐的代码(但实际无法正常工作):
import { TypedDocumentNode } from "urql"; export function query< TParams extends { [prop: string]: any }, TResult, TDocument extends TypedDocumentNode<TResult, TParams> >(document: TDocument): (params: TParams) => Promise<TResult | undefined>; export function query< TParams extends { [prop: string]: any }, TResult, TField extends keyof TResult, TDocument extends TypedDocumentNode<TResult, TParams> >(document: TDocument, field: TField): (params: TParams) => Promise<TResult[TField] | undefined>; export function query< TParams extends { [prop: string]: any }, TResult, TField extends keyof TResult, TDocument extends TypedDocumentNode<TResult, TParams> >(document: TDocument, field?: TField) { return (params: TParams) => urqlClient .query(document, params) .toPromise() .then((res) => (field ? res.data?.[field] : res.data)); }
我觉得这太繁琐了,因为必须:
- 查看urql的query类型定义
- 尝试复制这些类型以正确包装我的方法
- 总是在这一步出错
我的思路是否有误?我希望尽可能少编写类型来实现这样的包装器方法。
内容的提问来源于stack exchange,提问作者Ginko
相关产品推荐
相关产品推荐

