首页 > 解决方案 > TypeScript 3.7 递归类型引用 - 记录与索引签名

问题描述

我尝试使用 TypeScript 3.7 中引入的递归类型引用,其方式与官方示例中介绍的方式非常相似。

我做了一些与文档中介绍的内容略有不同的东西,但认为它应该以相同的方式工作。事实证明它没有。

如文档中所述,在递归中使用索引签名:

type Json = string | number | boolean | null | Json[] | { [key: string]: Json; };

但是使用Record类型不起作用 - 导致循环引用错误

type Json = string | number | boolean | null | Json[] | Record<string, Json>;

对我来说更奇怪的是,手动扩展Record类型确实可以:

type Json = string | number | boolean | null | Json[] | { [key in string]: Json; };

TS游乐场链接

问题:{ [key: string]: X; }Record<string, X>递归类型有什么区别?不Record<K, V>等于{ [P in K]: V; }ieRecord<string, X> === { [key in string]: X; }吗?为什么递归类型会产生不同的结果?我错过了什么?还是这是 TS 中的错误?

标签: typescript

解决方案


推荐阅读