- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这个问题是发现的问题的扩展 here .
我有一个对象:
type exampleType = {
propertyOne: string
propertyTwo: number,
propertyThree: {
propertyFour: string,
propertyFive: Date,
propertySix: boolean,
}
}
我正在寻找一种类型,它可以将类似字符串的点符号验证为 string
的路径。或 Date
.在上面的示例中,这意味着类型编译为:
propertyOne | propertyThree.propertyFour | propertyThree.PropertyFive
使用上面先前提出的问题,以下是可能的:
type PathsToStringProps<T> = T extends string ? [] : {
[K in Extract<keyof T, string>]: [K, ...PathsToStringProps<T[K]>]
}[Extract<keyof T, string>];
type Join<T extends string[], D extends string> =
T extends [] ? never :
T extends [infer F] ? F :
T extends [infer F, ...infer R] ?
F extends string ?
`${F}${D}${Join<Extract<R, string[]>, D>}` : never : string;
type Path = Join<PathsToStringProps<exampleType>, ".">
我试图使上述解决方案通用,这样我就可以给出 Path
两个通用参数:T
, 代表 exampleType
在这里,和V
,这将是 string|Date
在我上面的例子中。
当我尝试制作 exampleType
时通用:
type Path<T> = Join<PathsToStringProps<T>, ".">
我收到此错误:Excessive stack depth comparing types 'PathsToStringProps<T>' and 'string[]'.ts(2321)
我能够通过指定 T 必须代表一个键值对象来解决这个问题:
type Path<T extends {[key: string]: any}> = Join<PathsToStringProps<T>, ".">
继续将值的类型限制为路径指向:
type PathsToStringProps<T, V> = T extends (V) ? [] : {
[K in Extract<keyof T, string>]: [K, ...PathsToStringProps<T[K], V>]
}[Extract<keyof T, string>];
type Join<T extends string[], D extends string> =
T extends [] ? never :
T extends [infer F] ? F :
T extends [infer F, ...infer R] ?
F extends string ?
`${F}${D}${Join<Extract<R, string[]>, D>}` : never : string;
type Path<T extends {[key: string]: any}, V> = Join<PathsToStringProps<T, V>, ".">
但是我得到一个错误:
如果我从 Path
中删除通用参数 V,它就会消失, 但保留在 PathsToStringProps
中:
type Path<T extends {[key: string]: any}> = Join<PathsToStringProps<T, string|Date>, ".">
Here's a TypeScript Playground of my final attempt at getting this to work.
最佳答案
您的方法,其中PathsToProps<T, V>
生成路径为 tuples ,然后在哪里 Join<T, D>
连接元组元素以形成虚线路径,对编译器来说是有问题的,因为 PathToProps<T, V>
和 Join<T, D>
是recursive conditional types ,它们的组合并不总是很好,并且经常与循环守卫或性能问题发生冲突。也许您可以调整一些东西以使其正常工作,但这不是我的第一选择。
相反,由于您似乎根本不关心元组,您可以直接在 PathsToProps<T, V>
中连接字符串。 .换句话说,您不是先构建路径然后再连接它们,而是在整个过程中连接。
它可能看起来像这样:
type PathsToProps<T, V> = T extends V ? "" : {
[K in Extract<keyof T, string>]: Dot<K, PathsToProps<T[K], V>>
}[Extract<keyof T, string>];
type Dot<T extends string, U extends string> =
"" extends U ? T : `${T}.${U}`
执行PathsToProps
与您的非常相似,除了不是显式处理空元组 []
并通过 [K, ...PathsToProps<T[K], V>>]
添加到元组中,我们明确使用空字符串 ""
并通过 Dot<K, PathsToProps<T[K], V>
连接它们.
Dot<T, U>
type 只是连接字符串的简写 T
用一个已经点缀的字符串 U
.除非U
,否则你在它们之间加一个点是空的(如果你有任何对象以空字符串作为键,这在技术上是错误的。你没有,是吗?我希望不是)。关键是要确保您不会以需要删除的尾随点结束(如果您总是用点连接,那么您会得到类似 "foo.bar.baz."
的路径)。
让我们测试一下:
type ExampleType = {
propertyOne: string
propertyTwo: number,
propertyThree: {
propertyFour: string,
propertyFive: Date,
propertySix: boolean,
}
}
type StrOrDateEx = PathsToProps<ExampleType, string | Date>
// type StrOrDateEx = "propertyOne" | "propertyThree.propertyFour" |
// "propertyThree.propertyFive"
看起来不错!并且没有递归警告。
关于属于特定值属性的嵌套泛型类型的 typescript 字符串点表示法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73159893/
如果有一张有客户的 table 和一张有地址的 table 。 一位客户必须(仅)有一个地址,但地址不必有客户(取决于字段类型)。所以我只是问如何告诉cake在寻找客户时获取客户地址,但在寻找地址时不
我有一个问题,我需要获取我的画廊表的所有图像(路径),该表拥有博物馆和拥有博物馆的用户。我得到了图像的路径,但这些与拥有博物馆的 user_id 没有关联。 所以简短的描述: 每个用户拥有一个博物馆,
我有一个问题,我需要获取我的画廊表的所有图像(路径),该表拥有博物馆和拥有博物馆的用户。我得到了图像的路径,但这些与拥有博物馆的 user_id 没有关联。 所以简短的描述: 每个用户拥有一个博物馆,
我有用户和个人资料(一对一属于用户) type User struct { ID int Username string Password string
我想以类似于'belongs to' association的方式使用GORM的Django's one-to-one relationships。考虑以下示例,其中每个User与一个Profile相
长期从事 Rails 开发, Backbone 菜鸟。 在我的 Rails 模型中,一个项目有很多任务,一个任务属于一个项目......标准的东西。 尝试在集合中获取项目的任务 json。 Examp
让我们直奔问题(使用 Grails 1.1.1,它应该适用于以前的问题) 我有 2 个域,即:用户和详细信息,如下所示: Class User { String userName ; ..
我正在尝试在 Rails 中设置模型关系,并且需要您的帮助,因为它不起作用:0 class User :creator_id end 就架构而言,request_threads表具有creator_
注意:我在编写问题时解决了问题,因此不需要答案。仍然与答案分享,以便有相同经历的人可以从中受益。 我有一个回收器 View ,其中包含图像和 2 个 TextView 。我想在单击图像时旋转图像,但发
我正在尝试为我的应用程序中的所有按钮添加自定义点击声音。我已经为 UIButton 创建了一个类类别,其中包含以下代码: NSURL *soundURL = [NSURL fileURLWithPat
我有这样一个IP:12.12.12.12 我正在遍历不同的 IP 范围(12.12.12.0/24(示例))格式,并尝试查看 IP 是否在该范围内。 我尝试了各种方法,例如 inet_addr 和比较
看完这个问题 ASP.NET MVC: Nesting ViewModels within each other, antipattern or no? 和 Derick Bailey 的评论 i t
我正在使用 FeedWordPress 从子公司网页将新闻导入母公司的新闻卷。 可在此处查看特定项目的 RSS 摘录:Pastebin 如您所见,我正在将我需要的图像放入 RSS 文件、描述 bloc
假设我有以下数据库架构: dogs 和 owners 与经典的 belongsToMany 相关联。 walks 表怎么样?我希望能够在这种关系中使用 Eloquent 好东西: $dogs = Do
我不知道出了什么问题,但我无法使用 :class_name 选项让belongs_to 工作。有人可以启发我。非常感谢! 这是我的代码片段。 class CreateUsers false
属于 JavaScript 对象原型(prototype)的回调函数如何访问对象成员?回调不能关闭,一切都必须定义如下: function Obji(param){ this.element =
有人可以解释一下 MarkupCompilePass1 和 PartialClassGenerationTask 这两个构建任务是如何归属在一起的吗?目前我不知道他们是否共存或者是否需要对方。有人可以
现在,我尝试了解 Grails 域类和 GORM 中的工作原理。所以,我尝试实验: 我试验了两个域类:Main 和 Sub。 我们走吧! 第 1 步: class Main { String
所以我有一个模型 App.DailyEntry = DS.Model.extend({ user_id: belongsTo('user'), entries: hasMany('En
我正在使用 primeng 组件选项卡菜单。 https://www.primefaces.org/primeng/#/tabmenu我找不到将所选 TAB 的颜色更改为不同颜色的方法。 最佳答案 抱
我是一名优秀的程序员,十分优秀!