TypeScript 当exactOptionalPropertyTypes标志未设置时,意外缺少类型错误,

pnwntuvh  于 4个月前  发布在  TypeScript
关注(0)|答案(3)|浏览(40)

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-betaNightly(目前为 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]
}
rbpvctlc

rbpvctlc1#

@andrewbranch 嗯,这两个标题在技术上都是有效的。前者在v4.4.3版本上有效,而后者显然在较晚的版本上有效。如果当前的行为在v4.4.3上是错误的,那么据我所知,这是v4.4.3上的一个错误,应该在v4.4.N(其中N>3)版本上修复。

q5iwbnjs

q5iwbnjs2#

我们不会将所有的bug修复都放入补丁发布中,只有非常关键的。4.4.3版本的修复将在4.5版本中发布。您目前在夜间看到的行为的可能不会立即得到解决。如果您能提出一个尽可能小的可复现问题,且不依赖任何外部库,将会很有帮助。

insrf1ej

insrf1ej3#

@andrewbranch 从代码示例中移除了外部库。

相关问题