您需要向编译器给出提示以期望元组类型。否则编译器将扩展数组文字,例如[2, 3, 4]
to number[]
。提示通常采用在类型注释或泛型约束中包含元组类型的形式;最好是某种元组类型的联合,不会妨碍您正在做的事情:
function myFunction<N extends number>(
array1: ArrayOfFixedLength<any, N> | [never],
array2: ArrayOfFixedLength<any, N & {}> | [never]) {
return true;
}
The | [never]
是一个提示。看微软/TypeScript#27179 https://github.com/microsoft/TypeScript/issues/27179特别是这条评论 https://github.com/microsoft/TypeScript/issues/27179#issuecomment-422606990了解更多信息。我用了[never]
因为我希望你不会传递任何带有 a 的数组never
值,所以在实践中如果array1
接受这样的数组。
是的,它很丑。我要求一个更简单的方法微软/TypeScript#30680 https://github.com/microsoft/TypeScript/issues/30680,但我不知道类似的事情是否会实施。
另请注意,对于array2
我已经更换了N
with N & {}
。如果不这样做,您的函数将无法达到将两个数组限制为相同长度的目的;反而,N
将仅被推断为两个数组长度的并集。理想情况下你想要only array1
习惯于infer N
,以及N
in array2
应该是“非推理性的”。有一个开放的 GitHub 问题,微软/TypeScript#14829 https://github.com/microsoft/TypeScript/issues/14829#issuecomment-320754731,请求对此的支持。这& {}
is a 降低推理优先级的技术 https://github.com/microsoft/TypeScript/issues/14829#issuecomment-320754731,这足以仅推断N
from array1
并不是array2
.
让我们看看它的工作原理:
myFunction([1, 2, 3] as const, [2, 3, 4] as const); // okay
myFunction([1, 2] as const, [1, 2, 3] as const); // error
myFunction([1, 2, 3], [2, 3, 4]); // okay
myFunction([1, 2], [1, 2, 3]); // error
在我看来很好。好的,希望有帮助;祝你好运!
Playground 代码链接 https://www.typescriptlang.org/play/#code/FAguE8AcFMAIEEBOiCG4DyAzAYgSwB7QAmAMtAHYDmoAFgDwAqs0+oFRAzrCueADSwAcs1bsu5AK4BbAEbREAPlgBeWImgoiAe3IAbcLAYBtALqwAZLADesXRWo0AXENgBfANwgAxjo6huAIzOSKgYOATEZFS0dJKy8gIATEqqRgFmKFw+5H6e2X7cicHIaFh4hKT2MXFyiEkpsGlJGVm+oJ7AsCCYEuReoLg6sFLg2L39g+R0wixs5JywNfIKABSdsBsoJeBBCNtlEZXR9Dz8QkoAPo3k0ABu8iZ865vbRXuhBxVRDnSnAsKWKyuS7XO4PACU1meamgoAkiHIsFAiAk0E8rhAIzGfQGOhWTVgiQEAGYWrB8qABEYibBiQIACxking9ywAD0bNgWgA1mhgFjxrjyPiAs1uK0cpTGqLCSSmW0WezOfJEFpEPzRoLJiKknKqTS6bBGYqOVzeeANdiJniCYlHtLdbSTCblcg1UA