我在理解与类型的循环引用有关的某些打字行为时遇到了困难.

type NonEmptyObject<T> = keyof T extends never ? never : T

type Base = { [key: PropertyKey]: Nested }; // I'm using this instead of Record to avoid a circular reference.
type NonEmptyBase = NonEmptyObject<Base>;
type Nested = string | NonEmptyBase;

Type alias 'NonEmptyBase' circularly references itself.ts(2456)

Type alias 'Nested' circularly references itself.ts(2456)

如果我切换到泛型,一切正常.但这看起来不对,感觉更像是一个循环.

type Base<T extends Base<T>> = { [key: PropertyKey]: Nested<T> };
type NonEmptyBase<T extends Base<T>> = NonEmptyObject<T>;
type Nested<T extends Base<T>> = string | NonEmptyBase<T>;

为什么会这样?如果没有泛型,我如何才能达到预期的结果?

推荐答案

您遇到的错误是由于类型定义中的循环引用造成的.在直接定义类型别名时,TypeScrip无法解析这些循环引用.

在您的初始代码中,NonEmptyBase类型指的是NonEmptyObject,Base指的是嵌套的,而嵌套的也指的是NonEmptyBase.此循环引用会产生错误.

若要在不使用泛型的情况下实现所需结果,可以使用接口而不是类型别名.

根据此链接-[1]:https://github.com/microsoft/TypeScript/issues/28748

Typescript相关问答推荐

根据另一个成员推断类成员的类型

TypeScript实用程序类型—至少需要一个属性的接口,某些指定属性除外

我们过go 不能从TypeScript中的联合中同时访问所有属性?

material 表不渲染任何数据

如何推断计算逻辑的类型

为什么我的Set-Cookie在我执行下一次请求后被擦除

返回具有递归属性的泛型类型的泛型函数

在类型脚本中的泛型类上扩展的可选参数

了解类型规则中的关键字

如何解决类型T不能用于索引类型{ A:typeof A; B:typeof B;. }'

角效用函数的类型推断

如何实现异构数组内函数的类型缩小

MatTool提示在角垫工作台中不起作用

有没有办法取消分发元组的联合?

如何避免从引用<;字符串&>到引用<;字符串|未定义&>;的不安全赋值?

在正常函数内部调用异步函数

字幕子集一个元组的多个元素

TS不能自己推断函数返回类型

带动态键的 TS 功能

使用嵌套属性和动态执行时,Typescript 给出交集而不是并集