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
相关产品推荐
相关产品推荐

