🔎 搜索词
- typeof
- switch
- narrow
- type guard
🕗 版本与回归信息
- 这是我尝试的每个版本的行为,我还查阅了关于类型保护的常见问题解答。
⏯ Playground链接
https://www.typescriptlang.org/play?ts=5.3.2#code/GYVwdgxgLglg9mABBAFgUwgawIIBtcA8AKgHwAUAznALZpQoxgDmAXIkQJRtGIDeAUIkQUA7jCipEZKAE8ADmjjBhNOg2Yc+gocgCGFNIgBEYENQBGaAE5GW2oRH2Gj5mE0ZRb9vQePm4cLhoumBeOj7OFDIWgWE6jr5G4AAmaMCMaMlxDk7GoJCwCNkRxnDmAFYYnnbhCZFQVoxMxUJWdCBWSFS09E0A3NoAvvyDQA
💻 代码
function checkAll<T>(something: T): T {
switch (typeof something) {
case "number":
case "bigint":
case "boolean":
case "symbol":
case "undefined":
case "function":
case "object":
case "string":
return something;
}
}
🙁 实际行为
这会发出TS错误:“函数缺少结束返回语句,且返回类型不包括'undefined'。(2366)”
🙂 预期行为
没有错误,因为已经处理了typeof的所有可能结果。
关于问题的附加信息
似乎只有在函数参数是泛型时才会成为问题。如果将返回类型和参数类型切换到 any
,它就可以正常工作,但我不确定这是公平的比较。
5条答案
按热度按时间idv4meu81#
函数缺少结束返回语句,并且返回类型不包括'undefined'。
any
允许隐式返回,所以在这种情况下它不是错误。泛型是一个误导;switch并不被认为是详尽无遗的:会产生错误
Playground链接
vom3gejh2#
啊!抓到了,谢谢!:)
llycmphe3#
这里的通用情况并不是一个完整的误导。这个
switch/case
与'string'
不匹配 - 因此实际上并不全面。当我们包括这一点时,那么基于unknown
的场景来自 @fatcerberus 被认为是全面的,错误没有被报告,但原始复现仍然存在问题:TS playgroundu1ehiz5o4#
这个
switch/case
与'string'
不匹配。我怎么会错过那个🤦♂️
我检查了交换机3次,以确保它确实是穷举的,但我仍然错过了缺少的
string
情况。hmtdttj45#
哎呀,我自己漏掉了字符串,但我更新了我的示例+Playground,并且我遇到了同样的问题。