为什么打字稿不能推断表达式的类型
why typescript can not infer type of expression
为什么这些片段中有一个给出了 TSC 错误而另一个没有给出?
它们都产生相同的结果。 nameParts 是一个字符串数组。
if(nameParts[nameParts.length-1]){
//error: Type 'string | undefined' is not assignable to type 'string'.
// Type 'undefined' is not assignable to type 'string'.
const lastName:string = nameParts[nameParts.length-1];
}
const lastWord = nameParts[nameParts.length-1];
if(lastWord){
const lastName:string = lastWord;
}
TypeScript 在分析深度上存在实用限制。使用 const
声明,很容易看出 lastWord
不会是 undefined
,但如果没有它,TypeScript 将需要记住它在 nameParts[nameParts.length-1]
上看到了守卫,并且没有可能改变 nameParts[nameParts.length-1]
的中间代码(通过分配给它,使用 pop
,使用 shift
,等等)。为了避免让编译器太复杂 and/or 太慢,它只是在分析中没有走那么远——尤其是因为如果你想要它,你可以使用你的第二种方法 const
。
为什么这些片段中有一个给出了 TSC 错误而另一个没有给出? 它们都产生相同的结果。 nameParts 是一个字符串数组。
if(nameParts[nameParts.length-1]){
//error: Type 'string | undefined' is not assignable to type 'string'.
// Type 'undefined' is not assignable to type 'string'.
const lastName:string = nameParts[nameParts.length-1];
}
const lastWord = nameParts[nameParts.length-1];
if(lastWord){
const lastName:string = lastWord;
}
TypeScript 在分析深度上存在实用限制。使用 const
声明,很容易看出 lastWord
不会是 undefined
,但如果没有它,TypeScript 将需要记住它在 nameParts[nameParts.length-1]
上看到了守卫,并且没有可能改变 nameParts[nameParts.length-1]
的中间代码(通过分配给它,使用 pop
,使用 shift
,等等)。为了避免让编译器太复杂 and/or 太慢,它只是在分析中没有走那么远——尤其是因为如果你想要它,你可以使用你的第二种方法 const
。