【发布时间】:2022-02-21 08:51:08
【问题描述】:
去年Sam Stephenson(前 Basecamp/HEY)发布了一个very interesting tweet,关于他正在研究的stimulus js 库的一些发展,不幸的是,由于最近的basecamp fallout events,它从未见识过。
使用 TypeScript 模板文字类型 ????。 这是一个示例,展示了我们如何映射刺激控制器的
static targets = [...]数组到所有的接口 生成的属性:
我最近一直在研究一些 Typescript,并试图破译那条特定的推文,但它似乎超出了我目前的理解水平。我在上一篇文章中已经尝试了解NamedPropertytypehere,但我仍然很困惑。
那么,谁能给我解释一下下面的代码?
type NamedProperty<Name extends string, T>
= { [_ in 0 as Name]: T }
type UnionToIntersection<T>
= (T extends any ? (x: T) => any : never) extends (x: infer R) => any ? R : never
type ValueOf<T>
= T[keyof T]
type TargetPropertyGroup<Name extends string>
= NamedProperty<`has${Capitalize<Name>}Target`, boolean>
& NamedProperty<`${Name}Target`, Element>
& NamedProperty<`${Name}Targets`, Element[]>
// This type troubles me the most
type TargetProperties<Names extends string[]>
= UnionToIntersection<ValueOf<{ [Name in Names[number]]: TargetPropertyGroup<Name> }>>
let controller!: TargetProperties<[ "form", "input", "result"]>
// Magical autocomplete happens here just after the dot!
let result = controller.
提前致谢!
【问题讨论】:
标签: typescript template-literals mapped-types