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

TypeScript兄弟函数能否共享泛型类型?求替代实现方案

TypeScript 自动推断 query 返回类型的替代实现方式

问题背景

现有两个 TypeScript 函数 init 和 query 定义如下:

function init<Schema = any>() {
  // ...
}

function query<Schema = any>(): Schema { 
  return 1 as Schema
} 

定义类型 type Foo = {bar: 1} 并调用 init<Foo>() 后,希望 query() 的返回值能自动推断为 Foo 类型:

const res = query()
// 期望:res 的类型自动推断为 Foo

已知可通过让 init 返回 Schema 类型值并传入 query 实现需求,以下是几种替代实现方式:


方案1:全局类型绑定

利用 TypeScript 全局类型声明,通过 init 在类型层面绑定当前的 Schema,让 query 直接读取这个全局类型:

// 声明全局类型变量,默认值为 any
declare global {
  type CurrentSchema = any
}

function init<Schema = any>() {
  // 类型层面强制 CurrentSchema 与传入的 Schema 绑定
  type _ = CurrentSchema extends Schema ? never : Schema
}

function query(): CurrentSchema { 
  return 1 as CurrentSchema
} 

// 使用示例
type Foo = {bar: 1}
init<Foo>()
const res = query() // res 类型自动推断为 Foo

注意:这种方式是全局类型绑定,多次调用 init 会覆盖之前的类型,仅适合单一上下文场景。

方案2:闭包封装独立查询系统

通过工厂函数创建一组绑定了特定 Schema 类型的 init 和 query,二者共享同一个泛型类型,不同实例间互不干扰:

function createQuerySystem<Schema = any>() {
  function init() {
    // ... 这里编写初始化逻辑
  }

  function query(): Schema {
    return 1 as Schema
  }

  return { init, query }
}

// 使用示例
type Foo = {bar: 1}
const { init, query } = createQuerySystem<Foo>()
init()
const res = query() // res 类型为 Foo

这种方式模块化程度高,适合多场景并行使用,不同的 createQuerySystem 调用会生成独立的函数组。

方案3:类实例维护类型状态

用类的泛型存储 Schema 类型,实例化时传入目标类型,后续调用实例的 query 方法就能自动推断类型:

class QueryClient<Schema = any> {
  init() {
    // ... 初始化逻辑
  }

  query(): Schema {
    return 1 as Schema
  }
}

// 使用示例
type Foo = {bar: 1}
const client = new QueryClient<Foo>()
client.init()
const res = client.query() // res 类型为 Foo

这种方式适合需要维护更多运行时状态或额外方法的场景,类实例天然携带泛型类型信息。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 01:35:06