gpt4 book ai didi

TypeScript:在对象上强制执行单个动态键

转载 作者:行者123 更新时间:2023-12-04 02:52:07 24 4
gpt4 key购买 nike

有没有办法为具有单个动态命名键的对象编写接口(interface)?

我能够编写一个接受任意数量的动态命名键的接口(interface),但我想将其限制为一个。

让我们从一些基础开始,逐步解决我的问题。在下面的界面中,对象只能有一个键,它被命名为“id”:

interface Test {
id: string
}

这很好,因为具有此接口(interface)的对象只能具有一个属性 id .但我需要消费者能够指定这个键的名称。

如果我将该接口(interface)更改为以下内容,则它允许使用者指定自定义键:
type Test<K extends string> = {
[P in K]: string
}

正如我们在这个例子中看到的那样,这让我更接近我正在寻找的东西:
type SpecificTest = Test<"customId">;

const test:SpecificTest = {
customId: 'pls',
}

但是,用户可以传递联合类型来定义多个 ID 字段,这就是出错的地方。
// I don't want a user to be able to pass multiple strings here
type SpecificTest = Test<"customId"|"anotherId">;

const test:SpecificTest = {
customId: 'pls',

// :(
anotherId: 'blah'
}

我在想这些方面的东西可能会奏效(在伪代码中):
type Test<K extends string> = {
[K]: string
}

但该特定语法不起作用。

有没有办法定义一个用户只能定义一个动态命名键的界面?

最佳答案

可以通过 IsUnion 检测传递的类型是否为联合。辅助类型

type Test<K extends string> = IsUnion<K> extends true ? Error<'Please don\'t pass a union'>  : {
[P in K]: string
}

interface Error<M> {msg: M}

关于TypeScript:在对象上强制执行单个动态键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54587232/

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