表达方式
index === undefined ? undefined : someArray[index]
并不等同于
someArray[index]
因为如果是index === undefined
,前一个表达式的计算结果肯定是undefined
,而后一个表达式的索引是someArray
,其中undefined
是property name,这会将undefined
转换为字符串"undefined"
.因此,someArray[undefined]
相当于someArray.undefined
.someArray.undefined
还会存在吗?大概不会吧.因此,在实践中,这可能是undefined
,但在技术上是可能的:
const myArray: number[] = Object.assign([123], { undefined: "xyz" });
const index: number | undefined = Math.random() < 0.5 ? 0 : undefined;
console.log(myArray[index] === undefined) // false
上例中的myArray[index]
不能是undefined
.
此外,即使它们是等价的,为了在添加一些类型安全性的同时仍然允许惯用的JavaScript代码,TypeScrip在JavaScript之上添加了一个类型系统.使用不是string
、number
或symbol
类型的键索引到对象或数组中确实不是惯用的JavaScript.TypeScrip坚持认为,使用undefined
作为索引可能是错误的,因为这几乎不是人们真正想要做的.因此,即使someArray[index]
没有边缘情况,它仍然被认为是非法排版.有关更多信息,请参见What does "all legal JavaScript is legal TypeScript" mean?
如果您真的想编写someArray[index]
,您可以通过type assertion和/或the any
type来完成,以放松类型判断:
someArray[index as any]
如果不是,那么index === undefined ? undefined : someArray[index]
或抽象操作的函数可能是最好的 Select .
Playground link to code