对于数组字面量类型推断不推断元组,它推断数组,所以
var foo = ["", 0]; // foo is Array<string | number> not [string, number]
我还没有找到这方面的文档,但是 pull request 添加对元组的支持在声明它们时从不使用推理,我猜这是故意的。
在您的情况下,您可以指定类型参数:
['List', 'Of', 'Names']
.map<[string, number]>((name, index) => [name, index % 2])
.map(([name, num]) => name + "");
2.9及以下解决方案
如果这对您来说是一个常见问题,或者创建一个元组辅助函数:
function tuple<T1, T2, T3, T4, T5>(data: [T1, T2, T3, T4, T5]) : typeof data
function tuple<T1, T2, T3, T4>(data: [T1, T2, T3, T4]) : typeof data
function tuple<T1, T2, T3>(data: [T1, T2, T3]) : typeof data
function tuple<T1, T2>(data: [T1, T2]) : typeof data
function tuple(data: Array<any>){
return data;
}
['List', 'Of', 'Names']
.map((name, index) => tuple([name, index % 2]))
.map(([name, num]) => name + "");
3.0解决方案
自从我发布原始答案以来,打字稿已经改进了它的推断,能够推断出剩余参数的元组类型。有关详细信息,请参阅PR。有了这个特性,我们可以编写一个更短的tuple 函数:
function tuple<T extends any[]> (...data: T){
return data;
}
['List', 'Of', 'Names']
.map((name, index) => tuple(name, index % 2))
.map(([name, num]) => name + "");