gpt4 book ai didi

javascript - 如何强制对象具有以 Typescript 中的联合类型命名的属性?

转载 作者:行者123 更新时间:2023-12-05 04:25:56 24 4
gpt4 key购买 nike

我定义了以下类型

type MyUnionType = "propA" | "propB"
type MyType = {
myProp: MyUnionType
}

type SomeOtherType = MyType & { ... /* other props*/ ... }

现在,我想通过以下方式增强 MyType

type MyType = {
myProp: MyUnionType,
[key in MyUnionType]: any // pseudo code
}

这样我就可以这样使用了

const obj: SomeOtherType = {
myProp: "propA",
propA: "some value" // if this is missing, compiler will error
[...] // some other props
}

我试了一下,在网上搜索了一下,但没有找到任何解决方案。

编辑:我刚刚根据要求从 MyUnionType 中删除了 string

最佳答案

为此,您希望 MyType 成为 union type 等同于:

type MyType = {myProp: "propA", propA: any} | {myProp: "probB", propB: any}

这有以下理想的行为:

const goodObjA: MyType = {
myProp: "propA",
propA: "some value"
} // okay

const badObjA: MyType = { // error! Property propA is missing
myProp: "propA",
}

const goodObjB: MyType = {
myProp: "propB",
propB: "some value"
} // okay

const badObjB: MyType = {
myProp: "propB",
propA: "oops" // error, unexpected property
}

所以现在唯一的问题是如何从 MyType 以编程方式生成 MyUnionType 。从概念上讲,我们希望获取 K 联合中的每个成员 MyUnionType,并生成一个新的 { myProp: K } & { [P in K]: any } 联合(它具有类型为 myPropK 属性,以及类型为 K 的键控属性 any 。也就是说,我们想要分发 type F<K> = { myProp: K} & { [P in K]: any } 联合的 MyUnionType 操作。

这可以通过几种方式完成,但我的方法是制作所谓的分布式对象类型,如 microsoft/TypeScript#47109 中创造的那样。这个想法是,你在 K 中的每个 MyUnionType 上创建一个 mapped type,然后立即将 index into itMyUnionType 相结合,产生所需的并集:

type MyType = { [K in MyUnionType]:
{ myProp: K } & { [P in K]: any }
}[MyUnionType]

计算结果为

type MyType = 
({ myProp: "propA"; } & { propA: any; }) |
({ myProp: "propB"; } & { propB: any; });

相当于我们想要的类型。

Playground link to code

关于javascript - 如何强制对象具有以 Typescript 中的联合类型命名的属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73124047/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com