TypeScript:Annotate `是string`而不是boolean`?

6pp0gazn  于 2023-10-22  发布在  TypeScript
关注(0)|答案(1)|浏览(121)

在我看来,TypeScript不仅将typeof x === 'string'解释为简单的布尔值,而且还将其解释为某种布尔值is string类型。
请考虑以下示例:

const tryInference = function(maybeStr?: string): void {

  const isStrI          = typeof maybeStr === 'string'; // inferred type "is string"
  const isStrB: boolean = typeof maybeStr === 'string'; // explicit boolean

  console.log( isStrI && maybeStr.charAt(0) ); // <-- ok
  console.log( isStrB && maybeStr.charAt(0) ); // <-- TS18048: 'maybeStr' is possibly 'undefined'.

  const indeedStr1: string = isStrI ? maybeStr : ''; // <-- ok
  const indeedStr2: string = isStrB ? maybeStr : ''; // <-- TS2322: Type 'string | undefined' is not assignable to type 'string'

  console.log( indeedStr1, indeedStr2 );
};

我理解在isStrI的情况下,TypeScript知道如果typeof maybeStr === 'string',那么maybeStr.charAt是可用的。
我假设在isStrB && maybeStr.charAt(0)的情况下,TypeScript将其解释为true && maybeStr.charAt(0),并且不再与typeof maybeStr === 'string'有关系?* (当然,如果isStrB为真)*
这让我很好奇:
1.我可以显式地注解isStrI,而不破坏maybeStrstring类型的信息吗?
1.我的假设对吗?有人能更详细地解释一下吗?

aydmsdu9

aydmsdu91#

目前还不可能。
microsoft/TypeScript#44730中实现的对别名条件的控制流分析的支持并不是以您可以编程方式操作的方式出现在类型级别。变量的类型都是boolean;没有类型注解可以捕获它与maybeStr的关系(类型 predicate 不作为独立类型存在)。此外,注解变量会破坏关系:
只有当条件表达式或判别属性访问在const变量声明中声明**,没有类型注解**[强调已添加],并且被缩小的引用是const变量,readonly属性或函数体中没有赋值的参数时,才会发生通过间接引用进行缩小。

相关问题