🔎 搜索词
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;
}
🙁 实际行为
fnAssert
和 fnTypeof
都无法让 TS 将 b
识别为其缩小类型( number
)。只有在检查 a
是否与字面量相等时,缩小操作才能生效。
🙂 预期行为
b
参数应该被缩小为 number
。
关于问题的附加信息
- 无响应*
2条答案
按热度按时间lkaoscv71#
当前仅支持区分的联合类型,并且只有在检查判别式时才能工作。这不仅仅适用于依赖参数 - 它与对象类型以完全相同的方式工作:TS playground
esyap4oy2#
Dupe of #32399 ?