【发布时间】:2021-04-17 23:43:32
【问题描述】:
根据TypeScript v3.7,递归类型别名可以使用。
export type IntrospectionType = {
readonly kind: 'OBJECT';
};
export type IntrospectionListTypeRef<
T extends IntrospectionTypeRef = IntrospectionTypeRef
> = {
readonly kind: 'LIST';
readonly ofType: T;
};
export type IntrospectionNonNullTypeRef<
T extends IntrospectionTypeRef = IntrospectionTypeRef
> = {
readonly kind: 'NON_NULL';
readonly ofType: T;
};
export type IntrospectionTypeRef =
| IntrospectionNamedTypeRef
| IntrospectionListTypeRef
| IntrospectionNonNullTypeRef<
IntrospectionNamedTypeRef | IntrospectionListTypeRef
>;
export type IntrospectionNamedTypeRef<
T extends IntrospectionType = IntrospectionType
> = {
readonly kind: T['kind'];
};
在这种情况下,IntrospectionTypeRef 会引发循环引用错误,并将鼠标悬停在IntrospectionListTypeRef 或IntrospectionNonNullTypeRef 上会显示T extends any = any,它确实不应该这样做。这里有什么问题吗?
这是TypeScript playground on v4.1.3的链接
请注意,此代码来自graphql,我们目前正在处理migrating Flow to TypeScript。
这是Flow equivalent。
我发现的解决方法是:
- 将
any传递给IntrospectionListTypeRef。但这确实不是一个理想的解决方案。见GitHub diff - 删除
IntrospectionListTypeRef和IntrospectionNonNullTypeRef的泛型类型然后它会起作用,但问题是我们正在尝试移植更多类型,这意味着我们正在复制类型。
还提交了一个问题,请参阅TypeScript #42308
【问题讨论】:
标签: typescript graphql-js