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

TypeScript中给函数传泛型避免硬编码联合类型访问公共属性的方法

解决方案

给泛型添加结构约束即可解决该问题,无需硬编码联合类型。

完整可运行代码

// 定义通用结构约束:所有包含string类型foo属性的类型都符合该约束
interface HasFoo {
  foo: string;
}

interface A {
  foo: string;
}

interface B {
  foo: string;
}

// 给泛型T添加extends约束,要求传入的T必须符合HasFoo的结构
function a<T extends HasFoo>() {
  function b(arg: T) {
    return arg.foo; // TypeScript可确认T一定存在foo属性,不会报错
  }

  return b;
}

a<A>();
a<B>();

// 后续新增符合结构的类型时,无需修改原有函数逻辑,直接传入即可
interface C {
  foo: string;
  otherProperty: number;
}
a<C>();

原理说明

  • T extends HasFoo是TypeScript的泛型约束语法,作用是限制传入的泛型类型必须满足HasFoo的结构要求,即必须包含类型为string的foo属性。
  • 如果约束逻辑简单不需要复用,也可以直接使用内联结构约束,写法如下:
function a<T extends { foo: string }>() {
  function b(arg: T) {
    return arg.foo;
  }
  return b;
}
  • 该方案扩展性极强,后续新增任意符合结构的类型都可以直接使用,不需要修改原有函数的类型定义,可维护性远高于硬编码联合类型的方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 22:39:00