typescript - 打字稿区分联合与通用的,不健全的类型缩小
问题描述
以下代码使用 Typescript 3.5.3 成功编译,但似乎不应该被允许,我想知道为什么它会成功编译。我创建了一个类型A
,它具有一个字段和一个参数化a
的泛型函数,该函数接受一个参数,该参数是泛型和类型的区别联合。函数内部的守卫似乎正在缩小 to be 的类型,但是,您可以想象另一种具有不同字段的类型将通过此检查。t
X
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);
}
}
此外,我可以这样调用这个函数:
let a : A = {"a": "hi"};
let f = (x:B) => {
return x.a + " a string";
}
let tmpa = t(a, f); // has static type string and correct dynamic type string
let b: B = {"a": 5};
let tmpb = t(b, f); // has static type string but dynamic type number
我知道 Typescript 的类型系统故意不健全,但我不明白为什么这个例子被允许不健全。任何见解将不胜感激。
解决方案
推荐阅读
- python - 用于计算 groupby 百分比的 Pandas Window 函数
- python - code=H10 desc="App 崩溃" Heroku 应用程序错误
- amazon-web-services - 如何在侦听 cognito PreSignUp 事件的不同微服务中执行多个 lambda?
- angular - 角度路由器总是将我重定向到/#/
- r - 数据表的连续行之间的R快速余弦距离
- flutter - Dart 未处理的异常:键入“列表”
' 不是类型 'Family' 的子类型,- Flutter - spring - SpringBoot 遇到 APPLICATION FAILED TO START 错误
- javascript - 我希望搜索框从所有页面中消失,除了带有 React.js 的产品页面
- kotlin - 如何让 Kotlin 在非主构造函数中使用字段而不是 setter
- sql - sqldf 仅返回一行,与 SQL 中使用的查询相同