给定具有类型的变量:

const someArray: number[];
const index: number | undefined;

Typescript 中有没有这个表达的速记:

index === undefined ? undefined : someArray[index]

上面的表达式可能会变得非常冗长,特别是如果index本身也是一个表达式.

我知道表达式可以被包装到一个函数中,我只是好奇是否有一种内置的方法可以写得更简洁.例如,在JS中,可以简单地将其设置为:someArray[index].

推荐答案

表达方式

index === undefined ? undefined : someArray[index]

并不等同于

someArray[index]

因为如果是index === undefined,前一个表达式的计算结果肯定是undefined,而后一个表达式的索引是someArray,其中undefinedproperty 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之上添加了一个类型系统.使用不是stringnumbersymbol类型的键索引到对象或数组中确实不是惯用的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

Typescript相关问答推荐

实现忽略了JSSOM中的doctor.body.innerHTML集

排序更改数组类型

类型脚本:类型是通用的,只能索引以供阅读.(2862)"

等待的R没有用响应对象展开到R

APP_INITIALIZER—TypeError:appInits不是函数

如何判断输入是否是TypeScript中的品牌类型?

具有继承的基于类的react 组件:呈现不能分配给基类型中的相同属性

在MessageStore对象中实现条件类型时出现TypeScrip错误

不推荐使用Marker类-Google map API警告

来自类型脚本中可选对象的关联联合类型

在TypeScrip的数组中判断模式类型

TypeScrip:从对象中提取和处理特定类型的键

vue-tsc失败,错误引用项目可能无法禁用vue项目上的emit

转换器不需要的类型交集

在Reaction中折叠手风琴

如何在try 运行独立的文字脚本Angular 项目时修复Visual Studio中的MODULE_NOT_FOUND

创建一个函数,该函数返回一个行为方式与传入函数相同的函数

字符串文字联合的分布式条件类型

可以用任意类型实例化,该类型可能与

对象可能未定义(通用)