TypeScript如何实现泛型接口FlagPositions,将原接口属性类型转为number
实现方案
你已经写出的映射类型是该场景下的标准实现,TypeScript 语法不支持用 interface 实现这类通用动态属性映射的泛型工具,这类需要遍历泛型键生成属性的场景只能用 type 类型别名定义。
可以在你的实现基础上补充泛型约束,满足「传入泛型的所有属性均为 boolean 类型」的校验要求:
// 泛型约束 F extends Record<string, boolean> 会校验传入的类型是否符合所有属性为boolean的要求 type FlagPositions<F extends Record<string, boolean>> = { [K in keyof Required<F>]: number; };
代码说明
extends Record<string, boolean>:泛型约束,如果你传入不符合「所有属性都是boolean」要求的接口,TypeScript 会直接抛出类型错误,符合你的入参校验需求Required<F>:处理原接口存在可选属性的场景,保证生成的FlagPositions类型的所有属性都是必选的。如果不需要这个特性,直接简化为[K in keyof F]: number即可。
为什么不能用interface实现
interface 只能定义固定结构的类型,不支持遍历泛型的键动态生成属性。如果用interface写只能针对单个固定接口写死结构,无法做到接收任意符合要求的泛型参数的通用效果,比如针对你例子里的UserFlags,用interface只能写成固定结构,不具备通用性:
// 仅适配UserFlags,不是通用泛型工具,不符合需求 interface FlagPositionsForUser { isDev: number; isAdmin: number; isMod: number; }
内容的提问来源于stack exchange,提问作者user16238654
相关产品推荐
相关产品推荐

