如果启用
strictFunctionTypes
在操场上。您可以阅读有关此选项的更多信息
here
但它的要点是,它消除了函数的双方差。
在你的情况下数组
[[1], [2]]
Array<[number]>
,而是键入为
Array<number[]>
,因为typescript不会为数组文本推断元组类型,除非它被指示这样做。这会导致一个错误,因为函数是显式接受元组类型的
[any]
any
最简单的解决方案是显式指定数组的类型:
function head([a] : [number]) { // type is not required but it's best to not leave implict any
return a;
}
const data: Array<[number]> = [[1], [2]]
const x: number[] = data.map(head)
function tuple<T extends any[]>(...a: T) {
return a;
}
const x: number[] = [tuple(1), tuple(2)].map(head)
function tupleArray<T extends [any]|any[]>(...a: T[]) {
return a;
}
const x: number[] = tupleArray([1], [2]).map(head)