类型收窄在使用 [] 运算符时有效,但在Array.at上无效

前端开发 2026-07-10
type ListItem = {
  a: string
  b: number
}

//type Props = ListItem[] | ListItem[][]
type Props = Array<ListItem> | Array<Array<ListItem>>

function test (param: Props) {
  if('a' in param[0]) {
    const item: ListItem = param[0]
  }

  const firstItemOperator: ListItem | Array<ListItem> = param[0]
  const firstItemAt: ListItem | Array<ListItem> | undefined = param.at(0)

  if(Array.isArray(param[0])) {
    const item: ListItem[] = param[0]
  }

  if(Array.isArray(param.at(0))) {
    // Why error here?
    const item: ListItem[] = param.at(0)
  }
}

Playground

为什么在使用 [] 运算符进行类型缩窄时会起作用,而使用 at() 函数却不起作用?

相关话题:

否则,我不太理解其中的差异。我有一个变通方法,但我确实需要知道为什么它没有按我的预期工作。

解决方案

类型缩窄是TypeScript编译器中的一种硬编码行为。虽然函数可以充当类型保护,但没有办法表达对同一组参数调用的函数将继续返回相同的值,因此对返回值所做的检查将仍然成立。[] 运算符被假定总是返回相同的值,因此你所进行的任何检查都会累积。尽管这在某种程度上不太安全,因为你可能定义了一个getter,并且每次返回的值都不同。此外,对于可能改变其值的变量也不起作用(参见 ex)

你可以把 at 的结果放到一个变量里,然后对这个变量进行缩窄。无论如何,这样做可能更稳妥。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章