TypeScript 带泛型属性的自引用类型实现可行性问询
这两类自引用类型都可以在TypeScript中正确实现,仅需要修正你示例代码中的语法疏漏,同时处理固定字段与索引签名的类型兼容问题即可。
1. 无泛型版本实现
你最初的写法存在两个问题:一是类型定义漏了等于号,二是直接在同个类型块里写固定prop字段和返回值为SelfReferenced的索引签名会触发类型冲突(固定字段类型必须是索引签名返回值的子类型)。
用交叉类型可以完美解决这个问题,TS在属性推导时会优先匹配明确声明的固定字段类型,完全符合你的预期,正确写法如下:
export type SelfReferenced = { prop: string; } & Record<string, SelfReferenced>
验证用法符合预期:
declare const $deep: SelfReferenced; let lastReference = $deep.a.very.long.nested.deep; // 类型:SelfReferenced lastReference.prop // 类型:string
2. 带泛型参数版本实现
和无泛型版本逻辑一致,只需要加入泛型参数即可,正确写法如下:
export type SelfReferenced<T> = { prop: () => T; } & Record<string, SelfReferenced<T>>
验证用法符合预期:
declare const $deep: SelfReferenced<number>; let lastReference = $deep.a.very.long.nested.deep; // 类型:SelfReferenced<number> lastReference.prop() // 类型:number
如果你需要实际运行的createProxy实现,只需要用JS的Proxy代理对象的getter,当访问的键不是prop时返回代理对象本身即可,类型层面完全可以匹配上述定义。
内容的提问来源于stack exchange,提问作者Pedro Mora
相关产品推荐
相关产品推荐

