以下内容无法编译:
function returnString(): string {
const s = Math.random() < 0.5 ? 'hey' : null;
const sIsString = s !== null;
if (sIsString) {
return s; // <-- problematic line
}
return 'hey';
}
错误:Type '"hey" | null' is not assignable to type 'string'.
在条件内进行比较时,它执行:
function returnString(): string {
const s = Math.random() < 0.5 ? 'hey' : null;
if (s !== null) {
return s;
}
return 'hey';
}
为什么将类型检查放在变量内对编译器有影响?
答案 0 :(得分:2)
可以缩小诸如w.Header().Set("Content-Type", "application/json")
json.NewEncoder(w).Encode(list)
之类的联合类型变量的机制称为control flow analysis,但它仅基于每个变量发生。
编译器无法在您的相关变量s
和s
之间建立连接。因此,如果sIsString
是sIsString
,则您知道true
,但TS却不知道。它只看s !== null
和s
,就好像它们是完全独立的。
第二种情况有效,因为您直接在变量sIsString
上执行类型保护检查,并且上述控制流分析对每个变量都有效。因此,在进行s
类型检查之后,其并集类型string | null
可以适当地缩小到string
。