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

时间:2019-07-17 00:28:08

标签: typescript

我发现

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];
}

,但后者不键入check:

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 个答案:

答案 0 :(得分:3)

更像是您了解的不止于此...编译器不会尝试对依赖于未解析的泛型类型参数的条件类型进行任何深入分析。也就是说,条件类型F extends B ? F[K] : undefined并没有在函数实现中真正求值,其中F尚未用具体类型指定。因此,虽然很容易看出F extends B ? F[K] : undefined必须与F[K]相同,但是由于条件F extends B与通用约束F extends B相同,但是编译器却没有这样做。甚至没有开始这样做(可能出于性能原因)。

相关问题