如何在对象内部引用自身typeof类型?TypeScript技术问询
解决方案:在对象内部引用自身typeof类型的简洁严格类型化实现
你可以通过递归泛型类型 + satisfies 自动推断的组合来实现需求,既不需要显式定义复杂的泛型结构,也能保持严格的类型标注,同时将visibilityFn保留在对象内部。
实现代码
// 定义递归泛型Config类型,泛型自动推断children结构 type Config<Children extends Record<string, Config<any>> = {}> = { name: string; value: number; children?: Children; // visibilityFn的参数类型直接绑定到当前节点的children类型 visibilityFn?: (children: Children) => boolean; }; // 使用satisfies让TypeScript自动推断泛型参数,无需手动传递 const config = { name: 'config', value: 1, children: { one: { name: 'one', value: 1, // 显式标注参数类型为typeof config.children,TypeScript会自动推断具体结构 visibilityFn: (children: typeof config.children) => children.two.value > 3 }, two: { name: 'two', value: 2, }, }, } satisfies Config;
核心优势
- 无需显式泛型定义:
satisfies Config会让TypeScript自动推导泛型参数Children的具体结构,复杂嵌套场景下不会产生冗余代码。 - 严格类型标注:
visibilityFn的参数通过typeof config.children显式标注,TypeScript会提供完整的类型提示与检查(比如children.two的存在性和类型都会被验证)。 - 代码简洁性:
visibilityFn直接定义在对象内部,无需拆分到外部,保持嵌套结构的可读性。
原理说明
- 递归泛型
Config<Children>确保每个节点的children类型与自身结构一致,形成完整的类型链。 satisfies关键字会对整个对象进行后验类型检查,允许在对象字面量内部使用typeof config.children引用自身未完全定义的类型,TypeScript会在检查阶段补全类型信息,避免循环引用报错。
内容的提问来源于stack exchange,提问作者Krzysztof Przybylski
相关产品推荐
相关产品推荐

