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

如何通过TypeScript条件类型判断对象属性是getter还是常规字段?

用TypeScript条件类型区分普通属性与Getter实现的属性

TypeScript原生就能判断一个属性是普通对象属性还是通过Getter实现的——毕竟它禁止子类用静态属性重写父类的Getter。那有没有办法通过条件类型来实现这种判断逻辑?

示例代码如下:

class Foo {
  readonly x = 1
}

class Bar {
  private readonly _x = 1
  get x() { return this._x }
}

type FooHasStatic = CheckGetter<Foo, 'x'>
type BarHasStatic = CheckGetter<Bar, 'x'>

type CheckGetter<T, K extends keyof T> = T[K] extends IntrinsicGetter ? false : true

需要明确的是:TypeScript的类型系统在编译时不会直接暴露“属性是否为Getter”的元信息,IntrinsicGetter也并非TypeScript内置类型,所以上述示例中的写法无法达成预期效果。

不过可以借助赋值兼容性检查实现间接判断——因为Getter属性本质是只读且不可赋值的,而普通属性(即使是readonly修饰的)在类型层面允许被构造为可写版本:

type CheckGetter<T, K extends keyof T> = 
  (T & { [P in K]: T[K] }) extends never 
  ? true 
  : false;

这个类型的逻辑是:

  1. 尝试给目标属性K添加可写的同类型定义
  2. 如果原类型与这个新类型不兼容(即属性是Getter),则返回true
  3. 如果兼容(即属性是普通属性),则返回false

测试结果:

  • CheckGetter<Foo, 'x'> → false(普通只读属性)
  • CheckGetter<Bar, 'x'> → true(Getter实现的属性)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 22:32:43