【发布时间】:2021-03-14 00:51:27
【问题描述】:
下面的代码示例无法使用 noUncheckedIndexedAccess 进行编译。虽然已知literalValue 是一个数字,但value 和spreadValue 变量在它们的联合类型中具有“未定义”。
有没有办法注释 squareTuple 和 squareSpreadTuple 函数,以便传递特定元组的元组将返回一个可以像字面元组一样解构的结果,而不会在其类型联合中出现虚假的未定义?
示例代码中的 Mapped 类型试图做到这一点(通过将元组的长度属性传递给它的返回值)。好像没什么效果。
还有什么其他方法可以以解构会尊重的方式将参数元组的数量转移到它的返回值?
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 }`)
示例代码(带有可见的编译错误)位于this playground
更新
我使用this playground 的代码设法让红线消失了。对于我希望推断出的内置类型的东西,这绝不是优雅的。可能有更好的方法。
更新 2
如果我只将支持扩展到扩展案例,那么this playground 的更简单的方法可以工作。不过,我发现很难解释为什么非扩展案例无法使用这种更简单的方法进行编译。
【问题讨论】:
标签: typescript tuples undefined mapped-types