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

TypeScript如何在接口属性层级单独使用泛型

问题描述

在TypeScript开发中,引用其他已定义的泛型类型时,如何在interface的单个属性层级传递、使用泛型,且无需将泛型参数声明在整个接口上?
问题复现代码如下:

type Fn<T> = (arg: T)=>void

interface A {
    // 方法级泛型可正常声明
    fn1<R>(arg: R): void,
    // 预期实现和fn1一致的属性级泛型效果,复用外部泛型类型Fn<S>,且不将泛型声明在整个接口上
    // 下方写法为非法语法
    fn2<S>: Fn<S>
}

interface B<S>{
    // 不推荐的写法:泛型声明在整个接口上,仅单个属性使用该泛型
    fn: Fn<S>
}
原因说明

你写的fn2<S>: Fn<S>属于非法语法:

  • 泛型参数写在成员名后(即成员名<泛型>(参数):返回值)的写法,仅支持直接内联写完整的方法签名,不支持在该写法下直接引用外部独立的泛型类型别名。
  • 如果泛型仅属于接口下的单个函数成员、不需要在实例化接口时就确定类型,泛型参数应该声明在对应函数的类型上,而非接口上或者属性名后。
实现方案

如果要复用已定义的Fn<T>类型,同时实现单属性级别的泛型效果,可以借助TS内置的Parameters和ReturnType工具类型提取原泛型类型的参数、返回值结构,写法如下:

type Fn<T> = (arg: T) => void

interface A {
  fn1<R>(arg: R): void
  // 泛型声明在函数类型上,复用Fn的类型定义
  fn2: <S>(...args: Parameters<Fn<S>>) => ReturnType<Fn<S>>
}

该写法的效果和fn1完全一致:泛型S仅属于fn2属性对应的函数,不需要在接口层面声明泛型,调用fn2时TS会自动根据传入的参数推导S的类型:

const instance: A = {
  fn1: (arg) => {},
  fn2: (arg) => {}
}

instance.fn1(123) // 泛型R自动推导为number
instance.fn2("test") // 泛型S自动推导为string

如果你的Fn类型结构比较简单,也可以直接内联写函数类型的泛型,不需要借助工具类型:

interface A {
  fn1<R>(arg: R): void
  fn2: <S>(arg: S) => void
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 02:24:34