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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 05:15:08