如何通过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;
这个类型的逻辑是:
- 尝试给目标属性
K添加可写的同类型定义 - 如果原类型与这个新类型不兼容(即属性是Getter),则返回
true - 如果兼容(即属性是普通属性),则返回
false
测试结果:
CheckGetter<Foo, 'x'>→false(普通只读属性)CheckGetter<Bar, 'x'>→true(Getter实现的属性)
内容的提问来源于stack exchange,提问作者user29889977
相关产品推荐
相关产品推荐

