TypeScript 如何理解这种情况?

Ahm*_*bai 2 typescript

当将一个类型的变量分配unknown给另一个变量时,我们应该对该变量进行类型检查unknown,但是 TypeScript 如何理解这个特定条件呢?看起来它正在返回 aboolean但我认为它更复杂:

let first: unknown = 5;
let second: number;

const result = typeof first === 'number';

if(result){
    second = first; // error : Type 'unknown' is not assignable to type 'number'
}

if(typeof first === 'number'){
    second = first; // no errors
}
Run Code Online (Sandbox Code Playgroud)

Dai*_*Dai 5

在 2021 年 6 月添加 PR #44730 后,TypeScript 在 TypeScript 4.4 中添加了对间接表达式类型缩小的支持。在介绍此功能的注释中,Anders Hejsberg 提到了此功能的局限性(强调并格式化了我的):

在以下情况下才会通过间接引用缩小范围:

  • 条件表达式判别式属性const访问在没有类型注释的变量声明中声明,并且...
  • 缩小的参考范围是以下之一:
    • 变量const
    • 财产readonly
    • 函数体中没有分配的参数。

在您的情况下,您的let first: unknown = 5;变量的分配不能与此功能一起使用,因为它是let局部变量而不是const局部变量。

因此,如果您将代码更改为 useconst first而不是let first,那么它就可以工作:


const first: unknown = 5;
let second: number;

const result = ( typeof first === 'number' );

if( result ) {
    second = first; // OK!
}

if( typeof first === 'number' ) {
    second = first; // OK!
}

Run Code Online (Sandbox Code Playgroud)

TypeScript 游乐场链接