泛型中的自引用实现:如何让类型C返回{ a: C }?
TypeScript泛型自引用实现方案
要让type C = B<C>生成{ a: C }的类型,可根据TypeScript版本选择以下方案:
1. 现代TypeScript版本(3.7+):直接使用递归类型别名
TypeScript 3.7及以上版本已支持递归类型别名,你的代码无需修改即可正常工作:
type B<T> = { a: T } type C = B<C> // 此时 C 完全等价于 { a: C }
验证示例:
// 类型校验通过,说明 test.a 的类型确实是 C const test: C = { a: null! } test.a = test
2. 低版本TypeScript:用接口实现自引用
如果环境仍使用3.7以下版本,可改用接口实现——接口天然支持自引用:
interface B<T> { a: T } interface C extends B<C> {}
该写法同样能让C的类型为{ a: C }。
实用场景
当你构建的对象包含返回自身(this)的方法时,这种自引用泛型能精准约束类型。比如链式调用API:
type Chainable<T> = { set<K extends string>(key: K, value: any): Chainable<T & { [P in K]: typeof value }> get(): T } // 自引用构建完整链式类型 type MyChain = Chainable<{}> const chain: MyChain = { set(key, value) { return { ...this, [key]: value } as MyChain }, get() { return this as unknown as {} } }
内容的提问来源于stack exchange,提问作者TrevTheDev
相关产品推荐
相关产品推荐

