当数组为空时,TypeScript 不进行类型检查

标签 typescript

当数组为空时,TS不做类型检查

我的代码在这里

type List = { name: string }[]

const l: List = []

// error
l[0].name

有什么办法可以做TS校验吗?如何做TS校验呢?

最佳答案

启用noUncheckedIndexedAccesstsconfig.json 中的 compilerOptions 中。

在此之后,您将开始收到 TS 错误,例如 Object is possible 'undefined'.(2532) 此类语句。

type List = { name: string }[]

const l: List = []

l[0].name // <-- error

l[0]?.name // <-- no error (ref: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Optional_chaining)

Playground

请注意,noUncheckedIndexedAccess 选项不会检查数组的长度;它基本上会不断提醒您您尝试访问的索引可能不存在。


如果您的数组(及其元素)是只读的,您还可以使用 const 断言:

const l = [{ name: 'foo' }] as const

l[0].name // no error
l[1] // error: Tuple type 'readonly [{ readonly name: "foo"; }]' of length '1' has no element at index '1'.(2493)

如果您只想固定数组长度但元素可变,那么在 TS4.1 及更高版本中您可以这样做:

// based on - https://stackoverflow.com/a/52490977

type _TupleOf<T, N extends number, R extends unknown[]> = R['length'] extends N ? Readonly<R> : _TupleOf<T, N, [T, ...R]>
type Tuple<T, N extends number> = N extends N ? (number extends N ? T[] : _TupleOf<T, N, []>) : never

type List = Tuple<{ name: string }, 1>

const l: List = [{ name: 'foo' }]

l[0].name // no error
l[1] // error: Tuple type 'readonly [{ name: string; }]' of length '1' has no element at index '1'.(2493)

关于当数组为空时,TypeScript 不进行类型检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70182375/

相关文章:

json - 将 TypeScript 与 tsconfig.json 文件一起使用时是否可以包含 json 文件?

javascript - Typescript 继承的父类中的参数是什么?

javascript - 将 typescript 缩小为一个 JS 文件,使用 gulp 保持 sourcemaps 工作

javascript - 我们可以将 Angular FormArray 与 angular2-multiselect 下拉菜单一起使用吗?

angular - 可以为 FormControl 值设置某种类型吗?

javascript - 如何处理 react/redux 中的副作用?

angularjs - 使用 TypeScript 接口(interface)获取类型信息的 angular.service 的目的是什么

typescript 枚举和外部模块(browserify)

Angular 2 : Cannot find form control at index 1 at FormArray

reactjs - 在 Typescript 中,如果设置了另一个可选属性,如何使属性成为必需?