在这种情况下,为什么不从参数推断出通用值 N ?

2024-02-10

这个问题:

TypeScript:要求两个数组长度相同? https://stackoverflow.com/questions/62206320/typescript-require-that-two-arrays-be-the-same-length

询问如何创建需要两个长度相同的数组的函数。

这是我尝试的解决方案。

type ArrayOfFixedLength<T extends any, N extends number> = readonly T[] & { length: N }; 

const a1: ArrayOfFixedLength<number, 2> = [1] as const; //expected error
const a2: ArrayOfFixedLength<number, 2> = [1, 2] as const; 


function myFunction<N extends number>(array1: ArrayOfFixedLength<any, N >, array2: ArrayOfFixedLength<any, N>) {
return true; 
}

myFunction<3>([1, 2, 3] as const, [2, 3, 4] as const); 
myFunction<2>([1, 2] as const, [1, 2, 3] as const); //expected error

// However, if you don't specify the array length, 
// It fails to error
myFunction([1, 2, 3] as const, [2, 3, 4] as const); 
myFunction([1, 2] as const, [1, 2, 3] as const); // error is expected, but there is none. 

如前所述,如果您明确声明通用值,此代码只会给出 TypeScript 错误N- 数组的长度。

为什么 TypeScript 无法从传递给函数的参数推断出值 N?


您需要向编译器给出提示以期望元组类型。否则编译器将扩​​展数组文字,例如[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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在这种情况下,为什么不从参数推断出通用值 N ? 的相关文章

随机推荐

  • 如何注册私有 DICOM 标签?

    我想知道公司 例如飞利浦或西门子 如何注册私有 DICOM 标签 I mean 如何保证DICOM组不被其他厂家占用 假设飞利浦选择了标签 1111 00xx 那么它需要知道组 1111 尚未被占用 之后NEMA还需要参与吗 或者有其他组织
  • 无法在 android 中添加 addView

    我需要朋友们的帮助 这是我的活动 public class MainActivity extends Activity float values 700 400 100 500 600 float values1 70 40 10 50 O
  • System.IO.Packaging:无法确定域的身份

    我正在使用 System IO Packaging 在完全托管的桌面 Windows 窗体 应用程序中创建文件 在一定条件下 OPC包的写入会引发 无法确定域的身份 例外 我了解到它与独立存储有关 因为打包 API 有时会在那里创建临时数据
  • 如何使用引导行和列增加文本区域的高度

    我设计了一个表单 其中连续有两个项目 如下所示 我的输出 Code我用过的 div class row div class col sm 3 fieldset class form group fieldset div div
  • 计算unix日志文件中两个时间段之间的行数[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 Log file
  • 如何创建一个从 goroutine 接收多个返回值的通道

    我在 Go 中有一个返回两个值的函数 我想将其作为 goroutine 运行 但我无法弄清楚创建接收两个值的通道的语法 有人能指出我正确的方向吗 定义一个包含两个值字段的自定义类型 然后创建一个chan那种类型的 编辑 我还添加了一个使用多
  • 未捕获的类型错误:FB.login 不是函数

    我正在使用 Facebook JavaScript API 创建 Facebook 登录功能并从 API 获取用户详细信息 当我以正常方式使用相同的代码时 我从 Facebook api 获取数据 当我尝试使用 requireJS 做同样的
  • 如何获取当前日期之前的 30 天?

    我有一个开始日历输入框和一个结束日历输入框 我们希望默认开始日历输入框为当前日期之前 30 天 结束日历输入框默认为当前日期 这是我的日期变量 var today new Date dd today getDate mm today get
  • 从资源中读取json文件并在JAVA中将其转换为json字符串

    我在代码中硬编码了这个 JSON 字符串 String json n id 1 n name Headphones n price 1250 0 n tags home green n n 我想将其移至资源文件夹并从那里读取它 我怎样才能在
  • 在 Cocoa 中创建 iTunes 风格源列表时遇到问题

    我正在开发一款可以与 iTunes 风格的源列表配合良好的软件 我一直在网上寻找如何实现它 但所有的例子似乎都有点粗略 我找到了马克 奥尔德里特的执行 http www latenightsw com blog p 29并尝试在我的项目中使
  • CouchDB - 创建或更新文档时触发代码

    我有一个在 CouchDB 中存储数据的页面 该页面直接通过 JavaScript 访问数据库 因此浏览器中没有隐藏太多逻辑 创建新文档时 有一些逻辑将数据元素提取到单独的字段中 以便可以搜索它们 创建或更新文档时是否可以在服务器上执行此逻
  • 如何使用 [object addGesture...] 从 C4Workspace 调用方法?

    我希望实现的是使用以下方法调用 C4Workspace m 中的方法 shape addGesture SWIPELEFT name swipeLeft action leftSwipeMethod 我知道这会尝试在 C4Shape 类中调
  • jQuery livequery 插件相当于 jQuery 1.7+

    是否有相当于 jQuery 1 7 的 jQuery livequery 插件 我正在尝试动态绑定事件 读取 DOM 元素应基于 data 元素绑定的事件 a href class js test Test 1 a a href class
  • 尽可能避免使用 mod 运算符是否更好?

    我认为计算数字的模是一个有点昂贵的操作 至少与简单的算术测试 例如查看数字是否超过数组的长度 相比 如果确实如此 那么替换例如以下代码是否会更有效 res array i 1 len 与以下 res array i 1 len 0 i 1
  • DMARC/SPF 配置错误

    我有一个注册域名domains google com我使用 G Suite 帐户并从 SES 和 mailchimp 发送电子邮件 我的 DNS 记录看起来正确 Mailchimp 说明 https kb mailchimp com acc
  • reCAPTCHA - 按提交后出现

    我想在我的表单中使用 reCAPTCHA 用户必须填写表格 然后按 提交 之后 在 提交 按钮下 应该会出现 reCAPTCHA 我怎样才能做到这一点 如果我想要这样的东西 我可能会将 reCAPTCHA 预加载到jQuery 对话框 ht
  • 不可点击的锚标记

    我使用这个html代码 div class titleIn h2 a href link2 link2 a h2 div 并且由于某种原因link2不可点击 没有手形光标 CSS 是 titleIn direction rtl margin
  • SublimeText3中的binary_file_patterns和index_exclude_patterns有什么区别?

    在 Sublime Text 3 中binary file patterns排除在文件或模糊搜索 转到任何内容 中找到的文件index exclude patterns防止文件被索引 既然我们知道无法找到未索引的文件 并且假设无法追踪的文件
  • 更改资源文件 (resx) 命名空间和访问修饰符

    在我的网络项目中 我使用了 4 个资源文件App GlobalResources文件夹 其中之一 lang resx 是在我到达该项目之前创建的 它具有正确的命名空间 WebApplication App GlobalResources 和
  • 在这种情况下,为什么不从参数推断出通用值 N ?

    这个问题 TypeScript 要求两个数组长度相同 https stackoverflow com questions 62206320 typescript require that two arrays be the same len