代码之家  ›  专栏  ›  技术社区  ›  zerkms

为什么在这种情况下总是true条件类型返回不进行类型检查

  •  2
  • zerkms  · 技术社区  · 5 年前

    我发现

    type B = { 
      foo: string;
      bar: number;
    };
    
    function get<F extends B, K extends keyof B>(f: F, k: K): F[K] {
      return f[k];
    }
    

    直觉上与

    function get<F extends B, K extends keyof B>(f: F, k: K): F extends B ? F[K] : undefined {
      return f[k];
    }
    

    但后者不进行类型检查:

    Type 'F[K]' is not assignable to type 'F extends B ? F[K] : undefined'.
      Type 'F["foo"] | F["bar"]' is not assignable to type 'F extends B ? F[K] : undefined'.
        Type 'F["foo"]' is not assignable to type 'F extends B ? F[K] : undefined'.
          Type 'string' is not assignable to type 'F extends B ? F[K] : undefined'.
    

    因此有一个问题:TS编译器对我不明显的类型了解多少?

    游乐场: http://www.typescriptlang.org/play/#code/C4TwDgpgBAQlC8UDeUBQUoDMD22BcUAzsAE4CWAdgOYDc6UARgIYkEUCuAtgxCXQL51M7CgGNgZbBShUIwADwAxKBAAewCBQAmhWABooAaRXrNOqAGsIIbJlgA+ABSYCigxYKGAlK5MbtunAA-FCKANqGALpQBCJaEJiUEFrI9CRy7CTSmGEWkQKoQA

    1 回复  |  直到 5 年前
        1
  •  3
  •   jcalz    5 年前

    这更像是你知道的比它多。。。编译器不会尝试对依赖于未解析泛型类型参数的条件类型进行任何深入分析。也就是说,条件类型 F extends B ? F[K] : undefined 没有在函数实现中进行真正的评估 F 尚未指定具体类型。所以虽然你很容易看到 F延伸到B?F[K]:未定义 必须和 F[K] ,因为 F extends B 与泛型约束相同 F延伸到B ,编译器甚至没有开始这样做(可能是出于性能原因)。