TypeScript `switch (typeof something)` 并不被视为详尽的,

camsedfj  于 10个月前  发布在  TypeScript
关注(0)|答案(5)|浏览(95)

🔎 搜索词

  • typeof
  • switch
  • narrow
  • type guard

🕗 版本与回归信息

  • 这是我尝试的每个版本的行为,我还查阅了关于类型保护的常见问题解答。

⏯ Playground链接

https://www.typescriptlang.org/play?ts=5.3.2#code/GYVwdgxgLglg9mABBAFgUwgawIIBtcA8AKgHwAUAznALZpQoxgDmAXIkQJRtGIDeAUIkQUA7jCipEZKAE8ADmjjBhNOg2Yc+gocgCGFNIgBEYENQBGaAE5GW2oRH2Gj5mE0ZRb9vQePm4cLhoumBeOj7OFDIWgWE6jr5G4AAmaMCMaMlxDk7GoJCwCNkRxnDmAFYYnnbhCZFQVoxMxUJWdCBWSFS09E0A3NoAvvyDQA

💻 代码

  1. function checkAll<T>(something: T): T {
  2. switch (typeof something) {
  3. case "number":
  4. case "bigint":
  5. case "boolean":
  6. case "symbol":
  7. case "undefined":
  8. case "function":
  9. case "object":
  10. case "string":
  11. return something;
  12. }
  13. }

🙁 实际行为

这会发出TS错误:“函数缺少结束返回语句,且返回类型不包括'undefined'。(2366)”

🙂 预期行为

没有错误,因为已经处理了typeof的所有可能结果。

关于问题的附加信息

似乎只有在函数参数是泛型时才会成为问题。如果将返回类型和参数类型切换到 any ,它就可以正常工作,但我不确定这是公平的比较。

idv4meu8

idv4meu81#

函数缺少结束返回语句,并且返回类型不包括'undefined'。
any 允许隐式返回,所以在这种情况下它不是错误。泛型是一个误导;switch并不被认为是详尽无遗的:

  1. function checkAll(something: unknown): unknown {
  2. switch (typeof something) {
  3. case "number":
  4. case "bigint":
  5. case "boolean":
  6. case "symbol":
  7. case "undefined":
  8. case "function":
  9. case "object":
  10. return something;
  11. }
  12. }

会产生错误

  1. Not all code paths return a value. (7030)

Playground链接

展开查看全部
vom3gejh

vom3gejh2#

啊!抓到了,谢谢!:)

llycmphe

llycmphe3#

这里的通用情况并不是一个完整的误导。这个 switch/case'string' 不匹配 - 因此实际上并不全面。当我们包括这一点时,那么基于 unknown 的场景来自 @fatcerberus 被认为是全面的,错误没有被报告,但原始复现仍然存在问题:TS playground

u1ehiz5o

u1ehiz5o4#

这个 switch/case'string' 不匹配。
我怎么会错过那个🤦‍♂️
我检查了交换机3次,以确保它确实是穷举的,但我仍然错过了缺少的 string 情况。

hmtdttj4

hmtdttj45#

哎呀,我自己漏掉了字符串,但我更新了我的示例+Playground,并且我遇到了同样的问题。

相关问题