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