Bug报告
🔎 搜索词
is:issue exactoptionalpropertytypes
🕗 版本与回归信息
此问题在4.4.3及以后的版本中发生了变化。
⏯ Playground链接
带有相关代码的Playground链接
💻 代码
type BaseEntity = Object;
type DrillDownToEntity<T> = T extends BaseEntity ?
T : T extends ReadonlyArray<infer U> ? DrillDownToEntity<U> : never;
type Relations<T extends BaseEntity> = {
[K in keyof T as DrillDownToEntity<T[K]> extends never ? never : K]?: Relations<DrillDownToEntity<T[K]>>
}
/**
* If T is not array-like, replace it with U. If it is, replace it with same level of arrays of U.
*/
type ChangeType<T, U> = T extends Array<infer A> ? Array<ChangeType<A, U>> : U;
type PickKeysInRelation<T extends BaseEntity, R extends Relations<T>> = {
[K in keyof T as DrillDownToEntity<T[K]> extends never ? K : (K extends keyof R ? K : never)]: K extends keyof R ? ChangeType<T[K], PickKeysInRelation<DrillDownToEntity<T[K]>, R[K]>> : T[K]
}
🙁 实际行为
即使设置了 exactOptionalPropertyTypes
标志,也会出现以下错误。
Type 'R[K]' does not satisfy the constraint 'Relations<DrillDownToEntity<T[K]>>'.
Type 'R[string] | R[number] | R[symbol]' is not assignable to type 'Relations<DrillDownToEntity<T[K]>>'.
Type 'R[string]' is not assignable to type 'Relations<DrillDownToEntity<T[K]>>'.
Type 'Relations<DrillDownToEntity<T[string]>> | undefined' is not assignable to type 'Relations<DrillDownToEntity<T[K]>>'.
Type 'undefined' is not assignable to type 'Relations<DrillDownToEntity<T[K]>>'.(2344)
🙂 预期行为
不应该出现这种错误,因为当设置了 exactOptionalPropertyTypes
标志时,根据类型定义,R[K]
不能是 undefined
。
i️ 进一步的信息
当我选择 4.5.0-beta
或 Nightly
(目前为 v4.5.0-dev.20211007
)时,错误消失了。然而,即使 exactOptionalPropertyTypes
标志未设置,这些版本中的错误也消失了。如果我的理解正确,当该标志未设置时,错误实际上应该存在,因此不确定为什么在这些版本中即使没有设置该标志,错误也会消失。
此外,以下尝试解决此错误的方法也无法工作:
type PickKeysInRelation<T extends BaseEntity, R extends Relations<T>> = {
[K in keyof T as DrillDownToEntity<T[K]> extends never ? K : (K extends keyof R ? K : never)]:
K extends keyof R ?
(R[K] extends Relations<DrillDownToEntity<T[K]>> ? ChangeType<T[K], PickKeysInRelation<DrillDownToEntity<T[K]>, R[K]>> : never) :
T[K]
}
3条答案
按热度按时间rbpvctlc1#
@andrewbranch 嗯,这两个标题在技术上都是有效的。前者在v4.4.3版本上有效,而后者显然在较晚的版本上有效。如果当前的行为在v4.4.3上是错误的,那么据我所知,这是v4.4.3上的一个错误,应该在v4.4.N(其中N>3)版本上修复。
q5iwbnjs2#
我们不会将所有的bug修复都放入补丁发布中,只有非常关键的。4.4.3版本的修复将在4.5版本中发布。您目前在夜间看到的行为的可能不会立即得到解决。如果您能提出一个尽可能小的可复现问题,且不依赖任何外部库,将会很有帮助。
insrf1ej3#
@andrewbranch 从代码示例中移除了外部库。