如何在TypeScript中为对象编写条件递归类型
解决TypeScript中Def类型的递归嵌套问题
要实现abc属性的递归嵌套,你需要把Def中每个键对应的结构定义成递归类型,让abc的值可以复用自身的结构。以下是修正后的类型定义:
修正后的完整类型代码
export type T1 = "p" | "q" | "r" | "a" | "b"; export type T2 = { h: string; hc: {}; }; // 定义递归的项类型,让abc可以嵌套自身 export type DefItem = { [K in T1 | "abc"]?: K extends T1 ? T2 : DefItem; // 这里把abc的类型指向DefItem,实现递归 }; export interface Def { [k: string]: DefItem; } export interface A { name: string; def: Def; }
验证预期用法
现在你的示例代码可以正常通过类型检查,abc属性可以无限递归嵌套:
const x: A = { name: "test", def: { xxx: { p: { h: "s", hc: {}, }, abc: { p: { h: "s", hc: {}, }, abc: { p: { h: "s", hc: {}, }, // 还可以继续嵌套abc abc: { q: { h: "another", hc: {} } } }, }, }, }, };
说明
原来的定义中,abc对应的类型是{[k in T1]?: T2},只能包含T1的键,无法嵌套abc。通过抽离出DefItem递归类型,让abc的类型指向DefItem本身,就实现了递归嵌套的能力。
内容的提问来源于stack exchange,提问作者It worked yesterday.
相关产品推荐
相关产品推荐

