TypeScript 在Assert中,不进行窄化处理,

bxfogqkk  于 6个月前  发布在  TypeScript
关注(0)|答案(3)|浏览(44)

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()

qf9go6mv

qf9go6mv1#

这不是TypeScript的bug。strictEqual的类型注解并没有缩小x的范围,因为它不知道x。我不知道如何在TypeScript中对这个进行类型标注。

assert的例子可以工作,因为TypeScript为了缩小范围看到了整个表达式x.type === 'a',但对于strictEqual情况并非如此。在这里,asserts函数完全不了解x,它只看到x.type

np8igboo

np8igboo2#

@MartinJohns 感谢您的回复。
好的,那我们就称之为功能请求吧。
这绝对是大多数用户所期望的逻辑行为,尽管可能存在技术原因导致它不能像那样工作。

rqenqsqc

rqenqsqc3#

是的,唯一能定义Assert函数的方式是 asserts x(Assert整个表达式)或者 asserts x is T(类型保护)。实现这个建议需要有能力说 asserts x === y,但目前还不能。

相关问题