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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 20:13:25