You need to enable JavaScript to run this app. TypeScript:函数返回映射元组如何规避noUncheckedIndexedAccess报错
优惠活动
大模型
产品
解决方案
定价
更多

TypeScript:函数返回映射元组如何规避noUncheckedIndexedAccess报错

开启noUncheckedIndexedAccess配置时,下方示例代码无法通过编译。虽然literalValue的类型明确为number,但value和spreadValue的类型联合中混入了多余的undefined类型。

请问是否有办法为squareTuple和squareSpreadTuple函数添加类型标注,使得传入固定元数的元组时,返回值可以像字面元组一样正常解构,且类型联合中不会出现多余的undefined?

示例代码中编写的Mapped类型是为此做的尝试(试图将入参元组的length属性传递给返回类型),但该类型似乎没有生效。

是否有其他方法可以将入参元组的元数(arity)传递给返回值,让类型系统在解构时能够正确识别返回类型?

function square(num:number){
  return num*num;
}

type Mapped<NumList extends ReadonlyArray<number>> = ReadonlyArray<number> & {length:NumList["length"]}

function squareTuple<NumList extends ReadonlyArray<number>>(nums:NumList): Mapped<NumList> {
  return nums.map(square);
}

function squareSpreadTuple<NumList extends ReadonlyArray<number>>(...numList:NumList) : Mapped<NumList> {
  return squareTuple(numList)
}

const [literalValue] = [9,16,25] as const;
const [value] = squareTuple([3,4,5] as const) ;
const [spreadValue] = squareSpreadTuple(3,4,5) ;

console.log(`Sum of values is: ${literalValue + value + spreadValue }`)

包含编译报错的示例代码可在 TypeScript Playground 复现。

更新内容
我编写的代码成功消除了类型报错,但对于本该内置、可自动推断的类型来说,这个实现不够优雅,应该还有更优方案。

更新2
如果仅支持扩展运算符(spread)入参的场景,更简洁的方案可以正常工作。但我无法解释为什么非spread入参的场景无法用这个更简单的方案通过编译。


内容的提问来源于stack exchange,提问作者cefn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.31 01:54:06