【发布时间】:2019-09-16 09:28:46
【问题描述】:
这是一个代码示例:
declare function test_ok<T>(arr: T[]): T;
test_ok([1, 2, "hello"]); // OK
test_ok([[1], [2], ["hello"]]); // OK
// note the nested array signature
declare function test_err<T>(arr: T[][]): T;
test_err([[1], [2], ["hello"]]); // ERR type "string" is not assignable to type "number"
test_err<string | number>([[1], [2], ["hello"]]); // OK if generic is specified
在一般情况下,TypeScript 似乎能够在给定异构数组时推断出最佳常见类型(基本联合)。但是,如果您尝试将泛型的范围扩大到一个简单的数组(例如上面的嵌套数组),它就会放弃。我在其他情况下也发现了这一点(例如,泛型在函数的 返回类型之上的函数数组,而不是整个函数)。这是某种性能优化吗?
【问题讨论】:
-
这也发生在任何深度为 2 或更多的属性上,而不仅仅是数组:
declare function x<T>(a: { x: {y: T}, u: {v: T}}): void; x({x: {y: 1}, u: {v: ""}}); -
TypeScript 最擅长在给定该类型的值的情况下推断类型,而不是在给定某个 函数 的值的情况下推断类型。所以我会尝试
declare function foo<T extends any[][]>(arr: T): T[number][number];...这是否符合您的用例?仍然不确定是否有官方答案可以解释为什么推理在两层深处“放弃”。可能是故意的,因为有时您希望这样的事情失败。 -
看起来这可能是故意的,见related comment on microsoft/TypeScript#31617
-
@jcalz 感谢您的解决方法以及链接。如果您将其放入答案中,我会批准它。
标签: typescript