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
相关产品推荐
相关产品推荐

