TypeScript 仅针对依赖参数的控制流分析仅在检查字面值时有效,

but5z9lq  于 2个月前  发布在  TypeScript
关注(0)|答案(2)|浏览(26)

🔎 搜索词

narrow, parameters, typeof

🕗 版本与回归信息

#47190 版本引入该功能以来,从未对 typeof / asserts 进行过测试;在此提到:

47190 (评论)

⏯ Playground链接

https://www.typescriptlang.org/play?#code/MYewdgzgLgBAZmAMgSygUwE4EMA2AuGACgDpSsMBzCAgbQAMs6AaGMAVwFsAjTAXRgA+Mel2YxoGZGAq8AlDAC8APhgA3EMgAmiolhZd5ymAG8AUDBjI4uxQoUwARFgfyzFi6EggcaYjhAUhAYA3ObuAPTh7tHuAHoA-GEAvqYppp7Q8GAAghAQmFAEJGSU1MIMYuzcfILloiwSUjKGKupaOoR6MAaKKm6W1oTIENmdsq5hHuAQ3r7+gSGTMJExMQnJqenTsAgAKgCeAA5oIHBFpMTkVLRVPBgstzVCNI3SDVCS0nK9ahra9p19C0TGErEQoEcTtYsLZ7A5HhgXCDohlZn4AkFZKFoitVnFEhYUmk4GwwMAoMhwJYRoRVLgCKSANZgEAAdzAsgIdJw1JgFWRMAwaCgbAwYBgHzYaFCKSAA

💻 代码

const fnLiteral: (...args: [`a`, number] | [`b`, string]) => void = (a, b) => {
  if (a === "a") {
    console.log(b);
    //          ^? number
  }
}

const fnAssert: (...args: [`a`, number] | [`b`, string]) => void = (a, b) => {
  if (isA(a)) {
    console.log(b);
    //          ^? number | string
  }
}
const fnTypeof: (...args: [number, number] | [string, string]) => void = (a, b) => {
  if (typeof a === "number") {
    console.log(b);
    //          ^? number | string
  }
}

function isA(val: unknown): val is `a` {
  return true;
}

🙁 实际行为

fnAssertfnTypeof 都无法让 TS 将 b 识别为其缩小类型( number )。只有在检查 a 是否与字面量相等时,缩小操作才能生效。

🙂 预期行为

b 参数应该被缩小为 number

关于问题的附加信息

  • 无响应*
lkaoscv7

lkaoscv71#

当前仅支持区分的联合类型,并且只有在检查判别式时才能工作。这不仅仅适用于依赖参数 - 它与对象类型以完全相同的方式工作:TS playground

相关问题