类型收窄在使用 [] 运算符时有效,但在Array.at上无效
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)
}
}
为什么在使用 [] 运算符进行类型缩窄时会起作用,而使用 at() 函数却不起作用?
相关话题:
- microsoft/TypeScript#53395 - 看起来在关于
ReadonlyArray的一个问题中,我为了测试而明确移除了该项 - microsoft/TypeScript#42384 - 这似乎是正确的解释
否则,我不太理解其中的差异。我有一个变通方法,但我确实需要知道为什么它没有按我的预期工作。
解决方案
类型缩窄是TypeScript编译器中的一种硬编码行为。虽然函数可以充当类型保护,但没有办法表达对同一组参数调用的函数将继续返回相同的值,因此对返回值所做的检查将仍然成立。[] 运算符被假定总是返回相同的值,因此你所进行的任何检查都会累积。尽管这在某种程度上不太安全,因为你可能定义了一个getter,并且每次返回的值都不同。此外,对于可能改变其值的变量也不起作用(参见 ex)
你可以把 at 的结果放到一个变量里,然后对这个变量进行缩窄。无论如何,这样做可能更稳妥。
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。