以下代码使用Typescript 3.5.3成功编译,但似乎不应允许使用,我想知道为什么它能够成功编译。我创建了一个类型A
,该类型具有一个字段a
和一个在t
上参数化的泛型函数X
,该函数接受一个参数,该参数是泛型{{ 1}}和类型X
。函数A
内部的'a' in a
防护似乎将t
的类型缩小为a
,但是,您可以想象另一种类型的A
带有一个将通过此检查的另一个字段B
。
a
此外,我可以这样调用此函数:
type A = {"a": string}
type B = {"a": number}
function t<X>(a: A | X, f: (x:X) => string): string {
if ('a' in a) {
return a.a;
} else {
return f (a);
}
}
我知道Typescript的类型系统是故意不健全的,但是我无法弄清楚为什么这个示例是不健全的。任何见解将不胜感激。