我以为result
等于number | never[]
.
type T1 = (number | undefined)[]
const myFunc = (arr: T1, index: number) => {
const result = arr[index] === undefined ? [] : arr[index]
return result // number | never[] | undefined
}
为什么会这样?
我以为result
等于number | never[]
.
type T1 = (number | undefined)[]
const myFunc = (arr: T1, index: number) => {
const result = arr[index] === undefined ? [] : arr[index]
return result // number | never[] | undefined
}
为什么会这样?
TypeScript使用流分析来缩小变量类型.
type T1 = (number | undefined)[]
const myFunc = (arr: T1, index: number) => {
if (arr[index] === undefined) {
return []; // never[]
}
//the type of `arr` is still considered T1
let temp = arr[index]; //number | undefined
return temp;
}
实际上,我不确定arr
的类型应该如何表示为if
块之后的类型(除了这个特定的动态索引不是未定义的之外,您如何表示"未定义的数字数组").简单地回到T1
还是有道理的.
您的代码使用三元运算符,但其作用类似于我上面的代码.
然而,当变量用于流控制语句中的直接比较时,TypeScript可以缩小result
变量的类型:
type T1 = (number | undefined)[]
const myFunc = (arr: T1, index: number) => {
const result = arr[index];
if (result === undefined) {
return []; // never[]
}
//the type of `result` is correctly determined as number, not undefined
return result;
}
我认为arr
和result
(变量)的类型可能会被控制流缩小,但arr[index]
(一个表达式,而不仅仅是一个变量)将只从arr
和index
的类型中计算出来.