Bug报告assert.strictEqual(a, b)
和 assert.equal(a, b)
不会产生类型script缩小,就像 assert(a === b)
一样
🔎 搜索词
assert, assert.equal, equal, narrowing
🕗 版本与回归信息
始终(我假设)
原始功能在 #8010 中实现
- 这是我尝试的每个版本的行为,我查看了关于 equal 的 FAQ 条目
⏯ Playground链接
https://www.typescriptlang.org/play?#code/JYWwDg9gTgLgBAbzgZxlYBjeBDZdfICmscAvnAGZQQhwDkBxMdAUCzAJ5iFwCCcAXkQs4ouJ24AuetlZi4AO2kKAriABGxFqTYSeAIUHD5e6XXVyxyaanQKA5traEAHpBIUVCrMAgLKAIwAFC5w0vwAPnD6AJTGYoywIQB0eoICQgx0MSJiGH7IEAA2hMlFEPYpCnFwAPS1cADyANJOLK7u8J7eML7+FABMIWF8cFGx8aKJMMm2mDAAogCOKthFKXoANDLZuaL5CoUlZRVVcfVwAGK8AJIAMtIACtTcsBz0CnRwACYQhHgKCDwVzAVBwPziLg8OiRaJ0ZJwZ4QV6cD5fX7-RRAuAgsEQtJ0fTwpxAA
💻 代码
import { strict as assert } from 'assert'
type A = {
type: 'a'
n: number
}
type B = {
type: 'b'
s: string
}
export function f1(x : A | B) {
assert(x.type === 'a')
console.log(x.n) // OK
}
export function f2(x : A | B) {
assert.strictEqual(x.type, 'a')
console.log(x.n) // FAIL: Property 'n' does not exist on type 'A | B'. Property 'n' does not exist on type 'B'.
}
🙁 实际行为
函数 f2()
没有类型script缩小
🙂 预期行为
函数 f2()
应该产生类型script缩小,因为它等同于 f1()
3条答案
按热度按时间qf9go6mv1#
这不是TypeScript的bug。
strictEqual
的类型注解并没有缩小x
的范围,因为它不知道x
。我不知道如何在TypeScript中对这个进行类型标注。assert
的例子可以工作,因为TypeScript为了缩小范围看到了整个表达式x.type === 'a'
,但对于strictEqual
情况并非如此。在这里,asserts函数完全不了解x
,它只看到x.type
。np8igboo2#
@MartinJohns 感谢您的回复。
好的,那我们就称之为功能请求吧。
这绝对是大多数用户所期望的逻辑行为,尽管可能存在技术原因导致它不能像那样工作。
rqenqsqc3#
是的,唯一能定义Assert函数的方式是
asserts x
(Assert整个表达式)或者asserts x is T
(类型保护)。实现这个建议需要有能力说asserts x === y
,但目前还不能。