在我看来,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
,而不破坏maybeStr
是string
类型的信息吗?
1.我的假设对吗?有人能更详细地解释一下吗?
1条答案
按热度按时间aydmsdu91#
目前还不可能。
microsoft/TypeScript#44730中实现的对别名条件的控制流分析的支持并不是以您可以编程方式操作的方式出现在类型级别。变量的类型都是
boolean
;没有类型注解可以捕获它与maybeStr
的关系(类型 predicate 不作为独立类型存在)。此外,注解变量会破坏关系:只有当条件表达式或判别属性访问在
const
变量声明中声明**,没有类型注解**[强调已添加],并且被缩小的引用是const
变量,readonly
属性或函数体中没有赋值的参数时,才会发生通过间接引用进行缩小。