如何在TypeScript中声明仅含单个键值对的类型?
解决TypeScript中单键值对对象的类型声明问题
要实现仅允许单个键值对的对象类型,你可以通过映射类型+联合类型的方式来定义,具体方案如下:
定义单键值对对象类型
先声明一个SingleKeyValuePair类型,它会生成所有仅含单个字符串键、值为string的对象类型的联合:
type SingleKeyValuePair = { [K in string]: { [key in K]: string } }[string];
应用到Props的数组中
然后把你的searchArray类型指定为string和这个单键对象类型的数组:
interface Props { // 其他属性... searchArray: (string | SingleKeyValuePair)[]; }
验证效果
这样定义后,符合要求的数组会正常通过类型检查:
const validSearchArray: Props['searchArray'] = [ 'name', {stats: 'resolution'}, 'uptime', {config: 'interface'}, ];
而包含多个键值对的对象会直接触发类型错误:
// 下面这行代码会报错,因为对象有两个键,不符合SingleKeyValuePair类型 const invalidSearchArray: Props['searchArray'] = [ {stats: 'resolution', config: 'interface'} ];
原理说明
这个类型的核心逻辑是:
- 通过
[K in string]遍历所有可能的字符串键名K - 为每个
K生成仅包含该键的对象类型{ [key in K]: string } - 最后用
[string]索引整个映射类型,得到所有单键对象类型的联合类型 - 多键对象无法匹配联合类型中的任何成员,因此会被TypeScript拦截
可选:限制键的可选范围
如果你希望对象的键只能是特定的几个值(比如只能是stats或config),可以把string换成具体的联合类型:
type AllowedKeys = 'stats' | 'config'; type SingleKeyValuePair = { [K in AllowedKeys]: { [key in K]: string } }[AllowedKeys];
这样就能进一步约束键的可选值,让类型检查更严格。
内容的提问来源于stack exchange,提问作者the constant gardener
相关产品推荐
相关产品推荐

