如何实现支持校验类私有字段的TypeScript泛型工具类型ValidKeys
实现方案
你可以直接使用以下泛型定义,完全匹配你的需求:
type ValidKeys<A, K extends PropertyKey> = A[K] extends any ? K : never
效果说明
- 当传入的
K的所有值都是类型A的有效键(包含公开、私有、受保护属性)时,ValidKeys<A, K>的类型与K完全等价,不会产生编译错误 - 只要
K中存在任意一个不属于A的键,就会直接触发编译报错,避免属性重命名后运行时才发现问题的情况
使用示例
你提到的Mobx场景可以直接替换为以下写法:
constructor() { makeObservable<Store, ValidKeys<Store, "x" | "y">>(this, { x: observable, y: false }) }
为什么不用keyof实现?
TS的keyof运算符默认只能获取类的公开属性,无法识别私有、受保护属性,而你需要校验Mobx的私有字段场景,这套基于索引访问的实现刚好可以覆盖私有属性的校验需求,完美适配你的使用场景。
内容的提问来源于stack exchange,提问作者Qwertiy
相关产品推荐
相关产品推荐

