|
1
7
目前,不必担心边缘情况的最简单方法如下
它产生
TS4.1的更新
现在可以在类型级别连接字符串文字,使用
模板文字类型
如实施于
microsoft/TypeScript#40336
。下面的实现可以进行调整以使用它,而不是类似的东西
在这里
那么
其他类型则从中脱颖而出:
和
其余的答案基本相同。递归条件类型(如中实现的
microsoft/TypeScript#40002
)TS4.1也将支持,但递归限制仍然适用,因此没有深度限制器的树状结构会出现问题,例如
请注意,这将使非点表键形成虚线路径,如
另请注意:这些递归类型本质上是“棘手的”,如果稍加修改,往往会让编译器不满意。如果你不够幸运,你会看到诸如“类型实例化太深”之类的错误,如果你 非常 不幸的是,你会看到编译器耗尽你所有的CPU,永远无法完成类型检查。总的来说,我不知道该怎么说这种问题。。。只是这样的事情有时比它们的价值更麻烦。 TS4.1之前的答案: 如上所述,目前无法在类型级别连接字符串文字。有一些建议可能允许这样做,例如 a suggestion to allow augmenting keys during mapped types 和 a suggestion to validate string literals via regular expression ,但目前这是不可能的。
您可以将路径表示为
tuples
字符串文字。所以
所以你可能想要这样的东西
请注意:
我们开始吧:
意图
类型
最后,
好吧,让我们测试一下:
为了看到深度限制的有用性,想象一下我们有一个这样的树类型:
好,
编译器生成它需要很长时间,编辑器的性能会突然变得非常差。让我们将其限制在更易于管理的范围内:
这迫使编译器停止查看深度为3的路径,因此所有路径的长度最多为3。 所以,这是有效的。ts工具带或其他实现很可能会更加小心,以免导致编译器心脏病发作。因此,我不一定说你应该在没有进行大量测试的情况下在生产代码中使用它。
但不管怎样,这是你想要的类型,假设你有并且想要
|
|
2
6
一个递归类型函数,使用 conditional types , template literal 串, mapped types 和 index access types 基于 @jcalz's answer 并且可以用这个来验证 ts playground example 生成一种联合类型的属性,包括用点表示法嵌套的属性
这在使用文档数据库时也很有用,例如 mongodb 或 firebase firestore 它允许使用点符号设置单个嵌套属性 使用mongodb
使用firebase
可以使用此类型创建此更新对象 然后typescript会引导你,只需添加你需要的属性
您还可以更新do嵌套属性生成器,以避免显示嵌套属性数组、日期。。。
|
|
3
4
我遇到了一个类似的问题,当然,上面的答案非常惊人。但对我来说,它有点过头了,如上所述,对编译器来说相当费力。 虽然不那么优雅,但阅读起来要简单得多,我建议使用以下类型来生成类似Path的元组:
一个主要的缺点是,这种类型不能处理像这样的自引用类型
但对于其他类型,它似乎做得很好:
如果只想强制引用叶节点,可以删除
不幸的是,对于一些更复杂的对象,该类型似乎默认为
当您需要类似于的点语法时 @Alonso's 答案是,你可以将元组映射到模板字符串类型:
|
![]() |
4
4
这是我的方法,我从这篇文章中得到的 TypeScript Utility: keyof nested object 并扭曲它以支持自引用类型 : 使用TS>4.1(不知道它是否适用于以前的版本)
编辑 :使用此类型的方法如下:
重要的 :由于DotPath类型是现在定义的,它不会让你选择任何数组字段的属性,也不会让你在找到自引用类型后选择更深层次的属性。例子:
最后,我会留下一个 Playground (更新版本,案例由czlowiek488和Jerry H提供) EDIT2 :对以前版本的一些修复。 EDIT3 :支持可选字段。 EDIT4 :允许跳过特定的非基元类型(如日期和数组) |
![]() |
5
2
我偶然发现了这个解决方案,它可以处理数组中的嵌套对象属性和可以为null的成员(请参阅此 Gist 更多细节)。
其工作原理如下:
这个
|
![]() |
6
0
这可能对你有帮助,兄弟 https://github.com/react-hook-form/react-hook-form/blob/master/src/types/path/eager.ts#L61
https://github.com/react-hook-form/react-hook-form/blob/master/src/types/path/eager.ts#L141
|
![]() |
7
0
我在这篇文章中尝试了公认的答案,它奏效了,但编译器速度非常慢。我认为我找到的黄金标准是
经过测试,我发现它一碰到自引用类型循环就会停止,我认为这是一种合理的方法。它还支持在任何时候停止
|
|
8
0
Aram Becker对数组和空路径的支持补充道:
|
![]() |
Devmix · 如何在new Map()中保存状态? 1 年前 |
![]() |
Luisus · 从Prisma 5客户端提取类型 1 年前 |
|
Rostys · TypeScript:使用类型转换进行类型保护 1 年前 |
![]() |
Anne · 类型不一致的对象的TypeScript类型定义 1 年前 |
|
tuimui · 使用react+ts通过道具传递数据 1 年前 |