TypeScript中如何基于指定类型定义限定键范围的interface接口
你之前的写法存在问题的核心原因是:keyof 运算符用于获取对象类型的键集合,而FruitTypes本身就是字符串字面量联合类型,不需要用keyof包裹,直接将它作为键的类型即可。
方案1:使用内置Record工具类型(推荐)
Record是TS官方提供的内置工具类型,专门用于快速构造「指定键类型、指定值类型」的对象类型,写法最简单:
type FruitTypes = "bananna" | "apple" | "orange"; // 定义键为FruitTypes成员、值为任意类型的对象类型 type FruitInterface = Record<FruitTypes, any>;
如果允许部分FruitTypes的键不出现,可以在外层套Partial工具类型:
type FruitInterface = Partial<Record<FruitTypes, any>>;
方案2:使用interface定义(TS 4.4及以上版本支持)
如果必须使用interface语法而非type定义,可以直接在映射索引中使用联合类型:
type FruitTypes = "bananna" | "apple" | "orange"; interface FruitInterface { [key in FruitTypes]: any }
以上两种写法都可以达到你要的校验效果:不在FruitTypes里的键(比如示例中的mango)会直接抛出类型错误。
注意:你示例中的FruitTypes里写的appple (多了一个p、末尾带空格)和实际对象里的apple拼写不一致,会导致额外的类型错误,需要先修正拼写问题。
内容的提问来源于stack exchange,提问作者Fernando lugo
相关产品推荐
相关产品推荐

