TypeScript 函数类型联合应该通过它们的返回类型缩小,

zysjyyx4  于 3个月前  发布在  TypeScript
关注(0)|答案(1)|浏览(109)

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

yyhrrdl8

yyhrrdl81#

这很有道理。我很好奇这个观点是从哪里来的。

相关问题