TypeScript 当条件类型评估依赖于隐式存在的类型参数时,不应延迟,

siotufzp  于 9个月前  发布在  TypeScript
关注(0)|答案(1)|浏览(119)

感谢

  • 我承认,使用此模板的问题可能会在维护者的酌情决定下不经进一步解释而关闭。

评论

我不确定这是否是一个bug,但它似乎与泛型类型的不一致有关。

  1. declare function f(fun: <T>(t: T) => void): void
  2. f((t) => {
  3. type T = typeof t
  4. type IsAny = T extends any ? true: false // deferred
  5. type IsAnyArray = T[] extends any[] ? true: false // return true
  6. type IsString = T extends string ? true : false // deferred
  7. type IsStringArray = T[] extends string[] ? true : false // return false
  8. })
  9. function g<T>(t: T) {
  10. type IsAny = T extends any ? true: false // deferred
  11. type IsAnyArray = T[] extends any[] ? true: false // return true
  12. type IsString = T extends string ? true : false // deferred
  13. type IsStringArray = T[] extends string[] ? true : false // deferred
  14. }

我原以为 IsStringArray 会在传递给 f 的函数中被推迟,就像 g 的主体一样,但却被评估为 false
TS版本:5.5.3
重现代码:playground
(首先我在stackoverflow上提出了一个问题,但现在我认为这个问题更适合在这里提出)

uxh89sit

uxh89sit1#

这里的问题是我们没有考虑到通过上下文类型推断引入的类型参数,就像示例中的箭头函数那样。具体的逻辑在 getOuterTypeParameters 函数中。我会提交一个修复这个问题的 PR。
请注意,这个问题还体现在上下文类型函数表达式和对象字面量方法中,以及除了数组类型之外的其他类型引用中。例如:

  1. const fun: <T>(x: T) => void = function test(t) {
  2. type IsObject = { x: typeof t } extends { x: string } ? true : false; // Should be deferred, but isn't
  3. };
  4. const obj: { f: <T>(x: T) => void } = {
  5. f(t) {
  6. type IsObject = { x: typeof t } extends { x: string } ? true : false; // Should be deferred, but isn't
  7. }
  8. };

相关问题