typescript 单个键值对的类型是什么?

vpfxa7rd  于 2022-12-14  发布在  TypeScript
关注(0)|答案(1)|浏览(124)

在TypeScript中,我知道如何声明多个键-值对对象

{ [key: string]: any }

如何声明单个键值对?
我希望支持的特定用例是一个prop,它可以是string数组,也可以是单个密钥对对象。
例如:

const searchArray = [
  'name', 
  {stats: 'resolution'},
  'uptime',
  {config: 'interface'},
];

一开始我以为解决办法很简单
Record<string,string>
所以searchArray的最终声明是

interface Props {
  (...)
  searchArray: (string | Record<string,string>)[],
}

但是我希望它拒绝这个,因为我在一个对象中发送了两个密钥对,但是它接受了。

searchArray={[
 'name',
 'bitrate',
 {stats:'resolution', stats:'frameRate'}
]}

每个对象只接受一个密钥对。

searchArray={[
 'name',
 'bitrate',
 {stats:'resolution'}, 
 {stats:'frameRate'}
]}

谢谢你!

wqsoz72f

wqsoz72f1#

AFAIK没有办法将string索引类型限制为只有一个属性条目,但这里有两个替代建议:
1.使用元组:
TSPlayground

type Entry<Key extends PropertyKey, Value> = [Key, Value];

const searchArray = [
  'name', 
  ['stats', 'resolution'],
  'uptime',
  ['config', 'interface'],
] satisfies (string | Entry<string, string>)[];

1.或者-稍微详细一点(但可能更清楚,取决于您的观点)-使用具有keyvalue属性的对象类型:
TSPlayground

type Entry<Key extends PropertyKey, Value> = {
  key: Key;
  value: Value;
};

const searchArray = [
  'name', 
  { key: 'stats', value: 'resolution' },
  'uptime',
  { key: 'config', value: 'interface' },
] satisfies (string | Entry<string, string>)[];

另请参阅:TS手册中的泛型

相关问题