Bug报告
🔎 搜索词
通过返回类型缩小函数类型
🕗 版本与回归信息
4.8.0-dev.20220719
⏯ Playground链接
带有相关代码的Playground链接
💻 代码
declare let f1: (() => number) | (() => string)
declare let f2: () => (number | string)
if (typeof f1() === 'string') {
const foo: string = f1() //should be narrowed to string but isn't
}
if (typeof f2() === 'string') {
const foo: string = f2() //correctly not narrowed
}
f1 = f2 //correct error
🙁 实际行为
f1
没有被缩小为 () => string
尽管TypeScript似乎能识别到两个类型 () => (number | string)
和 (() => number) | (() => string)
是不同的,但它不允许将 f2
分配给 f1
🙂 预期行为
f1
应该被缩小为 () => string
,因为联合类型 (() => number) | (() => string)
意味着该函数要么只返回一个 string
,要么只返回一个 number
。因此,如果第一个函数调用返回了一个 string
,那么可以安全地说后续调用也会返回一个 string
1条答案
按热度按时间yyhrrdl81#
这很有道理。我很好奇这个观点是从哪里来的。