如何定义支持任意属性且值均为boolean的TypeScript泛型interface
错误原因
你之前的写法中,直接将T作为固定属性名声明,没有将泛型参数用到类型逻辑中,所以会触发T 定义但未使用的报错,该写法只能声明一个键名为T、值为boolean的固定结构,无法实现任意属性的需求。
实现方案
方案1:无泛型索引签名(适配你的需求,不限定属性名范围)
如果不需要限制属性名的范围,只要求所有属性值为boolean,直接使用索引签名即可:
export interface BooleansMap { // 键名可以是任意字符串/数字/symbol,根据你的需要调整索引类型 [key: string]: boolean }
你给出的两个示例对象都可以直接匹配该类型:
// 合法 const map1: BooleansMap = { foo: false, bar: true, baz: false } // 合法 const map2: BooleansMap = { foo: true }
方案2:带泛型的索引签名(限定属性名范围)
如果需要将属性名限定为指定的联合类型,可以使用映射类型的泛型写法:
// 泛型 T 约束为合法的对象键类型 export interface BooleansMap<T extends string | number | symbol> { [key in T]: boolean }
使用示例:
// 限定只能有 foo、bar 两个属性 type MyMap = BooleansMap<'foo' | 'bar'> // 合法 const map: MyMap = { foo: true, bar: false } // 报错:不存在baz属性 const wrongMap: MyMap = { foo: true, baz: false }
内容的提问来源于stack exchange,提问作者HelloWorld
相关产品推荐
相关产品推荐

